Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 数据库层设计_Iphone_Objective C_Class_Oop_Ooad - Fatal编程技术网

Iphone 数据库层设计

Iphone 数据库层设计,iphone,objective-c,class,oop,ooad,Iphone,Objective C,Class,Oop,Ooad,我的一个项目中有一个设计级别的问题。我正在处理一个项目,其中我需要使用REST获取一些对象。比如说,获取客户并将其显示在列表中 可在客户机上执行的以下操作 添加客户 编辑客户详细信息 删除客户 所以我想包括一个名为“CustomerManager”的类,包括以下方法 @interface CustomerManager - (CustomerManager *)sharedManager; - (BOOL)addCustomer:(Customer *)customer;

我的一个项目中有一个设计级别的问题。我正在处理一个项目,其中我需要使用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类中拥有所有与客户相关的操作,如下所示

  @interface Customer

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

  @end
这里的问题是,即使网络相关代码在一个单独的类中,我也需要在所有模型类中具体引用我的网络管理器。 困惑,选择哪一个


哪种方法最好?。我想得到一些详细的答案。

我认为这里没有正确的答案。我个人就如何让我的web服务与我的模型交互进行了反复讨论。但我可以给你一些建议:

  • CustomerManager太过分了。客户模型负责管理自身——您可以将与客户相关的方法放在其中。这里不需要单独的对象
  • 我通常为我的模型使用一个超级类。例如,您可以拥有一个名为ApplicationModel的类,Customer和所有其他模型都将从该类继承。这是使模型中的代码干涸的好方法。如果您决定在您的模型中包含与网络相关的代码,我建议将其放在这个超级类中。这样,如果您需要更改web服务的工作方式,您只需要在1个位置更改代码
  • 一般来说,我建议将与网络相关的代码与模型分开。我希望我的网络逻辑尽可能孤立。与网络相关的代码容易更改,您希望尽量减少网络更改对代码的影响。例如,我通常创建一个作为API包装器提供服务的类,它提供了一个用于进行API调用的公共接口。此类还负责解析这些方法的响应&与模型交互(即解析JSON自定义数组并与客户交互以将这些对象添加到数据库)

  • 我不同意迈克尔·弗雷德里克的第一点

    与将客户CRUD操作放在客户模型对象本身上相比,CustomerManager是一个更好的主意。第一个也是最重要的原因是,客户模型类的单一职责应该是代表单个客户;不另外管理一组客户(单一责任原则)。在DDD术语中,我希望Customer类是一个

    请注意,模型对象(如MVC模式中)和域对象之间有很大的区别。关键的区别在于,模型对象的职责是提供具有某些数据表示形式的视图,而域对象的职责是,而且不应该超过,作为域概念的逻辑转换,独立于表示形式

    正如我从你的控制器中可以看出的那样,你的模型应该能容纳一组客户。因此,我会让CustomerModel保存一组Customer对象。控制器的职责是处理请求并根据请求适当地操纵模型,以便结果是应用程序状态的一致视图。它不是,也不应该对CRUD操作本身负责。通常情况下,应用层服务将负责此类操作,这可能会将其委托给基础结构层(或DAO)。总而言之,我的设计至少看起来像:

    所有CRUD(请求处理和状态管理)都在这个UML图的左侧执行

    另一种看问题的方式是,用最简单的术语来说,所有这些可能相当于几行代码。假设您在阵列上执行相同的CRUD操作。数组元素本身是否应该负责操纵数组?当然不是。CustomerRepository是数组,NetworkManager是其持久性(即内存),controller是使用数组的参与者,CustomerModel是本地副本或子集,Customer是数组元素