タグ付けされた質問 「architecture」

ソフトウェアシステムの高レベルの設計と説明。アーキテクチャ設計では、実装、アルゴリズム、およびデータ表現の詳細を抽出して、「ブラックボックス」コンポーネントの相互作用に集中します。

1
Consumer / ProducerとObserver / Observableの違い
私は、次の3つの部分で構成されるアプリケーションの設計に取り組んでいます。 特定のイベントの発生(ファイルの作成、外部リクエストなど)を監視する単一のスレッド これらのイベントを処理することでこれらのイベントに応答するN個のワーカースレッド(各ワーカーは単一のイベントを処理して消費し、処理に時間がかかる場合があります) これらのスレッドを管理し、エラー処理を行うコントローラー(スレッドの再起動、結果のログ記録) これは非常に基本的で実装するのは難しくありませんが、それを行うための「正しい」方法は何だろうと思っています(この具体的なケースではJavaですが、より高い抽象化の答えもありがたいです)。2つの戦略が思い浮かびます。 Observer / Observable:監視スレッドはコントローラーによって監視されます。イベントが発生した場合、コントローラーに通知され、再利用可能なキャッシュスレッドプールから新しいタスクを空きスレッドに割り当てることができます(または、すべてのスレッドが現在ビジーである場合、FIFOキューでタスクを待機してキャッシュします)。ワーカースレッドはCallableを実装し、結果(またはブール値)で成功を返すか、エラーを返します。その場合、コントローラーは何をすべきかを決定します(発生したエラーの性質に応じて)。 プロデューサー/コンシューマー:監視スレッドはコントローラーとBlockingQueueを共有し(イベントキュー)、コントローラーはすべてのワーカーと2つを共有します(タスクキューと結果キュー)。イベントの場合、監視スレッドはタスクオブジェクトをイベントキューに入れます。コントローラーは、イベントキューから新しいタスクを取得し、それらをレビューして、タスクキューに入れます。各ワーカーは新しいタスクを待機し、タスクキュー(先着順、キュー自体で管理)からそれらを取得/消費し、結果またはエラーを結果キューに戻します。最後に、コントローラーは結果キューから結果を取得し、エラーが発生した場合に対応する手順を実行できます。 両方のアプローチの最終結果は似ていますが、それぞれわずかな違いがあります。 オブザーバーを使用すると、スレッドの制御は直接行われ、各タスクは特定の新しく生成されたワーカーに割り当てられます。スレッド作成のオーバーヘッドは高くなる可能性がありますが、キャッシュされたスレッドプールのおかげではありません。一方、Observerパターンは、複数ではなく単一のObserverに縮小されます。これは、厳密に設計されたものではありません。 キュー戦略は拡張が容易なようです。たとえば、1つではなく複数のプロデューサーを追加するのは簡単で、変更を必要としません。欠点は、作業をまったく行わない場合でも、すべてのスレッドが無期限に実行され、エラー/結果の処理が最初のソリューションほど洗練されていないことです。 この状況で最もふさわしいアプローチは何ですか?その理由は?ほとんどの例は、Observerケースの新しい値で多くのウィンドウを更新したり、複数のコンシューマーとプロデューサーで処理したりするなど、明確なケースのみを扱っているため、この質問に対する答えをオンラインで見つけるのは難しいと感じました。どんな入力でも大歓迎です。

3
ほとんどのユーザーにリーチするには、デスクトップアプリケーションにどのバージョンのJavaを使用すればよいですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 ほとんどのエンドユーザーがJava 8よりも古いバージョンを使用していると想定するのは正しいですか?私のアプリケーションを使用するために人々に強制的にアップグレードさせたくないので、たとえそれが新しいバージョンの利点を自分に適用できない場合であっても、最初からJava 7または6を使用するように計画する必要があります開発者として?

