文档章节

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

召唤攻城狮
 召唤攻城狮
发布于 2014/04/10 18:49
字数 1276
阅读 3008
收藏 4
点赞 5
评论 0

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

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

那么在回到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
玉林
又拍云Prism CDN 超低价 低延时 超强兼容的P2P-CDN

又拍云Prism CDN 超低价 低延时 超强兼容的P2P-CDN 2018-05-15 10:26编辑: 枣泥布丁分类:业界动态来源:https://www.upyun.com/products CDN又拍云 招聘信息: C++工程师 Cocos2d-x游戏客户...

枣泥布丁 ⋅ 05/15 ⋅ 0

2018 年过去了一半,iOS 工程师如何自我提高。上篇

如果从 13 年移动客户端大火开始算起,至今已经有五个年头了。现在移动端的形势也不需要太多的废话来描述,一句话总结就是:“浪潮退去,谁在裸泳一看就清楚。”我希望借助这篇文章来聊聊在我...

浪漫程序员 ⋅ 05/22 ⋅ 0

数字资产安卓-IOS手机云挖矿系统APP开发

对于数字资产安卓/IOS手机云挖矿系统APP开发(加V信ruiec2723),大家是怎么看的呢?我们该如何去评价手机挖矿系统呢?或许很多人都不了解手机挖矿系统是什么?今天我就来为大家讲解一下手机...

数字资产先生 ⋅ 05/08 ⋅ 0

iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd ⋅ 04/17 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

如果因为不懂就拒绝区块链,那真的有点遗憾了…

如果因为不懂就拒绝区块链,那真的有点遗憾了… 2018-04-18 09:40编辑: 枣泥布丁分类:业界动态来源:CVP平台 CVP开发者沙龙421 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程...

枣泥布丁 ⋅ 04/18 ⋅ 0

如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课 ⋅ 04/26 ⋅ 0

iOS ZipperDown 漏洞来袭,我们该如何应对?

  昨天傍晚盘古实验室负责任的披露了针对 iOS 应用的 ZipperDown 漏洞,并提供了检索、查询受影响应用的平台: zipperdown.com。基于目前公开的信息,该漏洞的影响面比较大,15000 多个应用...

FreeBuf ⋅ 05/16 ⋅ 0

iOS自定义弹出视图、收音机APP、图片涂鸦、加载刷新、文件缓存等源码

iOS精选源码 一款优秀的 聆听夜空FM 源码(http://www.code4app.com/thread-14546-1-1.html) zhPopupController 简单快捷弹出自定义视图(http://www.code4app.com/thread-14861-1-1.html) WHS......

sunnyaigd ⋅ 06/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 33分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 40分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 47分钟前 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 48分钟前 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 52分钟前 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 56分钟前 ⋅ 0

建造模式

《JAVA与模式》之建造模式

Cobbage ⋅ 今天 ⋅ 0

WePY框架开发的小程序如何在微信web开发者工具中运行起来

一、首先需要安装node.js,安装步骤如下: 首先下载安装包 https://nodejs.org/en/download/ 点击下载相应的zip版本 然后将文件夹解压到任意目录 比如我这里解压到了:C:\Program Files\node...

Helios51 ⋅ 今天 ⋅ 0

使用EnumSet 代替位域(32)

1、位域(Bit field):使用or 运算将几个常量合并到一个集合中 位操作,可以有效地执行 AND 、OR 这样的位操作 但是 位域比int 常量枚举缺点更多 2、java.util 包里面的EnumSet 类是有效的替...

职业搬砖20年 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部