いくつかのコントローラーがあるとしましょう。各コントローラーは、ある時点で、サーバーに保存する必要のある新しいオブジェクトを作成できます。たとえば、フォームを管理する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];
これらについてどう思いますか?これにもっと意味のある他のパターンはありますか?