iOS中什么是耦合度

最近刚好在找工作,其实很多公司在面试的时候会问一些问题,比如问到我一个问题是假如有多个异步下载任务同时进行,你需要显示当前全部任务的下载进度你将如何实现。我选择的是用线程组来统计,每个线程都有一个对应的变量float值来保留线程的下载进度,为了不频繁的计算下载进度,我选择用GCD的循环来定时做计算来显示下载的进度。对方就问我了,每个线程都有一个变量的话,那势必都在一个方法里,那么后期维护将会很麻烦,有没有更好的办法,当时我有点懵,不知道怎么回答,其实这涉及到代码的耦合度和繁重问题。其次很多公司也会问你有哪些优化代码的方法,或者哪些代码规范,为什么要这样规范,我平时自己写代码有一套自己的习惯,但是自己没有去深究,甚至说代码的耦合度其实也有尽量降耦合,但是真的要说起来我都有哪些技巧,却一个都说不出来。就像自己有点小经验,但是却不知道所以然来,所以我特意去学习了一下什么是耦合度以及降耦合的技巧。

耦合度的道理其实说起来很简单,就是模块之间相关联程度的度量,指模块与模块之间的关联性,所谓的低耦合就是将两个模块之间的关联性尽可能的降低,一个模块的改动对于其他模块的影响尽量小。这样的话看起来很明了,平时简单的功能做起来也不难,比如一些简单的低耦合技巧:给tableViewCell赋值的时候,如果有dataSource,那么有些人会在tableView的代理中从dataSource取出需要的数据来赋值给cell,这样就增大了主视图的代码,增大了cell和主视图的联系,这时候就可以改为将dataSource里面的Model赋值给cell并重写setModel方法来实现低耦合。

那么那些平时不明显的高耦合都有哪些?

例如短信备份时,短信备份的代码是由A程序员写的,界面的UI是由B程序员写的,这时客户要求加一个进度条对话框,A程序员提供一个普通方法,B把ProgressDialog对象传进去,由A给进度条设置最大值,以及备份过程的进度,从而达到显示进度的效果,如果客户又要求ProgressDialog太丑了,要换成ProgressBar,此时A和B都要修改代码,代码的耦合度太高,可以由A提供一个回调函数,B只需根据回调函数进行处理,从而降低代码的耦合度,所以代理可以有效的降低代码的耦合度,就如何系统原生的tableView的列表视图,也是为什么tableView可以直接设置rowHeight以及代理中可以设置了,这都是为了低耦合的处理。

另外,再分享一些降低耦合的方法:1、少使用类的继承,多用接口隐藏实现的细节。2、模块的功能化分尽可能的单一,道理也很简单,功能单一的模块供其它模块调用的机会就少。3、遵循一个定义只在一个地方出现。4、少使用全局变量。5、类属性和方法的声明尽量在.m中。 6、多用设计模式,比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度。7、最后当然就是避免直接操作或调用其它模块或类(内容耦合);如果模块间必须存在耦合,原则上尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,避免使用内容耦合。

最后值得注意一点,一定要少使用Runtime这种黑魔法技巧,因为它的巧妙会避开程序crash导致到你完全不能够发现问题所以,这一点一定要切记!

你可能感兴趣的:(iOS中什么是耦合度)