可修改性的定义:
可修改性战术的目标是控制实现、测试和部署变更的时间和成本,系统或软件的能够快速地以较高的性价比对系统进行变更。
可修改性分为三类,分别是:
局部化修改——目标是减少由某个变更直接影响的模块的数量;
防止连锁反应——目标是限制对局部化的模块的修改,以防止对某个模块的修改间接地影响到其他模块;
延迟绑定时间——目标是控制部署时间并允许非开发人员进行修改。
举例说明:
局部化变更包括语义一致性,模块化处理等。这一部分可以借用设计模式的单一原则:一个类只负责一项职责,尽量做到类的只有一个行为原因引起变化.
用mvc的例子来说,setFamilyName类定义名字,setFamilyWork类定义工作,setFamilyPing定义评价。一个模块只负责一件事情,且不重复不重名,不影响到其它模块,这就是局部化变更的表现,分工明确也会使得代码变得简洁易读。
public void setFamilyName(String name){ model.setName(name); } public String getFamilyName(){ return model.getName(); } public void setFamilyWork(String work){ model.setWork(work); } public String getFamilyWork(){ return model.getWork(); } public void setFamilyPing(String ping){ model.setPing(ping); } public String getFamilyPing(){ return model.getPing(); }
防止连锁反应包括隐藏信息,接口隔离等,这一部分使用了接口隔离原则,即建立单一接口。
在这个例子里,就体现了接口隔离原则,建立了单一的接口,每一个类与类分离,每一个接口和接口分离,避免了数据的错误流动,也隐藏了信息,只传输数据。
public class Mainframe { private CPU cpu; private Memory memory; private HardDisk harddisk; private OS os; public Mainframe() { cpu=new CPU(); memory=new Memory(); harddisk=new HardDisk(); os=new OS(); } public void on() { cpu.run(); memory.check(); harddisk.read(); os.load(); } public void off() { cpu.off(); memory.off(); harddisk.off(); os.off(); } }
延迟绑定时间是给数据类足够的反应时间,创建缓冲层,在类与类间加入第三方类作为沟通,这样也会降低模块间的相互依赖。
这是一个创建缓冲区的例子,wrap方法可以利用已经存在的数据来创建缓冲区
byte[] myByte = new byte[] { 1, 2, 3 }; int[] myInt = new int[] { 1, 2, 3, 4 }; ByteBuffer byteBuffer = ByteBuffer.wrap(myByte); IntBuffer intBuffer = IntBuffer.wrap(myInt, 1, 2);
通过这样设计可以有效的避免一些bug,例如显示错误,显示的功能不全等。通过上述的战术,也可以用最少的代码量达成目的,在用户的使用上很方便简洁。因为已经隐藏了不需要显示的信息。对于后期的测试维护和更新也有着很大的帮助。代码的一致性使得测试人员对功能模块一目了然,维护人员则能很快找出问题的出生点,更新也提供了相应的接口,不用再一步步的阅读代码了解功能详细。