3

いくつかのコントローラーがあるとしましょう。各コントローラーは、ある時点で、サーバーに保存する必要のある新しいオブジェクトを作成できます。たとえば、フォームを管理するRecipeCreationViewControllerを使用できます。このフォームが送信されると、新しいRecipeオブジェクトが作成され、サーバーに保存する必要があります。

コードを可能な限りクリーンで読みやすく保ちながら、複雑さと結合を最小限に抑えるようにクラスを設計するための最良の方法は何ですか?

シングルトン

通常、オブジェクトを保存するために各コントローラーが直接アクセスできるシングルトンNetworkAdapterを作成します。

例:

[[[NetworkAdapter] sharedAdapter] saveObject:myRecipe];

しかし、クラスが独自にシングルトンを呼び出すと、シングルトンへのアクセスが実装に隠されており、インターフェイスからは明らかでないため、デバッグが難しい結合コードが作成されることに気付きました。

直接参照

別の方法は、各コントローラーにNetworkAdapterへの参照を保持させ、これをコントローラーを作成するクラスから渡すことです。

例えば:

[self.networkAdapter saveObject:myRecipe];

委任

頭に浮かんだもう1つのアプローチは、委任です。NetworkAdapterは「RemoteStorageDelegate」プロトコルを実装でき、各コントローラーは、saveObject:onなどのメソッドを呼び出すことができるremoteStorageDelegateを持つことができます。利点は、コントローラーがNetworkAdapterの詳細を認識せず、プロトコルを実装するオブジェクトがオブジェクトの保存方法を認識していることだけです。

例えば:

[self.remoteStorageDelegate saveObject:myRecipe];

モデルで直接

さらに別のアプローチは、モデルにネットワークへの直接保存を処理させることです。しかし、これが良い考えかどうかはわかりません。

例えば:

[myRecipe save];

これらについてどう思いますか?これにもっと意味のある他のパターンはありますか?

4

1 に答える 1

1

あなたの場合、依存性注入にも固執します。それについて読みたい場合は、Wikipediaなどの Web で優れた記事を簡単に見つけることができます。Objective C の DI フレームワークへのリンクもあります。

基本的に、2 つ以上のコンポーネントが相互作用する必要があるが、コード内で直接お互いを認識してはならない場合、DI を使用できます。あなたの例を少し詳しく説明しますが、Objective C の構文がわからないため、C#/Java スタイルで説明します。あなたが持っているとしましょう

class NetworkAdapter implements NetworkAdapterInterface {
  void save(object o) { ... }
}

インターフェイスと

interface NetworkAdapterInterface {
  void save(object o);
}

次に、次のようなコントローラーでそのアダプターを呼び出します

class Controller {
  NetworkAdapterInterface networkAdapter;

  Controller() {
  }

  void setAdapter(NetworkAdapterInterface adapter) {
    this.networkAdapter = adapter;
  }

  void work() {
    this.networkAdapter.save(new object());
  }
}

セッターを呼び出すと、DI の魔法が発生する可能性があります (セッター インジェクションと呼ばれます。たとえば、コンストラクター インジェクションもあります)。つまり、自分で Setter を呼び出すコード行は 1 行もありませんが、DI フレームワークは実行させます。非常に疎結合です!

今、それはどのように機能しますか?通常、一般的な DI フレームワークでは、コンポーネント間の実際のマッピングを中央のコード プレースまたは XML ファイルで定義できます。あなたが持っているイメージ

<DI>
  <component="NetworkAdapterInterface" class="NetworkAdapter" lifecycle="singleton" />
</DI>

これにより、コード内で見つかったNetworkAdapterすべての Setter にa を自動的に挿入するように DI フレームワークに指示できます。NetworkAdapterInterfaceこれを行うために、最初に適切なオブジェクトを作成します。インジェクションごとに新しいオブジェクトを構築する場合、またはすべてのインジェクションに対して 1 つのオブジェクトのみを構築する場合 ( Singleton )、または作業単位ごとに1 つのオブジェクト(このようなパターンを使用する場合) をタイプごとに構成できます。

補足: コードの単体テストを行っている場合は、DI フレームワークを使用して、テスト シナリオに適した完全に他のバインディングを定義することもできます。いくつかのモックを注入する簡単な方法!

于 2013-01-18T20:41:22.040 に答える