4
4 + 1アーキテクチャビューモデルとUML間のマッピング
4 + 1アーキテクチャビューモデルがUMLにどのようにマッピングされるかについて、少し混乱しています。 ウィキペディアは次のマッピングを提供します。 論理ビュー:クラス図、コミュニケーション図、シーケンス図。 開発ビュー:コンポーネント図、パッケージ図 プロセスビュー:アクティビティ図 物理ビュー:展開図 シナリオ:ユースケース図 「オブジェクトライフサイクルコンセプトにおけるUMLシーケンス図の構造の役割」というペーパーは、次のマッピングを提供します。 論理ビュー(クラス図(CD)、オブジェクト図(OD)、シーケンス図(SD)、コラボレーション図(COD)、状態図図(SCD)、アクティビティ図(AD)) 開発ビュー(パッケージ図、コンポーネント図)、 プロセスビュー(ユースケース図、CD、OD、SD、COD、SCD、AD)、 物理ビュー(展開図)、および 上記の4つを組み合わせたユースケースビュー(ユースケース図、OD、SD、COD、SCD、AD)。 WebページUML 4 + 1 View Materialsは、次のマッピングを提示します。 最後に、ホワイトペーパー「UML 2で4 + 1ビューアーキテクチャを適用する」では、さらに別のマッピングを提供しています。 論理ビュークラス図、オブジェクト図、状態図、複合構造 プロセスビューシーケンス図、コミュニケーション図、アクティビティ図、タイミング図、相互作用概要図 開発ビューのコンポーネント図 物理ビュー展開図 ユースケースビュー、ユースケース図、アクティビティ図 さらに検索すると、他のマッピングも明らかになると確信しています。 通常、さまざまな人々が異なる視点を持っていますが、ここでなぜそうなのかわかりません。特に、各UML図は、特定の側面からシステムを説明しています。それで、例えば、なぜ「シーケンス図」はある著者によってシステムの「論理的見解」を記述すると見なされ、別の著者は「プロセス図」を記述すると見なされるのでしょうか? 混乱を明確にするのを手伝ってもらえますか?
15 architecture  uml  model  view 

4
MVCでは、複数のビューで同じコントローラーを使用できますか、または1つのビューで1つの一意のコントローラーを使用する必要がありますか?
MVCを中心としたプロジェクトのアーキテクチャを設計しているときに質問があります。(これはC ++ / Marmalade SDKプロジェクトです。特定のMVCフレームワークは使用していません。作成しています。) いくつかの記事(元のSteve Burbek記事など)で、「MVCトライアド」という概念を読み続けています。初めて読んだとき、アプリケーションは「MVCトライアド」ユニット(想定している各UIピースに1つ)を中心に構築されているように見えましたが、これはかなり柔軟性に欠け、MVCの使用が意図されていなかったと思います。次に、この問題をさらに調査すると、コントローラーとビューの密結合の例、つまり1対1の関係が見つかりました-TextEditViewにはTextEditControllerがあります。 しかし、プロジェクトに戻ると、(AddElementControllerのような「論理ユニット」による)1つのコントローラーと、その特定のコントローラーの複数のビューがあると便利です。 私は、何らかのタブUIが必要なAddElementControllerのようなものについて明確に考えています。AddElementTabViewとタブ用の複数のAddImageView、AddSoundViewなどを持つAddElementControllerが必要ですか?または、タブビューごとに異なる「サブコントローラー」が必要ですか? 要約すると、MVCパターン(このフレームワークのXフレームワーク固有の理解/実装ではありません)に関して、コントローラーに複数のビューがあるのは正しいですか、または各ビューに特定のコントローラーが必要ですか? また、いくつかの状態情報をコントローラーに保持するのは正しいですか、それともステートレスである必要があります(つまり、状態を非ドメイン状態モデルに配置する必要があるということですか)。 事前にすべてに感謝します。

4
Windows 8用のエンタープライズデスクトップアプリケーションを設計する方法
Windows 8向けのコンシューマアプリケーション開発の期待を把握していると思います。WinRTの上に新しいMetroベースのUIを作成し、Marketplaceを介して顧客に展開すると、誰もが勝ちます。簡単そうに思えます。残念ながら、私はそのビジネスにはいません。 私は、大企業向けの内部の基幹業務アプリケーションに取り組んでいます。現在、WebまたはClickOnceを介してユーザーに簡単に展開できるリッチUIを作成するために、WPFやSilverlightなどの.NETテクノロジーを使用しています。アプリケーションは、頭痛の種なしでWinXPとWin7をサポートでき、開発者は非常に強固なUIテクノロジーであるXAMLを使用できます。 WPFとSilverlightはこの時点で疑わしい未来を持っているように思われるので、それらに投資し続けることは少し心配です。しかし、Metro UIはエンタープライズアプリケーションに適切ではないように思われ、WinRT APIはエンタープライズアプリケーションが行う必要のある「典型的な」ことに関してかなり制限されています。 現在WinXPおよびWin7にデプロイされているXAMLベースのアプリケーションをどのように設計し、Win8でサポートおよび進化できるようにする必要がありますか? この質問の目的のために、ASP.NETの上にあるHTML5によって提供される機能は、私が作成しようとしているアプリケーションには不十分であると仮定します。一部のアプリケーションでHTML5を使用できることは理解していますが、それでは不十分な場合に何をすべきかを考えています。 編集#1: これは、@ Emmad Kareemのコメントへの応答です。Silverlight / WPFは短期(2〜5年)で実行可能であることに同意します。ただし、私たちが作成するアプリケーションの寿命は非常に長い可能性があります(10〜20年以上)。そのため、特定のテクノロジーの長期的な存続可能性が私たちの懸念事項です。また、Silverlight / WPF開発に関心のある開発者がコミュニティによって「死んだ」と見なされると、それらの開発者を見つけることがますます困難になるという懸念があります。私は自分の選択肢を理解し、目を開けて決断をしたいだけです。

