文档章节

iOS开发,对低耦合高内聚的理解

召唤攻城狮
 召唤攻城狮
发布于 2014/04/10 18:49
字数 1276
阅读 3018
收藏 4

耦合并不是软件开发中的专用语言,在初中和高中物理中就有电磁学方面的耦合,还有印象中机械设备之间也有耦合的概念,所以软件开发中的耦合只是来源于生活,用之于软件工程学。

就拿机械设备中的耦合来类比说明吧,我们都知道长途货运车,把车头和车身分别想象成两个不同功能的模块,车头的发动机负责驱动,车身负责装载货物,两个模块之间应该是较低的耦合度,只要车头和车身之间有一个坚固链接的铁轴,这是它们之间耦合度的一个主要结构,再附加上一些电路线之类的零件用以从车头控制车身的灯光,这基本就是两者之间的低耦合的体现;而车身和车头自身则要高内聚,车身主要提供宽敞的空间来存放货物,车头内部复杂的电路系统和发动机驱动,用来给整个车子提供动力,以及控制电路系统。

那么在回到iOS开发过程中,低耦合和高内聚的体现,现在有一个自定义的UITableViewCell,用于显示一个用户发布的内容,显示的界面包括用户名username、时间time、头像header、发布的内容content、点赞的数量like,所以这个自定义Cell包括的UI元素如下,

@interface  CustomTableViewCell:UITableViewCell

@property (nonatomic, strong) UILabel *timeLabel;

@property (nonatomic, strong) UILabel *usernameLabel;

@property (nonatomic, strong) UIImageView *headerImageView;

@property (nonatomic, strong) UILabel *contentLabel;

@property (nonatomic, strong) UILabel *likeLabel;

@end

我们都知道Cell数值内容的获取是在

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{}中实现的,

我们在{}括号中来写一段比较菜的代码,

{

    //.....

    //关键代码

    NSString *name = [_names objectAtIndex:indexPath.row];

    NSString *time = [_times objectAtIndex:indexPath.row];

    UIImage *header = [UIImage imageNamed:[_headers objectAtIndex:indexPath.row]];

    NSString *content = [_contents objectAtIndex:indexPath.row];

    NSNumber *like = [likes objectAtIndex:indexPath.row];

    //.....

    cell.timeLabel.text = time;

    cell.usernameLabel.text = name;

    cell.headerImageView.image = header;

    cell.contentLabel.text = content;

    cell.likeLabel.text = [NSString stringWithFormart:@"%@",like];

}

这样的代码写的是很有问题的,首先就没有将信息所包含的对象给封装起来,我们把包含time、username、header、content、like的糗事封装成对象Qiushi(糗事),下面是Qiushi对象的代码,

@interface  Qiushi:NSOjbect

@property (nonatomic, strong) NSString *username;

@property (nonatomic, strong) NSString *time;

@property (nonatomic, strong) NSString *content;

@property (nonatomic, strong) NSString *header;

@property (nonatomic, strong) NSNumber *like;

@end

在CustomTableViewCell所在的ViewController中将qiushi加入qiushiArray数组,然后在

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}

的括号{}中这样写,

{

    //.....

    //关键代码

    Qiushi *qiushi = [qiushiArray objectAtindex:indexPath.row];

    cell.timeLabel.text = qiushi.time;

    cell.usernameLabel.text = qiushi.username;

    cell.headerImageView.image = [UIImage imageNamed:qiushi.header];

    cell.contentLabel.text = qiushi.content;

    cell.likeLabel.text = [NSString stringWithFormart:@"%@",qiushi.like];

    //.....

}

这样我们将username、time、content、like、header等属性封装在Qiushi这个对象中,这就是初级的MVC使用了。那么看上面的代码,有没有觉得不妥的地方,你看上面红色的cell.timeLabel、cell.usernameLabel。。。等等赋值方法,像不像Cell对象与ViewController之间的连线,这种情况就是高耦合了,因为连接的线太多了,为了降低耦合度,我们给CustomTableViewCell添加Qiushi属性变量,如下,

@interface  CustomTalbeViewCell:UITableViewCell

@property (nonatomic, strong) UILabel *timeLabel;

@property (nonatomic, strong) UILabel *usernameLabel;

@property (nonatomic, strong) UIImageView *headerImageView;

@property (nonatomic, strong) UILabel *contentLabel;

@property (nonatomic, strong) UILabel *likeLabel;

@property (nonatomic, strong) Qiushi *qiushi;//新增加的Qiushi对象属性变量

@end

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}

的括号{}中这样写,

{

    //.....

    //关键代码

    Qiushi *qiushi = [qiushiArray objectAtindex:indexPath.row];

    cell.qiushi = qiushi;

    //.....

}

这样是不是在Controller中少了很多代码,这时候获得了qiushi数据的cell对象,想怎么在其UIView控件上面显示数据就让它自己去做,比如,可以在其内部这样写代码填充UILabel、UIImageView上面的数据内容,

