2011-07-31 10 views
5

UIApplicationDelegateからManagedObjectContextを取得するのではなく、ManagedObjectContextをUIViewControllerに渡す必要があるのはなぜでしょうか?UIApplicationDelegateからManagedObjectContextを取得するAppleのドキュメントが悪いのはなぜですか?

文書によって、これによりアプリケーションの剛性は向上すると言われていますが、どのパターンをいつ使うべきかというニュアンスは見当たりません。

ありがとうございます!

答えて

7

部屋に絵を描くなどの作業をしてもらいたいと想像しているとします。私がちょうど「部屋にペイントする」と言ったら、あなたは私に多くの質問をする必要があります:

  • どの部屋ですか?
  • 塗料はどこですか?
  • ブラシはどこですか?
  • ドロップクロスを使用する必要がありますか?

要するに、私の助けなしにタスクを完了することはできません。あなたが毎回私に頼らなければならないなら、あなたは非常に柔軟な画家ではありません。その問題に対処する1つの方法は、最初に必要なすべてのものを私に与えることです。 「塗料を塗る」の代わりに、「塗料のこのバケツとこのブラシを使用して部屋番号348を塗ってください。そして、ドロップ布で気にしないでください」と言うでしょう。今、あなたは必要なものをすべて手に入れており、私の助けを借りずに仕事をすることができます。あなたはもはや私に依存しないので、はるかに柔軟な労働者です。

ビューコントローラ(および一般的にオブジェクト)にも同じことが適用されます。アプリケーションデリゲートのような特定のオブジェクトに依存させるよりも、必要なものすべてを与える方がよいでしょう。管理されたオブジェクトのコンテキストだけでなく、彼らが仕事をするために必要な情報についても、真です。

3

これは主に、UIApplicationのすべてを取得するのではなく、dependency injectionをUIViewControllerで使用したいからです。これは、参照ハックがいっぱいではなく、デリゲートをきれいに保ちます。ビューとモデルの間で調整するための

  1. モデル(のみ表示ロジック用)

  2. ビューコントローラ

  3. コントローラー(:

    これはMVCパターンを維持することもあります)

2

私はこのpaに賛成できません。 ttern。

まず最初に、Core Dataを実装の詳細として扱うようにしています。実装の詳細としては、優れた外観の下に隠す必要があります。ファサードは私のモデルオブジェクトのために公開するインターフェイスです。たとえば、2つのモデルオブジェクトがある場合CourceStudentの場合、どのソースにも多数の学生が参加できます。コントローラが述語を設定してディスクリプタをソートする必要はなく、特定のクラスの生徒のリストを取得するためにすべてのコアデータフープをジャンプする必要があります。

@interface Cource (StudentAccess) 
-(NSArray*)studentsStortedByName; 
@end 

次に、Modelクラスの中で一度、そしてすべてのものを実装してください。コアデータのすべての複雑な詳細を隠し、管理されたオブジェクトコンテキストを渡す必要はありません。しかし、どのようにソースを見つけることができますか、それはどこかで始まる必要がありますか?はい、そうですが、コントローラーに公開する必要はありません。このようなメソッドを追加するだけでなく完全に合理的です:

@interface Cource (CourceAccess) 
+(Cource*)caurceByID:(NSString*)courceID; 
+(NSArray*)allCources; 
+(NSArray*)courcesHeldByTeacher:(Teacher*)teacher; 
@end 

これもは、コントローラ間の依存関係を最小限に抑えるのに役立ちます。モデルとコントローラ間の依存関係を減らします。

-(id)initWithManagedObjectContext:(NSManagedObjectContext*)moc 
          student:(Student*)student; 
:私は CourceViewControllerStudenViewControllerを持っていると仮定すると、私はその後、私はこのような指定イニシャライザで終わるだろう、ファサードの背後にコアデータの詳細を隠すし、同様に管理オブジェクトコンテキストの周囲を通過したかっなかったです私はこれで終わるの良い優れた外観を持つ一方

:ファサードの背後にある依存関係を最小限に抑える

-(id)initWithStudent:(Student*)student; 

は、依存性注入を支持しても、それははるかに簡単に内部実装を変更することができます。マネージドオブジェクトのコンテキストを伝えることは、各コントローラが基本的なもののための独自のロジックを実装することを奨励します。例えば、studentsSortedByNameの方法をとる。最初は、最後に/ファーストネームに変更された場合は、最後に/ファーストネームで選別されるかもしれませんが、ソートした各コントローラーに行って変更を加えなければなりません。良いファサードの方法では、ある方法で変更する必要があり、すべてのコントローラが自動的にアップデートを無料で入手します。

+0

Appleがどこに反対しているのかわかりません。それをさらに進めてコンテキストを隠すだけです。あなたは、あなたのビューコントローラがアプリケーションデリゲートか他のシングルトンから生徒やコースのリストをフェッチすることを主張しませんか? – Caleb

+0

@Caleb - アプリケーションデリゲートからではありませんが、 'Course'クラスのクラスメソッドからコースリストを取得するのは恥ずかしいことではありません。クラスをソートのシングルトンとして扱う。 – PeyloW

+1

私は、ソートと述語がモデル層に属しているとは思っていません。ソートと述部はインターフェイスでのみ必要なので、コントローラに属します。モデルにソートや述語を置くことは、モデルを特定のインタフェースに結びつけ、アプリケーションが扱う実世界のオブジェクト、イベント、条件のモデルシミュレーションの論理的な完全性を汚染します。 – TechZen

1

Apple Docsは、最も広く適用可能で持続可能なデザインパターンを育てようとします。 依存性注入は、最も柔軟性があり、拡張性があり、再利用可能で保守可能な設計が可能なので好ましい。

アプリが複雑になるにつれて、駐車のような準シングルトンを使用すると、アプリケーションデリゲートのコンテキストが分解されます。より複雑なアプリケーションでは、複数の店舗に複数のコンテキストを関連付けることができます。別の時に別のコンテキストのデータを表示するために同じビューコントローラ/ビューのペアを使用したり、別のスレッド/操作で複数のコンテキストを使用することができます。これらのコンテキストをすべてアプリケーションデリゲートに重ねることはできません。

単一のコンテキストで単純なアプリケーションを使用している場合は、アプリケーションデリゲートで準シングルトンを使用すると効果的です。私は過去にいくつかの小さなアプリでそれを使用していましたが、直ちに問題は発生しませんでしたが、アプリが2つ以上残ってしまった場合、スケーラビリティの問題が発生しました。

どのパターンを使用するかは出荷時の制約によって決まり、進化アプリのライフサイクル全体にわたる推測に最適です。小さなワンショットアプリなら、準シングルトンのアプリケーションデリゲートは正常に動作します。アプリがより複雑で、複雑になったり、既存のコンポーネントを再利用する他の関連アプリを生成したりする可能性がある場合は、依存性注入が必要です。

関連する問題