软件设计

软件:
性质:可维护性,可复用性
认知:
可维护性与可复用性是相对独立的概念,对于面向对象的软件系统设计来说,在支持可维护性的同时,提升系统的可复用性是一个核心问题

可维护性:
软件的维护就是软件的再生,一个好的软件设计,必须能够允许新的设计要求以较为容易和平稳的方式加入到已有的系统中去,从而使这个系统能够不断焕发青春。

一个可维护性好的系统,允许维护工作能够以容易、准确、安全、经济的形式进行。
原因:
过于僵硬:无法加入新的性能
过于脆弱:修改一段代码会引发其他地方的变化
复用率低:代码的粘稠性太高,无法复用
黏度过高:保存原始设计与破坏原始设计
设计目标:
可扩展性:新的性能很容易加入到系统上去(过于僵硬)
灵活性:代码修改平稳进行,不会产生较大影响(过于脆弱)
可插入性:很容易将一个类抽出去,同时将其他的有同样的接口的类 加入进来(黏度过高)

可复用性:
传统的复用:
代码的剪贴复用:
算法的复用:
数据结构的复用:
缺陷:复用是以破坏可维护性为代价的

面向对象设计复用:
数据的抽象化和继承关系使得概念和定义可以复用
多态性使得实现和应用可以复用
抽象化和封装可以保持和促进系统的可维护性

复用的焦点不在集中在具体实现细节上,而集中在最重要的含有宏观商业逻辑的抽象层次上
抽象层次是提高复用性的同时提高可维护性的关键

抽象层次模块独立与具体模块,具体模块内部的变化不会影响抽象层次的结构,抽象层次的复用会变得简单

当一个软件系统是一个复用有道,易于维护的系统时,将新的性能加入到系统中去,或对一个已有的性能进行修改不是一件困难的事情


可维护性复用是以设计原则和设计模式为基础的

设计原则:
1.“开闭原则”:软件实体应该对扩展开放,对修改关闭
特征:
通过扩展已有的系统,可以提供新的行为,以满足对软 件的新需求,使系统具有一定的适应性和灵活性

已有的软件模块,特别是最重要的抽象模块不能再修改 ,使变化中的系统具有一定的稳定性和延续性
核心:
抽象化:
设计预见所有可能的扩展,而定义的抽象层,允许无穷 无尽的行为在实现层中实现

对可变性的封装原则:将系统中可变的因素,封装起来
特征:考虑的是什么会发生变化
同一种可变性的不同表象意味着同一个继承等级结构中的具体子类。继承应当被看做是封装变化的方法

一种可变性不应该与另一种可变性混合在一起

2.里氏替换:任何基类可以出现的地方,子类一定可以出现
基类与子类的继承关系是抽象化的具体体现,里氏替换是对实现抽象化的具体步骤的规范

3.依赖倒转:依赖抽象,不要依赖于实现
开闭原则是目标,依赖倒转是手段


4.合成/聚合复用:要尽量使用合成/聚合,而不是继承关系达到复用的目的
合成/聚合与里氏替换相辅相成,是对开闭原则的具体步骤的规范,前者要求先考虑合成/聚合关系,后者要求在使用的时候,必须确定这个关系符合一定条件

5.迪米特:软件实体应该与尽可能少的其他实体发生相互作用
6.接口隔离:为客户端提供尽可能小的单独接口,而不是 提供大的总接口


原文地址:https://www.cnblogs.com/monion/p/7050110.html