gpt4 book ai didi

delphi - 复杂的软件架构

转载 作者:行者123 更新时间:2023-12-03 18:34:37 24 4
gpt4 key购买 nike

我有几个关于我正在开发的软件架构的问题!

所以基本上,这个软件允许用户访问一些流行的网站:

  • 社交网络(Facebook、MySpace、...)、
  • 公共(public)服务(RSS、邮件、Twitter...),
  • 社交书签(Digg、Delicious...),
  • 聊天(MSN、AOL...)、
  • ...

  • 当前架构如下所示:
    使用 MVC 和 Observer/Observable 设计模式在模型(TApp_Core)和用户界面之间进行交互。
    TApp_Core
    TBookmarkingServices_Core
    TDelicious (implement IBookmarkingServices)
    TDigg (implement IBookmarkingServices)
    etc... (implement IBookmarkingServices)
    TChatServices_Core
    TMSN (implement IChatServices)
    TGoogleChat (implement IChatServices)
    TAOLChat (implement IChatServices)
    etc...
    TRSSServices_Core
    ...

    因此,软件创建了一个 TApp_Core 实例,然后根据用户的选择,它创建了一些其他服务的实例(例如:App_Core.BookmarkingServices_Core.AddServices(Digg, User, Password);)。

    一些问题 !
  • 你认为目前的软件设计是对的吗?
  • 目前所有软件只有一个线程...为每个服务请求创建一个新线程会更好吗?
    (例如,TDigg 从一个按钮接收消息,它创建一个线程,该线程将创建一个 TidHTTP,向服务器生成请求,等待响应,解析响应,向每个观察者发送消息(回调)然后释放线程。
  • 将所有 View / Controller 与模型的每个部分链接起来似乎非常困难,这是否正常需要这么多工作?
    例如:要发送一条消息,例如使用 Twitter,它需要:
  • 将 Controller (按钮)附加到 TApp_Core.TMicrobloggingServices_Core.TTwiter 对象(模型)
  • 等待用户点击按钮
  • 发消息给TTwiter(型号)
  • 创建线程将请求发送到服务器
  • 解析来自服务器的响应
  • 执行回调以通知请求已被执行并给出结果
  • 释放线程
  • 如果我使用以前的想法,它会不会创建过多的线程并使计算机变得缓慢和不负责任?除非我实现了一个线程池(但使用它非常复杂)。
  • SQLite 3 是否足以将所有数据存储在客户端上? (数据可以是邮件、RSS 提要等......所以随着时间的推移它可能是相当多的数据)。

  • 感谢和抱歉我的英语不好!

    最佳答案

    Do you think that the current software design is right ?



    可能没有客观上“正确”的设计——只有更好或更差的设计。 :) 看起来您走在正确的轨道上,但我建议您将 GUI 和 View 与后端服务分离。例如:
         View --- Controller --- Service

    所以 View只知道如何呈现事物(即 IM 消息、Web 内容或其他)并将来自用户的请求传递给 Controller . Controller接收来自 Service 的通知,并更新 View . Service对前端一无所知(因此它可以是可编写脚本的,这非常有用)并且只实现与网络服务通信所需的协议(protocol)。对于每个不同的后端系统,您将拥有一组单独的这三个类,以及一个在全局级别管理应用程序的整体 Controller 。

    It seems very hard to link all View/Controller with each part of the model, is that normal that it requires so much works ?



    可能,是的 - 您正在尝试一个重要的应用程序。我假设您使用的是 MVC 风格的架构。可能需要更多的前期工作才能正确解耦,但这绝对是值得的。您的应用程序越复杂,您就越能从分层和解耦中受益。

    Is creating a new thread for each request to a service would be better ?



    鉴于所有服务都是基于网络的,您需要防止阻塞 I/O 调用(例如套接字读取)阻塞您的主 GUI 线程。因此,您要么需要在一个线程上使用带有回调的完全异步 I/O(不是很常见),要么为每个网络 session 设置一个单独的线程(最常见的方法)。我不建议为每个单独的请求生成一个新线程,而是为整个 session 生成一个新线程。您需要小心避免常见的线程问题,例如竞争条件和死锁(这个主题可能会写满一本书)。该线程需要将消息发回 GUI 以获取通知,因为您无法从另一个线程的上下文中更新您的 GUI。

    (for example the TDigg receive a message from a button, it creates a thread which will create a TidHTTP, generate the request to the server, wait for the response, parse the response, send a message to each observer (callback) and then free the thread.



    听起来您的 GUI 与 Controller 和协议(protocol)处理程序耦合在一起。我建议你将前端和后端分开,并保持解耦。

    If I use the previous idea, won't it create too much threads and make the computer slow and less responsible ?



    线程通常用于使计算机更具响应性。创建线程有一定的开销,并且需要非常小心才能正确同步。但是如果每个网络 session 有一个线程,开销不会减慢速度,因为您最多只有少数几个。

    Does SQLite 3 is good enough to store all data on the client ? (data can be mails, rss feed, etc... so it can be quite a lot of data with times).



    SQLite 是用于此目的的优秀数据库。它被世界上一些最大的软件公司用于客户端存储管理。它非常快速和高效,我相信它能够跟上您的应用程序。

    您似乎正在执行一个复杂的应用程序。我建议你买一本关于并发编程的书,并阅读更多关于线程的内容。这是一个非常复杂的问题,如果不仔细编程,可能会导致难以追踪的错误。祝你好运!

    关于delphi - 复杂的软件架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1506212/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com