锋行天下

生命不息,奋斗不止

导航

面向对象设计思想(导入篇 ---> 上)

Posted on 2012-07-30 01:23  Romant Sun  阅读(483)  评论(2)    收藏  举报

 

如何同时提高一个软件系统的可维护性可复用性,是面向对象设计要解决的核心问题。

 

可维护性低的 4 个症状:

     
  •   过于僵硬

    很难加入新的功能。加入新功能,不仅意味着构造一个独立的模块,而且因为这个新功能会波及很多其他模块,最后变成跨越几个模块的改动。由于这种设计上的缺陷,项目经理不敢轻易向系统加入新功能。这就造成了一个系统一旦做好,就不能增加新功能的僵硬化情况。

    针对“新增功能”,也就是系统的“可扩展性”差


 

  •   过于脆弱

    与过于僵硬同时存在,对一个地方的改动,往往会导致看上去没有关系的另外一个地方发生故障。在修改完成之前,连系统的原始设计师们都无法确切预测到可能会波及哪些地方。这种一碰就碎的情况,造成了软件系统过于脆弱。

    针对“修改已有功能”,也就是系统的“灵活性”差

 


  •   黏度过高

    有的时候,改动可以用保持原始设计意图和原始设计框架的方式进行,也可以用破坏原始意图和框架的方式进行。第一种方式无疑会对系统的未来有利,第二种方式只是权宜之计,可以解决短期的问题,但却会牺牲中长期的利益。

    一个系统设计,如果总是使得第二种方式比第一种方式容易,就叫做黏度过高。一个黏度过高的系统会诱使维护它的程序员采取错误的维护方案,并惩罚采取正确维护方案的程序员。

    针对“替换现有功能”,也就是“可插入性”差

 


 

  •   复用率低

    所谓复用,就是指一个软件的组成部分,可以在同一个项目的不同地方甚至另一个项目中重复使用。每当程序员发现一段代码、函数、模块所做的事情是可以在新的模块、或者新的系统中使用的时候,总是发现,这些已有的代码依赖于一大推其他的东西,以至于很难将它们分开。最后,大家发现最好的办法就是不去“碰”这些已有的东西,而是重新写自己的代码。过程中也可能通过源代码复制与粘贴的方式,以最原始的复用方式,节省一些时间。


 

 

提升可维护性的 4 个目标


  •   可扩展性
      新的功能可以很容易地加入到系统中。这是“过于僵硬”的对立面。


  •   灵活性
      允许代码修改平稳进行,而不会波及到其它的模块。这是“过于脆弱”的对立面。


 

  •   可插入性
      可以很容易地将一个类抽出去,同时将另一个有同样接口的类加入进来。这是“黏度过高”的对立面。

  •   可复用性 


如何实现这些系统设计的目标呢?

 

        可扩展性:-闭原则、里氏代换原则、依赖倒置原则、组合/聚合复用原则

      灵 活 性:-闭原则、迪米特法则、接口隔离原则

      可插入性:-闭原则、里氏代换原则、组合/聚合复用原则、依赖倒置原则 



系统的可复用性

 

  • 复用的重要性
     
    • 提高生产效率

    •  
    • 提高软件质量

    •  
    • 改善可维护性

  • 传统的复用
     
    • 代码的复制与粘贴

    •  
    • 算法的复用

       
    • 数据结构的复用

一个致命缺陷是复用常常以破坏可维护性为代价。比如,两个模块AB同时需要使用一个模块C的功能。那么,当A需要C增加一个新的行为时,B有可能不需要,甚至不允许C增加这个新行为。如果坚持复用,就不得以系统的可维护性为代价;而如果从保持系统的可维护性出发,就只好放弃复用。

 


  • 面向对象设计的复用
    •  
    • 复用焦点从实现细节提升到抽象层次
       
    • 更好地改善软件系统的可维护性

    •  

面向对象设计通过提供了封装、继承和多态等特性,使得一个系统可以在更高的层次上提供可复用性。数据的抽象化和继承关系使得概念和定义可以复用;多态性使得实现和应用可以复用;而抽象化和封装可以保持和促进系统的可维护性。 



面向对象思想的三大核心要素


  • 封装
     
    • 封装,就是合理的隐藏与公开

    •  
    • 对数据的隐藏、对实现的封装、对变化进行封装

    •  
    • 提高代码可读性,使系统更易理解和使用

  • 继承
     
    • 重用和抽象的基础

    •  
    • 可以自上而下设计,也可以通过重构自下而上

    •  
    • 优先使用合成/聚合,而不是使用继承


  • 多态
     
    • 对象在不同时刻体现为不同类型的能力

    •  
    • 将对象形态的决定权交给了调用者,保证了程序的灵活性

    •  
    • 还保证了程序的稳定性

    •  

     面向对象思想包含三个核心要素,即:封装、继承、多态,它将面向对象技术推到了思想的境界。只有真正理解了这三个要素,才算得上掌握了面向对象思想的精髓。


 

对象的封装、继承与多态,保证了对象的高内聚与低耦合,有利于软件模块的复用,保证了程序的可扩展,这也是面向对象思想在软件设计中的最大优势。

 



未完待续。。。