只要你想,哪怕是初学者也可以对代码进行重构。
首先要明白的一点是:重构是建立在代码正确可以运行的基础上对其进行优化、改进的过程,我们要做的是使能满足最基本的需求的代码变得更易读、易维护、效率更高 。
1.易读:
我们写的代码是给别人看的,写完的代码你不可能永远维护着,所以有必要让自己的格式代码更容易被别人看懂。
(1)足够多的换行、空格 ,反正解析代码的时候并不会解析这些空白的部分,不用白不用啊,还能显的代码行数多呢^^
(2)要做到这一点,最简单的是添加足够的注释,说明类和方法的功能,方法的入参出参的含义、格式,方法中关键语句的逻辑;
(3)命名方式:用直白的类名、方法名、变量名,用驼峰型(或其他你们项目组规定的变量格式),用$a,$123这样变量名的哪怕加了注释也是够了的。
2.不重复:
(1)类的功能不应该重复:如果重复了说明你应该考虑使用类的继承的
(2)方法的功能不应该重复:哪怕是在不同的类中,完成相同功能的方法用同一个就可以了,将方法的属性设置为public就可以被别的类调用了。如果有很多这样通用的方法,不妨建立一个专门的类存放这样的方法,不至于在调用的时候乱了手脚;
(3)重复使用变量:在类中频繁的使用某个变量,可以考虑创建一个全局的变量取代它,降低内存的耗用;
3.使用成熟的模式和框架:
通俗的说,模式就是前面很多人在进行相同的需求开发,发现自己累死累活的做出来的东西基本都是大同小异的,那么干嘛不创建一种模板,以后碰到类似需求开发的时候,直接套用不就好了。
《深入php对象、模式与实践》一书中讲了这样一个栗子(我改编成大家比较习惯的栗子):
假设有这么一个基类Lesson表示新东方的课程,Lesson类有两个子类:ChineseLesson类表示语文课程,EnglishLesson类表示英语课程;按照上课的形式分为白班和晚班两种,上课的课时和收费都不一样;
于是按照传统的方法会先建立5个类:Lesson类 - ChineseLesson类 - DayChineseLesson类()和NightChineseLesson类
- EnglishLesson类 - DayEnglishLesson类和NightEnglishLesson类
底层的4个子类中分别包含了课程安排的方法lesson()和收费的方法charge()
如果后面有更多种的课程或更多通用的方法(必然会如此),代码重复情况就更严重了,重复意味着高耦合,这是一种不好的现象
一种比较好的解决方案是采用策略模式,通过剔除最底层的方法将Lesson类 - ChineseLesson + EnglishLesson 简化,创建一个策略类Strategy类 - DayStrategy + NightStrategy 。
将Lesson类和Strategy类组合起来,通过创建Strategy类的子类添加新的课程安排或收费模式,并且不会影响到Lesson类
常用的设计模式:单例模式、策略模式、观察者模式、工厂模式……
常用的框架:Yii,thinkphp,CI……