文档章节

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

召唤攻城狮
 召唤攻城狮
发布于 2014/04/10 18:49
字数 1276
阅读 3028
收藏 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中初始化赋值最好。

© 著作权归作者所有

共有 人打赏支持
召唤攻城狮
粉丝 183
博文 53
码字总数 49671
作品 0
玉林
私信 提问
一封来自大牛的招聘感悟: iOS开发人群到底怎么了?

上面讲到: 我通过降低招聘要求,吸引来了一大波求职者!下面是我的招聘要求: 熟练组件化架构,MVP,MVVM,MVC,ROUTER有较强的理解; 熟练掌握Objective-C语言,理解面向对象编程思想,具有较强的设...

_小迷糊
11/24
0
0
苹果将推出 Swift 2.0 编程语言,应用容量将变小

除了重组开发团队,改进对旧款 iOS 设备的支持,苹果正准备升级 Swift 编程语言。Swift 在2014年 WWDC 上正式发布,而新版 Swift 将会同时为开发者和用户带来更好的体验。因为 Swift 仍然是开...

oschina
2015/05/24
4.2K
19
相比于前端,为什么移动端程序员没那么抢手了?

最近经常有一些移动端开发的小伙伴向我们招聘体验师反映,工作好像没有去年那么好找了。这是个案还是一个普遍现象?我们带着这个问题研究了一下 100offer 平台上的拍卖数据。 今年互联网就业...

oschina
2016/04/11
16.2K
29
iOS项目开发

主要需求: 通过远程网络对汽车进行OBD(启动、熄火、门锁检测、车辆状态设置与检测、胎压等相关汽车状态的设置与获取展示) 工作内容: 1. 熟悉车载CAN、OBD相关行业知识 2.负责智能穿戴产品I...

黄淑宾
2017/02/22
3
0
iOS 学习资料整理

视频教程(英文) Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Applic...

拉偶有所依
2015/01/19
2.2K
4

没有更多内容

加载失败,请刷新页面

加载更多

SRE的含义及与 DevOps 如何关联?

虽然站点可靠性工程师(site reliability engineer SRE)角色在近几年变得流行起来,但是很多人 —— 甚至是软件行业里的 —— 还不知道 SRE 是什么或者 SRE 都干些什么。为了搞清楚这些问题...

linuxCool
10分钟前
1
0
月入3万之一个程序员的转行坎坷历程

陈年往事 “我月入3万,怎么会少少了你一个鸡蛋啊?” 这是2017年9月左右的一个新闻,一位煎饼摊大妈因和顾客争执时脱口而出这样一句话而走红。当时还上了各大新闻的头条。 互联网兴起今天,...

苏南-首席填坑官
32分钟前
1
1
OSChina 周一乱弹 —— 眼看着这颗陨石砸了下来

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Nachtblut的单曲《Antik》 《Antik》- Nachtblut 手机党少年们想听歌,请使劲儿戳(这里) @mr_chip :上海的初雪之后有点冷 ...

小小编辑
57分钟前
266
7
Confluence 6 修改导航显示选项

选择 子页面(Child pages)来在边栏中查看当前页面的子页面。 选择 页面树(Page tree)来查看整个空间的页面树,扩展当前的页面。 你也可以选择是否完全隐藏导航显示选项或者添加你希望可见...

honeymose
今天
2
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部