3
名前空間とクラス名のガイドライン
utilsやその他のヘルプクラスが関係しているときに、クラスとサービスの名前を正しく指定できません。 以下をどのように構成しますか? EventService.cs EventServiceUtils.cs EventServiceValidators.cs EventServiceCoordinator.cs 等... 上記のサービスと同じニーズを持つ複数のサービスがあります。1つの考えは、このすべてを適切なネームスペースに分けて、次のように見えるようにすることです。 Services.EventService.EventService.cs //(the actual service) Services.EventService.Validators.DateValidator.cs Services.EventService.Validators.ParticipantValidator.cs Services.EventService.Coordinators.ParticipantCoordinator.cs Services.EventService.ExtensionMethods.Extensions.cs 等々。もちろん、すべての名前空間は個別のフォルダーです。しかしDateValidators、他のサービスにはおそらくもっと多くのものがあるため、これは100%ではありません。 またServices.EventService.EventService.cs、名前空間にクラス名が含まれていますが、これも良くありません。を使用できますServices.Event.EventService.csが、もちろんその名前のエンティティは既に存在します。 これがドメインモデルです。
15 c#  architecture 

1
「カオスモンキー」を実装し、効果的に対応する例はありますか?
Jeff Atwoodは最近、Netflixの「Chaos Monkey」の実装に関するブログ投稿を書きました。非常に高レベルの記事です。システムをテストするためにこの手法を実際に実装した人がいるかどうかは興味があります。 私が本当に求めていることは、システムがクラッシュする部分をアーキテクチャが生き残ることができるようにするために、どのような戦略を実装していますか?

5
厳密なTDDとDDDを組み合わせる方法
TDDは、テストによって導かれるコードの設計に関するものです。 したがって、通常、典型的なレイヤーは事前に構築されていません。それらはリファクタリング手順でわずかに表示されるはずです。 ドメイン駆動型設計には、アプリケーション層、インフラストラクチャ層、ドメイン層、永続層などの十分に確立された層を定義する多くの技術的パターンが含まれます。 DDDプロジェクトのコーディング部分をゼロから開始するには、どのように動作するのですか? DDDの技術的なパターンに適合するために、設計をテストから厳密に浮かび上がらせる必要がありますか? または、それらの空のレイヤー(アプリケーション、エンティティ/ドメインサービス、インフラストラクチャ)を作成し、TDDをそれぞれに個別に適合させる必要があります(モックを使用してレイヤー間を分離します)。

4
依存関係注入で「循環依存関係」を処理する方法
タイトルには「Circular Dependency」と書かれていますが、それは正しい表現ではありません。私にはデザインがしっかりしているように見えるからです。 ただし、次のシナリオを検討してください。青い部分は外部パートナーから提供され、オレンジは私自身の実装です。またConcreteMain、複数あると仮定しますが、特定のものを使用したいと思います。(実際には、各クラスにはさらにいくつかの依存関係がありますが、ここでは単純化しようとしました) すべてをDepency Injection(Unity)でStackOverflowExceptionインスタンス化したいのですが、明らかに次のコードを取得します。これは、RunnerがConcreteMainのインスタンス化を試行し、ConcreteMainにはRunnerが必要だからです。 IUnityContainer ioc = new UnityContainer(); ioc.RegisterType<IMain, ConcreteMain>() .RegisterType<IMainCallback, Runner>(); var runner = ioc.Resolve<Runner>(); どうすればこれを回避できますか?これをDIで使用できるように構成する方法はありますか?私が今しているシナリオは、すべてを手動で設定することですが、ConcreteMainそれをインスタンス化するクラスに強い依存関係を置きます。これは私が回避しようとしているものです(構成にUnityの登録がある場合)。 以下のすべてのソースコード(非常に単純化された例!); public class Program { public static void Main(string[] args) { IUnityContainer ioc = new UnityContainer(); ioc.RegisterType<IMain, ConcreteMain>() .RegisterType<IMainCallback, Runner>(); var runner = ioc.Resolve<Runner>(); Console.WriteLine("invoking runner..."); runner.DoSomethingAwesome(); Console.ReadLine(); } } public …

