4

私のプロジェクトの 1 つで設計レベルの質問があります。REST を使用していくつかのオブジェクトを取得する必要があるプロジェクトに取り組んでいます。たとえば、顧客を取得してリストに表示するとします。

お客様でできる以下の操作は、

  • 顧客の追加
  • 顧客の詳細を編集する
  • 顧客の削除

そこで、次のメソッドを含む「CustomerManager」という名前のクラスを含めることを考えました。

  @interface CustomerManager
  - (CustomerManager *)sharedManager;

  - (BOOL)addCustomer:(Customer *)customer;
  - (BOOL)deleteCustomer:(Customer *)customer;
  - (BOOL)updateCustomer:(Customer *)customer;

  @end

  @implementation CustomerManager

   - (BOOL)addCustomer:(Customer *)customer;
    {
       NetworkManager  * manager = [NetworkManager manager]     addCustomer:customer ];
    }
   @end

顧客関連の操作を実行する必要がある ViewController では、以前はこのように作成していました。

 Customer * manager = [Customer sharedManager];
 [manager addCustomer:customer];

 //fetch customer
 [manager customers];

 //While deleting
 [manager deleteCustomer:customer];

設計レベルの質問が出るまで、すべてがうまく機能しているように見えます.なぜその間にマネージャーがいたのですか. すべての作業は Customer オブジェクトで行われたため、以下のように、すべての Customer 関連の操作を Customer クラスに含める必要があります。

  @interface Customer

  + (BOOL)addCustomer:(Customer *)customer;
  + (BOOL)deleteCustomer:(Customer *)customer;
  + (BOOL)updateCustomer:(Customer *)customer;
  + (NSArray *)customers;

  @end

ここでの問題は、ネットワーク関連のコードが別のクラスにあるにもかかわらず、すべてのモデル クラスでネットワーク マネージャーの具体的な参照が必要になることです。どちらを選ぶべきか混乱。

最良の方法はどれでしたか?. これについては、詳細な回答をいただきたいと思います。

4

2 に答える 2

2

私はマイケル・フレデリックの最初の点について同意しません。

CustomerManager は、Customer モデル オブジェクト自体に顧客の CRUD 操作を配置するよりもはるかに優れたアイデアです。一番の理由は、顧客モデル クラスの単一の責任は、単一の顧客を表すことであるということです。さらに一連の顧客を管理するためではありません (単一責任の原則)。DDD の用語では、 Customer クラスはentityであると予想されます。

モデル オブジェクト (MVC パターンなど) とドメイン オブジェクトの間には大きな違いがあることに注意してください。主な違いは、モデル オブジェクトの責任はビューにデータの表現を提供することであり、ドメイン オブジェクトの責任は、表現とは無関係にドメイン概念の論理的な翻訳であることであり、それ以上であってはならないことです。

コントローラーからわかるように、モデルは一連の顧客を保持する必要があります。したがって、CustomersModel に一連の Customer オブジェクトを保持させます。コントローラーの責任は、リクエストを処理し、リクエストに基づいてモデルを適切に操作することです。これにより、結果はアプリケーションの状態の一貫したビューになります。CRUD 操作自体には責任を負いません。通常、マルチレイヤー設計では、アプリケーション層サービスがそのような操作を担当し、おそらくそれをインフラストラクチャ層リポジトリ(または DAO) に委任します。まとめると、少なくとも私のデザインは次のようになります。

顧客クラッドuml

すべての CRUD、リクエストの処理、および状態管理は、この UML 図の左側で実行されます。

別の見方をすると、最も単純な言葉で言えば、これらすべてが数行のコードに相当する可能性があるということです。配列に対して同じ CRUD 操作を行っているとしましょう。配列要素自体が配列の操作を担当する必要がありますか? もちろん違います。CustomerRepository は配列、NetworkManager はその永続性 (つまりメモリ)、コントローラーは配列を使用するアクター、CustomersModel はローカル コピーまたはサブセット、Customer は配列要素です。

于 2013-05-25T11:41:40.480 に答える