問題タブ [coupling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - コントローラーとビューの結合
優れた MVC 実装のリトマス試験紙は、ビューの交換がいかに簡単かということです。私は怠け者だったので、いつもこれを本当に下手にやっていましたが、今は正しくやりたいと思っています. これは C++ で書かれていますが、誇大宣伝を信じるなら、デスクトップ以外のアプリケーションにも同様に当てはまるはずです。
以下に 1 つの例を示します。アプリケーション コントローラーは、バックグラウンドで URL が存在するかどうかを確認する必要があります。次のように、(Boost シグナルを使用して) "URL available" イベントに接続できます。
それで、どのようにController::urlAvailable
見えますか?
1 つの可能性を次に示します。
これは、私には、ビューとコントローラーの全体的な結合のように思えます。このような結合により、Web を使用するときにビューを実装することができなくなります (コルーチンは別として)。
別の可能性:
私は後者に部分的ですが、これを行うと次のようになります。
- 400億のそのような信号。アプリケーション コントローラは、自明でないアプリケーションでは巨大になる可能性があります
- 特定のビューが誤っていくつかのシグナルを無視する非常に現実的な可能性 (API はリンク時に通知できますが、シグナル/スロットは実行時です)
では、カップリングを取り除き、複雑さを抑えるために何を提案しますか? 前もって感謝します。
wpf - 複合 WPF で領域を使用するときにカップリングを回避する方法
Microsoft のComposite Application Libraryを使用して設計されたアプリケーションがあります。私のシェルには、個別のモジュールからコンテンツを挿入できるように、いくつかの領域が定義されています。これらの領域が導入する結合を減らす設計パターンを探しています。
私が見たすべての例では、リージョンはインフラストラクチャ プロジェクトの静的クラスの文字列を使用して定義およびアクセスされます。
これにより、インフラストラクチャ プロジェクトの一部がシェルと一致する必要があるため、インフラストラクチャ プロジェクトからシェルへの依存関係が導入されます。定義されていないリージョンにアクセスしようとすると、CAL RegionManager が例外をスローするため、インフラストラクチャ プロジェクトとシェル プロジェクトが同期されていることを確認する必要があります。
シェルの領域を分離して、シェル内でのみ定義されるようにする方法はありますか (インフラストラクチャ プロジェクトに領域名はありません)。
リージョンをオプションにして、シェルがすべて同じリージョンを持っていなくてもシェルを交換できるようにする方法はありますか? (例: あるシェルにはメニューとツールバーの領域があり、別のシェルにはメニューしかありません...モジュールは、ツールバーが利用可能であればツールバーに挿入でき、そうでない場合は失敗することはありません)
更新 - 私のアーキテクチャの詳細
以下のdedratureboyの回答に応えて、システムのセットアップ方法を説明したいと思いました...おそらく、より良いフィードバックがあるでしょう。
私は Infrastructure および Shell プロジェクトを汎用ライブラリとして扱っており、それらを使用するアプリケーションがいくつかあります。インフラストラクチャ プロジェクトは "フレームワーク" コードとリソース (MVVM のもの、リフレクション、アイコンなど) を提供し、シェルは基本的なウィンドウ レイアウト (メニュー、ツールバー、ステータス バー、メイン コンテンツ領域) を備えた汎用ホスト ウィンドウです。アプリケーションはすべて、シェルを共有しているため、共通の外観と動作を共有しています。
私のアプリケーションは、ロードされるモジュールから個々の機能を取得するため、アプリケーションごとにすべてをまとめたブートストラップ プロジェクトがあります (インフラ、シェル、モジュール)。
現在のものとは大きく異なるまったく新しいアプリケーションを開発する必要が生じた場合、インフラストラクチャ プロジェクトは再利用できますが、シェルは再利用できないと思います。そのため、インフラストラクチャ プロジェクトとシェルを切り離すことに興味があります。
design-patterns - ゲームとレンダリング ロジックの分離
実際のゲーム エンジン/ロジック コードからレンダリング コードを分離する最善の方法は何ですか? そして、それらを分離することは良い考えですか?
Knightというゲームオブジェクトがあるとしましょう。騎士は、ユーザーが見るために画面にレンダリングする必要があります。現在、2 つの選択肢が残されています。呼び出し可能なメソッドを Knight に与えるか、Render/Draw
すべての Knight のレンダリングを処理するレンダラー クラスを作成します。
2 つが分離されているシナリオでは、騎士は彼をレンダリングするために必要なすべての情報を保持する必要がありますか、それとも分離する必要がありますか?
最後に作成したプロジェクトでは、オブジェクトをレンダリングするために必要なすべての情報をオブジェクト自体の内部に格納することにしましたが、実際にその情報を読み取ってオブジェクトをレンダリングする別のコンポーネントがありました。オブジェクトには、サイズ、回転、スケール、現在再生中のアニメーションなどの情報が含まれ、これに基づいてレンダラー オブジェクトが画面を構成します。
XNA などのフレームワークは、オブジェクトとレンダリングを結合することは良い考えだと考えているようですが、特定のレンダリング フレームワークに縛られることを恐れていますが、個別のレンダリング コンポーネントを構築すると、いつでもフレームワークを変更する自由度が高くなります。
oop - オブジェクト指向パラダイムの緩い結合と密な結合の違いは何ですか?
オブジェクト指向パラダイムにおける緩い結合と密な結合の正確な違いを説明できる人はいますか?
oop - Cohesion と Decoupling、それらは何を表していますか?
結合と分離とは何ですか? カップリングに関する情報は見つかりましたが、デカップリングに関する情報は見つかりませんでした。
language-agnostic - デメテルの法則と戻り値
デメテルの法則によれば、返されたオブジェクトのメソッドを呼び出すことはできますか?
例えば
$ http-> get()はオブジェクトを返します。これは、M内で作成/インスタンス化されたオブジェクトとしてカウントされますか?(LoDによると)メソッドを呼び出せない場合、この状況にどのように対処しますか?
coupling - 複雑な JOIN は結合度が高く、メンテナンスの問題を引き起こしますか?
私たちのプロジェクトには、複雑な関係を持つ最大 40 個のテーブルがあります。同僚は、長い結合クエリを使用することを信じているため、モジュール外のテーブルについて学習する必要がありますが、モジュールに直接関係のないテーブルについては気にせず、データ アクセス関数を使用する必要があると思います (他のモジュールの責任者によって書かれている) それらからのデータが必要な場合。明確にさせてください:
私は、顧客がベンダーに連絡して、特定の製品について会話を開始できるようにする ContactVendor モジュールを担当しています。製品モジュールには、独自の複雑なテーブルと、詳細をカプセル化する関数との関係があります (たとえば、i18n、アクティベーション、製品の可用性など...)。ここで、ベンダーと顧客の間の会話に関連する製品の製品タイトルを表示する必要があります。製品情報と会話内容を一度に取得する長いクエリを作成するか (これにより、製品テーブルについて学習する必要があります)、または関連する product_id を get_product_info(int) 関数に渡すことができます。
最初のアプローチは明らかに要求が厳しく、多くの悪い慣行や、私が通常プログラミングの欠点と考えるものを導入します。2 番目のアプローチの問題は、これらのアクセス関数が無数の小さなクエリを引き起こすことであり、それぞれが個別のクエリを実行する関数を使用してループが 100 個の製品の製品タイトルをフェッチしようとすると、パフォーマンスの低下が懸念されます。そのため、「実装にコーディングしないで、インターフェースにコーディングする」とパフォーマンスの間で立ち往生しています。物事を行う正しい方法は何ですか?
更新: モジュールの外部にあるこれらのテーブルに対する将来の変更の可能性について特に心配しています。製品モジュールが彼らのやり方を変えることにした場合はどうなるでしょうか? または何らかの理由でスキーマを変更しますか? これは、変更がそれらに統合されるまで、一部の他のモジュールが破損または誤動作することを意味します。いつもの波及問題。
python - Pythonモジュール間でタプルを交換しても大丈夫ですか?
非常に少数のモジュール(約4個程度)で構成される小さなPythonプログラムがあります。メインモジュールはタプルのリストを作成し、それによって多数のレコードを表します。これらのタプルは、それらを返す単純な関数を介して他のモジュールで使用できます(たとえばget_records()
)。
しかし、これが良いデザインかどうかはわかりません。問題は、他のモジュールがタプル内の各要素のインデックスを知る必要があることです。これにより、モジュール間の結合が増加し、メインモジュールを使用したい人にはあまり透過的ではありません。
私はいくつかの選択肢を考えることができます:
タプル要素のインデックス値をモジュール定数(たとえば、、など)として使用できるようにし
IDX_RECORD_TITLE
ますIDX_RECORD_STARTDATE
。これにより、のようなマジックナンバーが不要になりますtitle = record[3]
。タプルを使用せずに、レコードクラスを作成し、これらのクラスオブジェクトのリストを返します。利点は、クラスメソッドが。のような自明の名前を持つこと
record.get_title()
です。タプルは使用せず、代わりに辞書を使用してください。したがって、このシナリオでは、関数は辞書のリストを返します。利点は、辞書キーも自明であるということです(ただし、モジュールを使用している人はそれらを知っている必要があります)。しかし、これは大きなオーバーヘッドのようです。
タプルはPythonの大きな強みの1つであることがわかったので(クラス/オブジェクトのコーディングオーバーヘッドなしで複合データを渡すのは非常に簡単です)、現在(1)を使用していますが、それでも最善のアプローチは何でしょうか。
java - 設計を「疎結合」にする方法は?
簡単な3D CADソフトを作っています。クラス図では、多くのオブジェクトは (x,y,z) によって他のオブジェクトと区別する必要があります。「位置」と呼ばれるクラスを作成しますが、多くのクラスが位置を操作するため、結合度が高く見えるという問題があります。何か案は?
language-agnostic - オブジェクト指向パラダイムの質問
私はかなり長い間プログラミングをしてきましたが、オブジェクトを結合することになると、いつも壁に頭をぶつけているように見えるので、誰かが私が従うことができるリソースや黄金のルールを持っているかどうか疑問に思います。
特定の言語ではなく、小さな例を挙げましょう...
今のところctors/setters / getters / dtorsを無視して、いくつかのものをインスタンス化しましょう...
私の質問は..ここでのベストプラクティスは何ですか...
また...
または多分それは問題ではありません:S
私が取り組んでいる実際の例は、はるかに複雑です。何かをするときはいつでも、必要なPerson
人全員にLab
通知する必要があります。私はここで適用できる原則があるかどうかを理解しようとしています。