3
MVVMの明確化
最初のWPFアプリケーションを作成しようとしており、MVVMパターンに精通しています。私たちは多くのWinformアプリケーションを構築しており、非常に成功したアーキテクチャを持っています。そのアーキテクチャを翻訳したり、アーキテクチャの特定の部分がMVVMモデルに適合する場所を決定したりするのに少し苦労しています。 歴史的には、BusinessLogic dllと通信するGui(メインexe)があります。BusinessLogicはWebサービスを介してDAL dllと通信し、DALはDBと対話します。DAL、BusinessLogic、およびGUIはすべて同じBusinessObjects dllを参照します。 MVVMへの移行の一部はかなり単純です。Guiにはビューが含まれ、BusinessOjbectsにはモデルが含まれ、DALはDBと対話します(ただし、それらを実装するテクノロジーは変更される可能性があります)。 わからないのは、BusinessLogicコンポーネントです。歴史的には、これはビューのコントロールを呼び出すためにGUIに呼び出す関数を提供していました(つまり、Customerオブジェクトのリストまたは典型的なCRUD関数を返すGetCustomerList)。 主な問題は、MVVMパターンがViewModelを格納するために追加のコンポーネントを必要とするのか、単に考え方を変えてBusinessLogicコンポーネントとして使用したものをViewModelに移行するだけなのか、ということです。 BusinessLogicコンポーネントはViewModelを表しますか?

