2

私が取り組んでいるソフトウェアのアーキテクチャについていくつか質問があります!

したがって、基本的に、このソフトウェアを使用すると、ユーザーはいくつかの人気のあるサイトにアクセスできます。

  • ソーシャルネットワーク(Facebook、MySpace、...)、
  • 一般的なサービス(RSS、メール、Twitter ...)、
  • ソーシャルブックマーク(Digg、Delicious ...)、
  • チャット(MSN、AOL ...)、
  • ..。

現在、アーキテクチャは次のように なっています。モデル(TApp_Core)とユーザーインターフェイス間の相互作用にMVCとObserver/Observableデザインパターンを使用しています。

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);)。

いくつかの質問 !

  • 現在のソフトウェア設計は正しいと思いますか?
  • 現在、すべてのソフトウェアに対して1つのスレッドしかありません...サービスへの要求ごとに新しいスレッドを作成する方がよいでしょうか?(たとえば、TDiggはボタンからメッセージを受信し、TidHTTPを作成し、サーバーへの要求を生成し、応答を待機し、応答を解析し、各オブザーバーにメッセージを送信し(コールバック)、解放するスレッドを作成します。スレッド。
  • すべてのビュー/コントローラーをモデルの各部分にリンクするのは非常に難しいようですが、通常は非常に多くの作業が必要ですか?例:たとえばTwitterで使用してメッセージを送信するには、次のことが必要になります。
    • コントローラ(ボタン)をTApp_Core.TMicrobloggingServices_Core.TTwiterオブジェクト(モデル)に接続します
    • ユーザーがボタンをクリックするのを待ちます
    • TTwiter(モデル)にメッセージを送信する
    • サーバーにリクエストを送信するスレッドを作成します
    • サーバーからの応答を解析します
    • コールバックを実行して、リクエストが実行されたことを通知し、結果を出します
    • スレッドを解放します
  • 前のアイデアを使用すると、スレッドが多すぎてコンピューターの速度が低下し、責任が減りませんか?ただし、スレッドプールを実装する場合(ただし、使用するのは非常に複雑です)。
  • SQLite 3は、すべてのデータをクライアントに保存するのに十分ですか?(データはメール、RSSフィードなどである可能性があるため、時間の経過とともに非常に多くのデータになる可能性があります)。

私の悪い英語をありがとうそしてごめんなさい!

4

3 に答える 3

4

現在のソフトウェア設計は正しいと思いますか?

客観的に「正しい」設計はおそらくありません。より良いまたはより悪い設計しかありません。:) 正しい方向に進んでいるように見えますが、GUI とビューをバックエンド サービスから切り離しておくことをお勧めします。例えば:

     View --- Controller --- Service

したがって、Viewのみがレンダリング方法 (つまり、IM メッセージ、Web コンテンツなど) を知っており、ユーザーからの要求を に渡しますController。はControllerから通知を受け取りService、 を更新しますView。はServiceフロントエンドについて何も知らず (スクリプト可能であり、非常に便利です)、ネットワーク サービスと通信するために必要なプロトコルを実装するだけです。個別のバックエンド システムごとにこれら 3 つのクラスの個別のセットと、アプリをグローバル レベルで管理するための全体的なコントローラーを用意します。

すべての View/Controller をモデルの各パーツにリンクするのは非常に難しいようですが、これほど多くの作業が必要になるのは普通のことですか?

おそらく、そうです - あなたは重要なアプリケーションを試みています。MVC スタイルのアーキテクチャを使用していると思います。物事を適切に分離するには、前もってより多くの作業が必要になる場合がありますが、それだけの価値があることは間違いありません。アプリケーションが複雑になればなるほど、レイヤー化とデカップリングのメリットが大きくなります。

サービスへのリクエストごとに新しいスレッドを作成する方がよいでしょうか?

すべてのサービスがネットワークベースであることを考えると、ブロッキング I/O 呼び出し (ソケット読み取りなど) がメイン GUI スレッドをブロックしないようにする必要があります。そのため、1 つのスレッドでコールバックを使用して完全に非同期の I/O を使用する (あまり一般的ではありません) か、ネットワーク セッションごとに個別のスレッドを使用する (最も一般的な方法) 必要があります。個別のリクエストごとに新しいスレッドを生成することはお勧めしませんが、セッション全体に対してです。競合状態やデッドロックなど、通常のスレッドの問題を回避するように注意する必要があります (このトピックは本をいっぱいにする可能性があります)。別のスレッドのコンテキストから GUI を更新することはできないため、スレッドは通知のためにメッセージを GUI にポストする必要があります。

(たとえば、TDigg はボタンからメッセージを受信し、TidHTTP を作成し、サーバーへの要求を生成し、応答を待機し、応答を解析し、各オブザーバーにメッセージを送信 (コールバック) して解放するスレッドを作成します。スレッド。

GUI がコントローラーとプロトコル ハンドラーに結合されているようです。フロントエンドとバックエンドを分離し、分離しておくことをお勧めします。

前のアイデアを使用すると、スレッドが作成されすぎて、コンピューターが遅くなり、責任がなくなりませんか?

スレッドは通常、コンピューター応答性を高めるために使用されます。スレッドの作成には一定のオーバーヘッドがあり、適切に同期するには細心の注意が必要です。しかし、ネットワーク セッションごとに 1 つのスレッドを使用する場合、多くてもほんの一握りしかないため、オーバーヘッドによって速度が低下することはありません。

SQLite 3 は、すべてのデータをクライアントに保存するのに十分ですか? (データはメール、RSS フィードなどである可能性があるため、時間とともにかなりの量のデータになる可能性があります)。

SQLite は、この目的のための優れたデータベースです。これは、クライアント側のストレージ管理のために、世界最大のソフトウェア ハウスの一部で使用されています。それは非常に高速で効率的であり、あなたのアプリケーションに追いつくことができると確信しています.

複雑な申請を行っているようです。並行プログラミングに関する本を購入し、スレッドについてもう少し読むことをお勧めします。これは非常に複雑な問題であり、細心の注意を払ってプログラムしないと、追跡が非常に困難なバグにつながる可能性があります。幸運を!

于 2009-10-01T20:56:00.817 に答える
0

データベースから抽象化するには、ORM フレームワークを使用することをお勧めします。これにより、意味のあるデータ抽象化レイヤーが得られるだけでなく、データベースの選択について心配する必要がなくなります。SQLite はコンパクトなデータベースです。お試し用でもいいかもしれません。しかし、実際のマルチユーザー環境ではそれをカットすることはできません (ファイルレベルのロックがあり、意味のある規模での同時 CRUD を確実に不可能にします)。また、SQL のサブセットのみを使用します。ORM を使用すると、後で簡単に変更できます。

于 2009-10-01T20:42:02.747 に答える
-1

あなたの投稿を見て、あなたのアーキテクチャが「良い」かどうかを判断するのは難しいです。これが私が目指していることです

  • それは機能しますか?
  • それを機能させるために最小限のことをしてください。
  • 移動しながらデザインをクリーンアップします。
  • ツールを使用してデザインを視覚化します。

NDependなどのツールを使用して依存関係を視覚化することは非常に役立つことがわかりました。

于 2009-10-01T20:21:53.520 に答える