問題タブ [decoupling]
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.
java - IoC & Dependency Injection (java) 以外のクラスおよびプロジェクトでのデカップリング
オブジェクト内およびオブジェクト間 (プロジェクト内) 以外で使用できる他の (IoC と依存性注入以外の) 分離パターンとプラクティスは何ですか。
Java でサンプルを投稿できれば、それは素晴らしいことです。
私は春に取り組んでいますが、豆がうまくいかない状況に遭遇しています。したがって、代替オプションを確認したいだけです。主に、OOP に関してはほとんど考慮されずに作成されたサードパーティ API の統合です。一部の API コードの再利用性は非常に悪質です。
language-agnostic - ゲームデザインの分離を支援する
これが現在の依存関係グラフです(TheTXIのフリーハンドサークル付き)
ゲームには、プレーヤーと1つのボードが共有されます。プレイヤーはボードにアクセスして、ボードからユニットを追加/移動/削除することもできます。プレイヤーは、ボードの内外を問わず、所有しているユニットにアクセスできます(ユニットは所有者も知っていますが、おそらく削除してルックアップを行うことができます)。ボードにはユニットがあり、ユニットの位置を知っています。ユニットには能力があります(プレイヤーも可能です)
私が理解するのに苦労している大きなものは、ユニットの能力です。彼らはゲーム内のあらゆるものに影響を与え、プレイヤー/ユニットを癒し/ダメージを与え、ボード上のものを再配置し、おそらくゲーム自体にさえ影響を与えることができるはずです(これまでのところ必要はありませんが、それが起こる可能性があります)。
すべてを参照しなくても、何かに影響を与える可能性のある能力をどのように持つことができますか?それぞれの能力は必要なものだけを参照できるし、そうすべきだと思いますが、ユニットクラスには能力が組み込まれているので、ユニットの能力がボードに影響を与える場合、ユニットからボードへの参照を何らかの方法で取得する必要がありますか?
ルールがまだ決まっていないので、デザインをできるだけ柔軟に保つようにしています(ゲームを作成しているので、まだかなり早い段階なので、何かを試してみて、感じ方を確認し、ルールを変更してくださいゲームが正しく感じるまで)
ボード/マップがあるかどうかはまだ空中にあるので、ユニットは現在のユニットから切り離す必要があります。グローバルな状態や「神オブジェクト」は(まだ)存在しないので、そのままにしておきたいと思います。
具体的にはPython、webappであるため、質問自体は言語に依存しませんが、ファーストクラス関数を備えた動的言語に基づく詳細は確かに歓迎されます。
php - 依存性注入-完全なクラスを渡す方が良いですか、それともクラスの名前を渡す方が良いですか?
依存性注入の場合、メインクラスが独自のインスタンスを作成するのではなく、1つのクラスのインスタンスをメインインスタンスに渡す必要があることを理解しています(php):
これはすべて問題ありません。Class_TwoとClass_ThreeはどちらもAn_Interfaceを実装しているため、Class_Oneでは同じように使用できることを私は知っています。Class_Oneはそれらの違いを知りません。
私の質問は、インスタンスをsetOtherClassに渡す代わりに、「Class_Two」などの文字列を渡し、Class_OneのsetOtherClassメソッドに実際に次のようにインスタンス自体を作成させることをお勧めします。
この種の依存性注入の目的は無効になりますか、それとも完全に有効ですか?このタイプのセットアップは、ユーザーが以前に文字列で使用するクラスを指定でき、後でこれをClass_Oneに渡すことができる構成に役立つと思いました。
実際、これを書き出すことはおそらく良い解決策ではないと私に思わせましたが、誰かが私がこれをすべき/すべきでない理由についていくつかの良いフィードバックを私に与えることができる場合に備えて、私はまだこれを投稿します。
ありがとう=)
ライアン
c# - 非 xml 環境での linq に対する一般的なキー値アクセスの分離
おはよう。
私は教育を受けたコンピューター科学者ではないので、いかがわしい用語の乱用は見逃してください。
私のフレームワークでは、Record というベース フォームがフォーム RecordDetail をダイアログとして開きます。たとえば、RecordClient は Record を拡張し、クライアント データとクライアント関連の子データのタブ付きリストを含みます。RecordDetail は、DataContext に対して使用されるカスタム属性として保存されたリフレクションと表示オーバーライドに完全に基づいて、詳細な編集のために 1 つの子データ行を展開します。レコードはアプリケーション用にサブクラス化されていますが、RecordDetail をサブクラス化する必要はありません。これは、リストされた子の外部キー編集の表示を除いて機能します。
ObjectListViewと Linqを使用する必要があります。WPF/XML が使えません。非連続的なデータベース接続のシリアライゼーション トリックを行うため、データを複製して状態を管理すると、外部キー オブジェクトが失われます。ObjectListView は、表示と一般的な不正のために外部キー オブジェクトを必要とします。私はHibernateを知っていますが、Linqは私を途方に暮れさせます:
フレームワークとアプリケーション固有のクラスを結合せずに、RecordDetail へのダイアログが閉じた後、Record 内から外部キー オブジェクトにアクセスするにはどうすればよいですか?
あれは、
ここで、「PrimaryKey」は主キー属性をラップし、「GetTable」、「Where」、および「SingleOrDefault」の間で失敗が発生します。
この晴れた日曜日の朝に、あらゆる視点が高く評価されました。
ruby-on-rails - Railsコントローラーのリファクタリングとデカップリング: 相互に呼び出すことができますか?
Ruby on Rails アプリで次の状況があります。
- ユーザーがフォーム (コメント) に入力すると、認証方法 (openId、Twitter、Facebook など) を選択できる omniauth ページが表示されます。
- omniauth が入力され、成功したユーザーが戻ると、セッションが取得され、最初のフォーム データが処理されます (コメントが公開されます)。
私はすべてうまくいきますが、私の論理が醜い方法であると考えていることを除いて。これで、SessionsController
認証の成功に関するコメントが作成されます。
このようなものを分離する良い方法は何ですか? Comment
モジュールは SessionsController にフックする (リッスンする)必要がありますか? CommentsController
または、SessionsController は単にorクラスでいくつかのメソッドを呼び出して、Comment
認証の成功に関するコメントを保存する必要がありますか? この種の問題を解決するために、慣れることができるパターンはありますか?
interface - IoC と管理インターフェイス
IoC を使用してデータ アクセス ライブラリを実装するビジネス オブジェクト ライブラリがあるとします。データ アクセス インターフェイスはどこで定義する必要がありますか? それはどの図書館に属していますか?それとも、インターフェイス専用の別のライブラリにある必要がありますか?
javascript - CSS と Javascript の結合が強すぎます (CSS は単なるプレゼンテーションではなく、UI と JS で使用されます)。これを改善するにはどうすればよいですか?
おそらく理想的な方法は、CSS がドキュメントのプレゼンテーションの側面のみを扱うことであり、CSS と Javascript が分離され、非常にクリーンなソリューションになると思います。他のものを壊すことなく、任意の CSS または任意の Javascript を変更できます。
しかし、検索ボックスに灰色がかった単語などの派手な UI を実装し、ユーザーがボックスをクリックするとその単語が消えるとしたらどうでしょうか。このような場合、CSS と Javascript は非常に結合されており、CSS を変更すると Javascript のどこかに影響が及びます。また、プロジェクトでは 5000 行の CSS と 8000 行の Javascript が存在する可能性があり、それぞれをハンティングする必要があるため、扱いが困難です。他のダウンしてそれらを一緒に変更すると、バグが発生し、保守が難しくなる可能性があります。よりきれいにするためのより良い方法はありますか?
unity-container - Prism-MEF機能と同等のUnity?
私は次のように構成されたソリューションを持っています:
- モデルアセンブリ
- データアセンブリ-リポジトリインターフェイスと基本リポジトリクラスを定義します
- ORMアセンブリ-リポジトリインターフェイスを実装し、基本リポジトリクラスを継承します^
- ビジネスアセンブリ-データアセンブリへの参照があり、MEFを介してORMオブジェクトを動的にプルします(ORMアセンブリへの明示的な参照はありません)
- UIアセンブリ
このようにして、他の何かを使用することにした場合、ORMを簡単に交換できます。
Unityで同様の機能を使用できるかどうか知りたいです。ビジネスロジックを基盤となるORMから切り離したいと思います。私が読んだところによると、Unityは主にコンパイル時に機能し、MEFは実行時に機能します。そうは言っても、私のビジネスレイヤーがORMを参照せず、代わりにデータアセンブリから実装するインターフェイスだけを参照するように、単一性と切り離すことは可能ですか?Unityは、実装アセンブリを参照せずに、インターフェイスを実装するものをどのように定義できますか?
現在、MEFでは、ORMへの参照を持つアセンブリはありません(ビジネスレイヤーが実行時にORMを動的にプルしてパーツを検出し、インターフェイスをオブジェクトで埋める場合を除く)。私はこれらの方針に沿って作業を続けたいと思います。Unityでそれができるかどうか知りたいです。
.net - .Net-複数のORMの作業単位パターンの分離
私の現在のアプリケーション構造は次のとおりです。
- モデルアセンブリ
- データアセンブリ
- ORMによって実装されるリポジトリインターフェイスを定義します
- ORMアセンブリ
- データアセンブリからリポジトリインターフェイスを実装します
- Unity(IoCコンテナ)を使用して登録
Data.IRepository<>
しますORM.GenericRepository<>
- 商談
- データアセンブリとモデルアセンブリを参照します
- Unityを使用してタイプを解決します
IRepository<>
- UIアセンブリ
- ビジネスアセンブリを参照します
この構造は、本質的にビジネス層をORMから切り離して実装していIRepository<T>
ます。
この分離された構造の利点の1つは、ORMを比較的簡単に置き換えることができることです。たとえば、Entity FrameworkからNHibernateに移行したり、既存のORMをアップグレードしたりできます。私は現在、最初にEF 4.1コードを使用しており、NHibernate用に別のアセンブリを構築しています。
作業単位パターンの実装を検討しています。
このパターンはビジネスレイヤーで使用する必要があることを読みました(データアセンブリで定義されたインターフェイスを使用し、リポジトリパターンで行ったのと同じようにORMアセンブリに実装します)。現在、インスタンス化されたすべてのリポジトリには独自のDbContext /セッションがあり、その存続期間はリポジトリの存続期間に設定されています-これは悪いかもしれません-私の問題は、で動作する作業単位パターンを実装できるかどうかわからないことです異なるORM(むしろ、おそらくそうですが、私はスピードが上がらないだけです)。
これが頭に浮かぶ唯一のことです:
次の関数を持つデータアセンブリにIUnitOfWorkを作成します。object GetCurrentSession();
次に、ORMアセンブリのリポジトリのコンストラクターに引数を設定し、適切なセッション/ DbContextにキャストします(NHibernateの場合はISession、Entity Frameworkの場合はDbContext)
誰かがこの状況について何らかの洞察を持っていれば幸いです。
database-design - 低結合とSQL結合
私がテーブルを持っているとしましょうpeople (id, firstname, lastname)
。
これらのフィールドを含める必要がある他の2つのテーブルがあるため、peopleテーブルを再利用します:users (id, username, person_id)
とcompanies (id, name, contact_person_id)
。
ここで、企業またはユーザーを取得するには、peopleテーブルに参加する必要があります。peopleテーブルを変更する場合は、すべてのクエリと、おそらく多くのコードを書き直す必要があります。
これは本当の問題ですか?DB構造に欠陥がありますか?おそらくORMのように、低結合を維持するための解決策はありますか?
すべての回答ありがとうございます。