应小可爱们的强烈要求|终于把IT交流群给建起来了
(加群:370382869 聊技术)
1.什么是好代码
经常会听到“这个人是大牛,你不是”,“你写代码质量高,实习生写的程序很糟糕”,那么为什么这么说呢?当然就是看解决问题的能力以及代码的可维护性了。解决问题的能力,四哥已经在很多场合传授过很多经验技巧,今天我们就来看看第二条,代码的可维护性。
首先来思考一个问题,什么样的代码是好代码。有同学会说,有缩进,有注释,那么是不是呢?答案是“不是”。是的,有注释有缩进的代码只是说代码格式化比较好,有相应的说明,这些是代码规范啊,如果满足了这些基本规范就是好代码,岂不是太容易了。
其实好的代码要满足——高内聚低耦合。哇,新名词,什么叫做高内聚低耦合呢,我们分开来解释:
内聚
指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(程序段之间)联系的越紧密,则它的内聚性就越高。理想的内聚性要求模块的功能应明确、单一,即一个模块只做一件事情。
举个栗子,通过一个类就可以完成分页工具条的生成,这个类中呢对每一个流程都专门封装了一个方法,比如计算页码个数、配置工具条参数、生成最终html代码,这些方法之间互相调用,通过调用一个方法就可以得到一个完整的分页工具条代码,我们可以想到中间方法之间互相调用得到一个最终的结果,这就是高内聚的体现。
耦合
耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
我们这么说如果修改了一段代码,需要同时修改很多个文件,因为这个很多文件都调用了这段代码,我们就认为这个耦合性高,通过描述大家应该可以看到高耦合是不好的。
2.知识讲解
我们来看一个用户点击忘记密码后发送邮件的例子,通常我们可以这样实现
上面的代码中调用User类的ForgotPassword方法后,实例化邮件类 EmailSenderByQq并调用邮件方法发送邮件。User类依赖邮件对象 EmailSenderByQq,没有 EmailSenderByQq就发不了邮件。
突然有一天,QQ 的邮箱服务器挂了,或者我们不在使用QQ邮箱服务了,怎么办?可能你会说更换邮件发送类呗,把所有依赖 EmailSenderByQq对象的代码全部更新为163的邮件对象 EmailSenderBy163。
但是,我们的项目是一个牛逼闪闪的大项目,很多地方都实例化了 EmailSenderByQq(耦合严重) ,一个一个找到这个类,然后再一个一个的改掉,此刻你的脆弱的小心脏是否会感觉要挂掉,幼小的心灵是否会永远的留下伤痕?是不是很绝望,是不是很无助?但是代码是自己写的,哭着也要坚强地说没问题。
有好的解决方法吗?
我们把User类依赖的EmailSenderByQq对象,通过属性赋值的方式传递进去,降低User类对EmailSenderByQq对象的依赖。
当然我们也可以通过别的方式传递进去,比如构造方法和其它的setter方法,下面是一个构造方法的例子:
上面的代码写起来是不是还是很好理解?但是你知道吗,你已经使用了一个很牛的技术——注入。“注入”,就是把一个实例传递到另一个实例的内部。
当然呢,你还可以给相同功能的类制定一个规则,这个规则就是接口(interface)啦,而在User方法的构造方法中进行约束形参必须满足某一个接口。这样我们的代码就更健壮了呢。但是你知道吗,当你用接口进行了这些约束后,就又使用了一个更加牛的技术呢,这个技术就是——依赖倒置原则。
做个小结:有些听起来高大上的名词,其实并没有想象的那么复杂,技术就像一层窗户纸,就看你有没有能力捅破它!
源码快讯
2017年10月16日,我们源码时代迎来了第23期PHP的小可爱,在这接下来的4个多月里面,希望我们能共同进步,也许曾经有过迷茫,焦虑,但是未来,拼搏努力将会使我们前行的脚步变得坚定,期待蜕变~
推荐阅读