すべてを収めること疎結合および拡張可能:多層、小さすぎても重要な質問です。
-
12-09-2019 - |
質問
(今まで以上)において開発者を書くのに大量の層など
implementation PresentationLayer ->
interface IMyDTO ->
implementation MyDTO ->
interface IMyService ->
implementation MyService ->
interface IMyDomainRepository ->
implementation MyDomainRepository ->
interface IMyDomainObject ->
implementation MyDomainObject ->
interface IMyIndependentStorageLayer ->
implementation MyMSSQLStorageLayer
みを通してC#のブログはこのうえられたような最高のスライスパンです。基本的には疎結合.使わないドメインオブジェクト。実行すべてのサービス。アクセスデータをリポジトリ全てのレイヤーが完全に独立しています。
なく間違っているのは、できればおもしろいと思いなトレードオフの時間、特に大きなプロジェクト?のROIを維持ものに十分な大きを正当化する。
の説明を読んになっていくなど、"こうして取付けることができ異なるデータベースの場が必要で存分にお楽しみいただけます。※本当ですか?とは思わないでに共通する問題を誰かが要求が突然切り替えを指定すOracleとまり、また万層ています。
あの動向によって無理とゆったりカップリング、または私だけで読み間違ったブログ?ついての感想を聞かせてください、といったインスタンスだったのも嬉し後にあなたの仕事のか?
解決
これは、ソフトウェアのための右のビジネス整列構想を設計することは非常に困難です。私は、許容可能なROIを意味します。
しかし、私のために、層の数またはソフトウェア概念の低結合のレベルは、ソフトウェアが使用される文脈に依存しています!
あなたがソフトウェアを行う必要があり、おそらく大きくない変更があるだろうか、将来的に追加されますかについて確信している場合は、、層の多い超低レベルのカップリングアプリケーションは、ソリューションではありません。それが理由もなくアーキテクチャがあまりにも複雑になり、建築のために投資した時間が有益ではないので...
一方、あなたは、アプリケーションが
...各顧客に合わせてカスタマイズする必要がありますし、確かに深さに変更されるので、低レベルのカップリングアーキテクチャに費やした時間は良いアイデアであることがわかっている場合
あなたが他のアプリケーションのコードの一部を再利用する場合、低レベルのカップリングは、スマートすることができます。この場合、設計のために費やした時間はもちろん、完全に有益である。
その後、要約すると、私はすべてが、将来的にソフトウェアの進化と、他のアプリケーションのためのコードの再利用の可能性に依存することを言うだろう。
しかし、それは私がいない体系的に非常に複雑なアーキテクチャを行うための最善の方法です。
他のヒント
もちろん、それは行き過ぎすることができ、もう1つはレイヤーを追加し、「どこを停止する」を知る必要があります。
親指の私のルールは一つの層は、任意の重要な機能/コードを含める必要がない場合、私はそれを必要としないこと、です。それは言われて、テスト容易性は重要なことですが、その層は私より良いテスト容易性を買えば、私はそれを追加します。
アプリケーション設計では何も価格なしで来ることはありません。ここでは価格がcomplexibilityを高めています。あなたは、常に最高のニーズに合ったものを選択する前に、あなたのオプションを探しますする必要があります。
それは言われていると、私はあなたの質問は少しバイアスされ聞こえると思います。現実の世界では、多くの場合、顧客はDBの新しい種類を求めて表示されないことがありますが、あなたは、多くの場合、以前よりもデータ・アクセスの同じ種類を望んでいる新しい衣装が表示される場合がありますが、別のDBに。それは、コードの再利用についてもですが、使いやすさの変更ではないだけです。
これらの事を評価するとき、私は通常、それが参考にDRY原則のレンズを通して、それを見て見つけて、プロジェクト内の重複を見ています。
あなたのプロジェクトよりも複雑なアーキテクチャを使用している場合は、あなたは少し以外の他の層をラップし、呼び出しに渡すん層の多くを見るために傾向があります。これは、自分自身を繰り返している。
一方で、あなたがシステムの一部で機能を作成することはあなたが非常に多くのことを書くためにあなたを強制的に、別の部分でその機能を再利用することはできませんことを見つけるかもしれない複雑なシステムのための薄いアーキテクチャを使用している場合すべての場所の上に同様のコード。これは、自分自身を繰り返している。
あなたは重複を識別し、常にそれを削除するにはリファクタリングに警戒している場合は、私の経験では、構造はあなたに自分自身を紹介します。あなたではなく、基本的なアーキテクチャで出始めたが、すぐに彼らは再利用する必要があるような方法に物事を破り、彼らは他のクラスで再利用する必要があるとすぐにクラスにメソッドを飛び出していること、たとえば言います。そして、あなたは最終的に、彼らはそれがサービス層に行っていた場合には、より明確に定義されている可能性が責任を取っているようにあなたは、重複を削除するために書いたあなたの13ヘルパー/マネージャー/ハンドラクラスは、実際にかなり見えることを実現することができます。
それだけの価値だとき知ってトリッキーなことができますが、私は層の多くのシステムを構築する上での成功の鍵は責任異なる層が持つべきものに非常に明確にされていると思います。追加した層は、それ以上の層での操作の複雑さを軽減し、それが簡単にエレガントな方法で一緒に機能を織りすることであなたの助けにする必要があります。
取り仮想的な例です。この試験に使用しているさまざまなプロセスSQLiteデータベースの速度は、開発データベースの一部の開発者のコンピューターはPostgreSQLの演出データベースはOracleをインストールし、製造データベースは拡張性の非常に高価な、非常にハードの設定Oracle。
どうす引きるoff切り離すことなく、SQL層からの事業層?
これは、最近の傾向だし、経験の少ないリード/建築家が時流にジャンプに獲物を落下されます。
私は上だプロジェクトでは、データアクセスが行きます:
サービスインターフェイス - >サービスの実装 - >委任インタフェース - >委任の実装 - > DAOインタフェース - > DAOの実装 - 。> iBATISのXML
このでした(とある!)悪い我々の場合には、任意のデリゲートの実装方法ではほとんどのコードは1行だったので。それだけでDAOと呼ばれます。すべてのDAOのために、我々は2つの追加クラスと1つの余分豆の設定を持っていた、と私たちは、このことから、全く何も得ていなかった。
の変化、リファクタリングを受け入れ、そして上に移動します。それは異なる概念を離れて片にかかるよう...など多くの層を使用してから停止します。ことを除いていくつかのコードを書くには、知覚ゲインはありませんなら、それは減速し、テンプレートがあること、またはテンプレートがアプリケーションに間違っていることを受け入れ、そのビットを無視しなかった理由を完全に理解しようとするのいずれか、テンプレートに従います。
私は現在、すべての層が分離された大規模なSOAプロジェクトに取り組んでいる、とほぼすべてのクラスは、いくつかの抽象工場を経由してインスタンス化されます。今、私たちは、別途ホスティングサービスに既存の機能の一部をオフロードしようとしている、とありますので、それは重要なビットを推定しようとする層を通過する本当の悪夢だ決して終わることのない右クリックして追いかけて...定義に行きます>最も外側の層でのコードのあったもののみ1行下に!
自体のデカップリングには何の問題もありませんし、確かにも、私のプロジェクトで、私は建築の観点から、それが役立つ多くの分野があります。ただ、夢中にしないでください...実用的して、そしてあなたが分離するように検討している領域を調べる際に長所/短所を比較検討ます。
乾杯