美文网首页iOS用到的机制iOS Developer
iOS开发基础:也许你从未定义过正确的Model对象

iOS开发基础:也许你从未定义过正确的Model对象

作者: 溪石iOS | 来源:发表于2016-05-12 08:55 被阅读656次

最基本的,Model 应该包含应用所需的数据,常见的是这样:

 @interface Book : NSObject
 @property(nonatomic, copy) NSString *name;
 @end

一个Model应该表示某一领域专门的知识,它不仅提供这一领域的数据访问,还应该提供处理这类数据的方法,比如Book需要一个出版日期:

@interface Book : NSObject
@property(nonatomic, copy) NSString *name;
@property(nonatomic) NSDate *date;
@end

而需求将日期显示为“当天发布”、“2天前发布”等自然语言,应该在Book添加:

@interface Book : NSObject
@property(nonatomic, copy) NSString *name;
@property(nonatomic) NSDate *date;
@property(nonatomic, readonly) NSString *formatDateString;
@end

不良的做法是将转换日期的工作放到一个View对象中,可以想象一下如果一个TableView,和书籍详情页都被要求按同样的格式显示日期这样显而易见的需求。
Model 的设计应该满足“同一领域”数据被要求时,可以立即被重用。为了达到这个要求,Model对象不应该包含任何界面等呈现相关的功能,比如UIAlertView 的代码绝对不该出现在Model中。
设计一个Model,关键就是划分“问题领域”,我常看见诸如BookModel这样的类名,显然这有点为了Model而Model,而更可怕的是同时会出现BookModel 和 BookInfoModel,甚至还有BookDetailModel,这样的设计,仔细查看原因,大多是为了配合服务端Api接口,为每个接口定义了不同的“Model”,这违背了Model 的本意,并将Model“贫血化”了,而正如《重构》一书中指出:

如果一个类除了保存值外,什么都没干,应该重新考虑其存在的价值。

不应该出现只是用来传值的“对象”,应该构造Book对象,用来包含关于一本书相关的所有数据,及对这些数据的处理,包括持久化和数据库存储。因此,如果从服务端确实有BookInfo和BookDetail,可以将这两者作为Book对象的成员变量,而将这两者结合的值开放为新的属性。

相关文章

  • iOS开发基础:也许你从未定义过正确的Model对象

    最基本的,Model 应该包含应用所需的数据,常见的是这样: 一个Model应该表示某一领域专门的知识,它不仅提供...

  • MVC vs MVVM

    译自:Model-View-ViewModel for iOS 如果你已经做过iOS开发,不管多久,你可能都听说过...

  • Model-View-ViewModel

    Model-View-ViewModel 如果你已经开发一段时间的iOS应用,你一定听说过Model-View-C...

  • iOS开发基础:开发两年的你也不会写的Block

    iOS开发基础:开发两年的你也不会写的Block iOS开发基础:开发两年的你也不会写的Block

  • Model-View-ViewModel for iOS [译]

    如果你已经开发一段时间的iOS应用,你一定听说过Model-View-Controller, 即MVC。MVC是构...

  • dva model

    app.model dva 提供 app.model 这个对象,所有的应用逻辑都定义在它上面。 Model 对象的...

  • javascript(二)——DOM基础

    DOM概述 DOM定义 DOM(文档对象模型,Document Object Model)是W3C组织开发的一套便...

  • Swift3.x - 类和结构体

    类的介绍和定义 Swift也是一门面向对象的开发语言。 面向对象的基础就是类,类产生对象。 Swift如何定义类:...

  • 也许你从未“努力”过

    有些话我们常说,有些词我们张口就来,正是因为使用太频繁,很多话、很多词早就沦为没有灵魂的空壳。 比如“努力”这个词...

  • iOS-0 一些

    1 iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值 - 简书 2 iOS runti...

网友评论

  • Counting_S:还需要注意的就是不要盲目为了符合某些模式做过多冗余的操作,效率才是最重要的
    溪石iOS:这是类设计的一个基本要求:heavy_check_mark:
  • Noah1985:model层和view层不需要和业务有任何关联,提供接口让控制器进行通信即可。
    数据库接口不需要知道储存的是什么数据,知道怎么增查删改就可以了。
  • Noah1985:用层来描述model更合适,而不是某个类。数据库,包括与其通信的api就是model层。从数据库拿出来的数据是通信用的消息,model的一部分。状态也是不变的。
  • kao不会起名字:文章最后提到的内容相似的model,是要我们稍作处理,直接将服务器数据转化为其成员变量吗
    溪石iOS:@kao不会起名字 Book.detailInfo
    kao不会起名字:@溪石iOS 恩,一般你遇到这种情况怎么处理的
    溪石iOS:指 BookModel 和 BookInfoModel 那个例子吗?
  • 风雨兼程_勇往直前:我对model view controller 具体该做什么还是划分不清楚,你可以详细讲解一下吗?举个列子:我从后台获取一些用户信息,tableview展示这些用户信息,并实现按照姓名拼音排序,并可以实现本地搜索。你能大体讲下mvc各做什么吗?
    溪石iOS:@风雨兼程_勇往直前 http://www.jianshu.com/p/9e8fd85b61e0?utm_campaign=hugo&utm_medium=reader_share&utm_content=note 不知是否解答了你的疑惑?
    溪石iOS:@风雨兼程_勇往直前 参看另一篇文章,希望对你有帮助 http://www.jianshu.com/p/b5c9983cd1be

本文标题:iOS开发基础:也许你从未定义过正确的Model对象

本文链接:https://www.haomeiwen.com/subject/zncyrttx.html