5
結合を増加させずにDRYを適用することは可能ですか?
関数Fを実装するソフトウェアモジュールAがあるとします。別のモジュールBは、F 'と同じ関数を実装します。 重複するコードを取り除くには、いくつかの方法があります。 AにBのF 'を使用させます。 BにAのFを使用させます。 Fを独自のモジュールCに入れ、AとBの両方に使用させます。 これらのオプションはすべて、モジュール間に追加の依存関係を生成します。カップリングを増加させる代わりに、DRY原則を適用します。 私が見る限り、DRYを適用すると、カップリングは常に増加するか、リースでより高いレベルに移動します。ソフトウェア設計の最も基本的な2つの原則の間には矛盾があるようです。 (実際、そのような競合があることは驚くことではありません。これはおそらく、優れたソフトウェア設計をそれほど難しくしていることです。これらの競合は通常、入門書では扱われていません。 編集(明確化のため):FとF 'の等価性は単なる偶然ではないと思います。Fを変更する必要がある場合、F 'も同様に変更する必要があります。

4
ソフトウェアアーキテクチャは言語にどの程度依存していますか?
ソフトウェアアーキテクチャと設計パターンについて自分自身を教育していると、ほとんどの場合、言語の機能と設計の詳細が説明に含まれていることに気付きました。 例えば、それに関する実際の記事や本は、クラスとインターフェースを使用してアイデアを説明します。このトピックで簡単に見つけられるものはすべて、オブジェクトとOOPの概念に言及しています。 システムが記述されている言語にそのような概念がまったくない場合はどうなりますか?たとえば、動的に型付けされ、インターフェイスの概念がないPythonまたはNodeを使用した場合はどうなりますか?インターフェイスが一時的な構成要素であり、ランタイムには存在しないTypeScriptを使用するとどうなりますか?関数型プログラミングを採用しようとしている場合はどうなりますか?たとえばSOLIDを無視して、自分の言語に適した他の概念を探す必要がありますか? はいの場合、それらは何ですか?残念ながら、よく採用されているすべてのパラダイム(私が知る限り)は、何らかの形でOOPの概念と型を参照しています。いいえの場合、一般的なアーキテクチャと設計の原則を特定の言語とユースケースに適合させるとき、どの規則に従う必要がありますか? 一般的に、アーキテクチャと言語の依存関係をどのように説明しますか?

1
同僚が極端な複雑さと抽象化を持ち込むのを防ぐ方法は?
私の同僚が展示しているように見えるので、私は非常に困難な時間を過ごしています 早すぎる/不要な最適化の取り組み 疑わしい抽象化を伴う早期重複排除 たとえば、変更されたVIPERアーキテクチャを使用します。彼は、他のルーターで何が複製されるかを実際に知らずに、最初のviperスタックを実装する一環として、ルーターコンポーネントの基本クラスを(ジェネリックを使用して)導入しました。現在UseCase、ユースケースを保持するタイプを提供する必要がありますが、ほとんどのルーターには複数のユースケースはなく、1つだけです。 将来の投機的な機能の ための汎用ソリューションの考案たとえば、アプリ内にこのような画面が2つしかない場合、静的なセルテーブルビューを作成するためのマネージャーを作成しました。 UIなので、マネージャーは役に立たない。 偶発的な複雑さの選択 ひどい英語で言葉の壁があることを示しているとき、どうやってこれと戦うのですか?

7
クライアントアプリケーションからユーザー認証を設計する方法は?
私は多くのユーザーをサポートするアプリケーションを開発しています。問題は、クライアント/ユーザーを認証する方法がわからないことです。 私はhttp://quickblox.com/のようなアプリを構築しています。そこでユーザーに資格情報を提供し、ユーザーはそれらを使用してユーザー名とパスワードを入れて認証を取得できないNアプリケーションを構築します。 それが次のようになると仮定しましょう。(QuickBloxと同じように) 1.ユーザーが私のWebサイトでアカウントを作成します。 2.ユーザーはN個のAPIキーを作成し、資格情報を秘密にすることができます。(複数のアプリの場合) 3.ユーザーは、アプリケーション(Android、iOS、Javascriptなど)でこれらの資格情報を使用して、REST APIと通信します。(REST APIには読み取りおよび書き込みアクセスがあります。) 私の懸念? ユーザーは自分が作成したアプリケーションに資格情報(APIキーと秘密キー)を入れます。誰かがこれらのキーを取得して、ユーザーをまねようとするとどうなりますか?(APKを逆コンパイルするか、JavaScriptコードを直接調べます。 どこか間違ってる?この3つのレベルのユーザーメカニズムを設計するのは混乱しています。

6
オブジェクト指向のプラクティスを広める方法に関するヒント[非公開]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新することがありますので、上のトピックソフトウェア工学スタックExchange用。 4年前に閉鎖されました。 私は約250人の開発者がいる中規模の会社で働いています。残念ながら、それらの多くは手続き型の考え方に固執しており、実際にはアプリケーションに豊富なロジックが含まれている場合でも、一部のチームは大きなトランザクションスクリプトアプリケーションを常に提供しています。また、設計の依存関係を管理できず、最終的に別の多数のサービスに依存するサービスになります(クリーンな例 Big Ball of Mudの)。 私の質問は、この種の知識を広める方法を提案できますか? 問題の表面は、これらのアプリケーションのアーキテクチャと設計が貧弱であることです。別の問題は、あらゆる種類のテストの作成に反対する開発者がいることです。 これを変更するために私がやっていること(しかし、私は失敗しているか、変更が小さすぎます) 設計原則(SOLID、クリーンコードなど)に関するプレゼンテーションの実行。 TDDおよびBDDに関するワークショップ。 コーチングチーム(これには、ソナー、findbugs、jdependおよびその他のツールの使用が含まれます)。 IDEとリファクタリングの話。 私が将来することを考えているいくつかのこと(しかし、それらは良くないかもしれないと心配です) オブジェクト指向のエバンジェリストのチームを編成し、オブジェクト指向の考え方を異なるチームに広めます(これらの人々は、数か月ごとにチームを変更する必要があります)。 設計を批判し、改善を提案するために、設計レビューセッションを実行します(時間の制約のために改善が行われない場合でも、これは役立つと思います) 。 私がコーチするチームで見つけたのは、チームを離れるとすぐに、古いチームに戻るということです。私は彼らと一緒に多くの時間を費やさないことを知っています。通常は1ヶ月です。だから私がやっていることは何でも、それは固執しません。 この質問にフラストレーションがたまっているのは残念ですが、これを書く別の方法は、気が散るまで壁に頭をぶつけることでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.