如何用C#实现依赖注入?
二.外家白箱之道:可读性与复用性
软件设计的“外家”白箱之道,包括可读性、高灵活性、易扩展性、通用性、可移植等。这里主要详细介绍两点:一是可读性,二是复用性。
一个软件的生命周期中,80%的时间和成本花费在维护上。我们可以看到几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护。无论是从软件的修改,测试还是移植的角度来看,软件的可读性都需要提到一个非常重要的位置上。常用改善软件的可读性方法有编码规范,而不仅仅是详细的注释说明。可读性强的编码规范对于程序员尤为重要,可以让程序员尽快而彻底地理解新的代码。另一个方面,可读性强的设计对测试检查Bug也是非常重要。因此建议在软件设计中必须执行规范,每个软件开发人员必须一致遵守编码规范,提高程序的可读性。
为了应对软件危机的需要,软件设计原则的最高层次是:复用性、扩展性。很多的软件方案中,开宗明义自己的设计原则是面向对象。那么,当我们把需求影射成为一个一个的对象,就是好的设计吗?事实上,如何划分、设计真正好的对象,是非常难以掌握的。实际上,我们都知道面向对象的基本初衷是代码复用。可复用性是通过复用之前的劳动成果提高开发效率,降低成本。围绕可复用性有很多东西和层次,如代码级别的复用,设计的复用,组件的复用,还有框架的复用等。
软件的复用除了可以提高软件的生产率,并且恰当的复用可以提高软件的可维护性。在以前,复用主要是代码,函数,结构的复用。而现在复用主要针对类,接口,组件等。但是复用并不一定会保证软件的可维护性。不能因为代码的重复等原因就复用,需要根据具体的情况来分析。要想通过复用来加强系统的可维护性,必须保证复用是支持可维护性的复用。
下面的一些最基本的确设计原则可以用来指导实践。
开-闭原则(OCP):开闭原则是面向对象可复用的基石。它主要指:一个软件实体对扩展开放,对修改关闭。在设计一个模块的时候,应当是这个模块在不被修改的前提下被扩展。满足这个原则的系统在一个较高层次上实现了复用,也是易于维护的。
那如何才能满足开闭原则呢?抽象化是关键,要区分开抽象层和实现层。在一个软件系统中,抽象层应该是相对稳定的,而实现层是可以改变和扩展的。我们可以把许多事物和问题抽象起来,并且抽象它们不同的层次和角度。开闭原则也是对可变性的封装原则,找到系统的可变因素,并将其封装起来。把一种可变性封装为一个对象,那么这种可变性的不同表象就是这个类的具体子类。
里氏代换原则(LSP):里氏代换原则是继承复用的基石:在任何父类出现的地方都可以用它的子类来替代。实际上,设计类的阶层体系结构时,这是一条很重要的原则。另一个需要着重提到的是依赖倒转原则(DIP):就是说要依赖于抽象,不要依赖于具体的实现。在传统的过程性系统中,高层的模块依赖于低层次的模块,抽象层次依赖于具体层次。这样导致了底层的任何改变都会影响到上层。这样的软件系统没有可维护性而言。抽象层次应该不依赖于具体的实现细节,这样才能保证系统的可复用性和可维护性,这也就是所谓的倒转。
在实际中如何应用这一原则呢?要针对接口编程,而不针对实现编程。那么当实现变化时,不会影响到其他的地方。在java中应当使用接口和抽象类来进行变量的类型声明,参数的类型声明,方法的返回值类型等等。以抽象的方式进行耦合是依赖倒转原则的关键。依照依赖倒转原则,在系统中会出现大量的类,如抽象类和接口,因为它假定所有的具类都是有可能变化的。
0
相关文章