- (void)setQiushi:(Qiushi)qs

{

    self.timeLabel.text = qs.username;

    self.contentLabel.text = qs.content;

    self.header.image = [UIImage imageNamed:qs.header];

    ....

}

这样就是使用MVC降低耦合度,提高了代码的可读性,即Controller作为View和Model(此处就是Qiushi)之间的桥梁,View不与Model直接交流,只负责显示Controller传递给它的数据。

这就是为什么说MVC是iOS设计模式之王,因为使用MVC可以有效的将项目的模块分工明确,降低了不同模块之间的耦合度,提高了可读性和可扩展性。

上面是我自己总结的一个使用场景,当然还有更多的场景,需要降低模块之间的耦合度,比如两个Controller页面之间切换,ViewController1 push进入ViewController2,那么第二个ViewController2之间的数据显示什么内容,完全就是ViewController1决定的,你可以想下面这样写代码,

ViewController1

{

    ViewController2 VC2 = [[ViewController2 alloc] init];

    VC2.name = @"xxxx";

    VC2.content = @"xxxx";

    [VC2 setTitle:@"xxx" image:[UIImage imageNamed:@"xxx"]];

    [self.navigationController pushToViewContorller:VC2];

}

看看上面的代码,通过三条语句来给VC2赋值,我们都能看出来哪里不好,优化的方式就是尽量减少VC2方法的调用和属性的赋值,能通过尽量少的代码进行VC2中初始化赋值最好。

© 著作权归作者所有

共有 人打赏支持
召唤攻城狮
粉丝 184
博文 53
码字总数 49671
作品 0
玉林
转:一套代码iOS、Android两端运行,Google Flutter意味着什么?

原文:https://www.toutiao.com/a6569388465538990600/?ttfrom=weixin&utmcampaign=clientshare×tamp=1529580533&app=newsarticle&utmsource=weixin&iid=35476649324&utmmedium=toutiao......

鸿蒙无上至尊
06/22
0
0
iOS项目框架架构模式(MVC、MVVM、MVCS、VIPER的选择)

联系人:石虎 QQ:1224614774昵称: 嗡嘛呢叭咪哄 QQ群:807236138群称: iOS 技术交流学习群 一、概念 没有最好的架构,只有适合自己的业务的架构才是最好的架构,并且它是逐步地变强变大。 架构...

石虎132
09/12
0
0
推荐几个牛逼的iOS开发常用框架及Xcode插件

管理工具 1. CocoaPods 搞iOS开发的应该都知道的,管理框架,并解决依赖问题。不可不用。下面用到的框架基本都可以用这个搜索和进行安装。怎么用搜搜教程就好了。和后文提到的配套使用,操作...

Harry_1234
2017/10/23
0
0
人工智能转战餐饮赛场?Clinc推出AI服务员

人工智能转战餐饮赛场?Clinc推出AI服务员 2018-09-04 11:02编辑: Gboy分类:AI来源:36kr AI 招聘信息: iOS开发 iOS开发 iOS开发 app开发上架H5技术 app开发技术 图像处理及模式识别工程师...

Gboy
09/04
0
0
一套代码iOS、Android两端运行,Google Flutter意味着什么?

作者 | 屠敏 一套代码可支持 Android 和 iOS 双端运行,你 Get 了吗? 它就是 Flutter。其目标是为了解决移动中的两个重要问题:一是实现原生应用的性能和与平台的集成,二是提供一个多平台,...

终端研发部
06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RedHat已更改其开源许可规则

对于编程圈外的人来说,软件许可证似乎并不重要,但是,在开源领域,开源许可是非常重要的。 因此,领先的Linux公司Red Hat宣布了一件大事,所有新的由Red Hat发起的使用GNU通用公共许可证(...

linux-tao
8分钟前
0
0
游戏化策划的反馈机制

简评:如何低成本地设计游戏化活动运营方案 当项目活动组采用游戏化机制来设计活动时,往往会犯一个错误 —— 以为物质奖励(金钱或实物)就是终极奖励。然后一次又一次的证据显示,有形奖励...

极光推送
10分钟前
0
0
PHP "延迟静态绑定" 功能,static

从这个名字的定义提取出两个关键点,第一点静态,也就是说这个功能只适用于静态属性或静态方法。 第二点延迟绑定,这个根据下面代码就可以很好的理解 class A{ static $name = "Tom";...

nsns
14分钟前
1
0
《看图轻松理解数据结构与算法系列》导引贴

最近学习数据结构,遇到一个很喜欢的博主,他的文章图文并茂,理解起来很容易。特此开贴记录,方便反复阅读。 博主主页 https://juejin.im/user/57c3970f79bc440063e58518/posts?sort=popul...

科陆李明
51分钟前
1
0
20.27 分发系统介绍~ 20.30 expect脚本传递参数

分发系统介绍分发系统-expect讲解(也就是一个分发的脚本)场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因...

洗香香
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部