1、软件设计是什么
软件设计是为了长期更加容易地适应未来的变化。正确的软件设计方法是为了长期地,更好更快、更容易地实现软件价值的交付。
2、软件设计的目标
软件设计就是为了完成如下目标,其可验证性、重要程度依次减低。
> 实现功能(需求)
> 易于重用
> 易于理解
> 没有冗余
(1)实现功能
实现功能的目标压倒一切,这也是软件设计的首要标准。如何判定系统功能的完备性呢?通过所有的测试用例!
测试用例就是对需求的阐述,是一个闭环的反馈系统,保证其系统的正确性;及其保证设计的合理性,恰如其分;
(2)易于重用
易于重用的软件结构,使得其应对变化更具弹性;可被容易的修改,具有更加适应变化的能力。
最理想的情况下,所有的软件修改都具有局部性。但现实并非如此,软件设计往往需要花费很大的精力用于依赖的管理,让组件之间的关系变得清晰、一致。
软件设计的最高标准是什么呢?“高内聚、低耦合”原则是提高可重用性的最高原则。
(3)易于理解
好的设计不只是知道计算机指令,更重要的是能让其他人也能容易地理解,包括系统的行为,业务的规则。那么什么样的设计才算得上易于理解呢?
Clean Code(代码整洁)
这个包含很多,如格式、封装等。
Implement Patterns(实现模式)
采用通用的实现模式,特别是一个组织或开发团队。如DDD(领域驱动设计)、架构模式、DCI、设计模式等,是开发人员形成的共识。
Idioms
遵循一些设计原则,如简单设计原则、正交设计原则、面向对象设计原则、高内聚低耦合原则、小类大对象等原则。
(4)没有冗余
没有冗余的系统是最简单的系统,恰如其分的系统,不做任何过度设计的系统。
Dead Code
从未被执行的代码。
YAGNI(You Ain't Connna Need It)
不要做过度设计:你没有必要那么着急,不要给你定义的类实现过于早的功能,只需要先实现好现在需要的功能点。
KISS(Keep it simple,Stupid)
尽量保持简单
3、软件设计的正交性
> 正交(orthogonality)意味着独立性,如果A的改变不影响B,那么A和B在设计上是正交的。
> 设计正交,即意味着设计的解耦(Decouple),通过解耦,消除不相关组件之间的影响。
> 设计不正交,即意味着耦合度高,牵一发而动全身,难以变更和修复。
4、软件正交设计四原则
(1)消除重复性
函数代码重复、数据成员重复、子父类重复、结构性重复,重新发明轮子,... 一切形似重复都要革除。
重复类型 | 处理 |
完全重复 | 删掉重复 |
参数型重复:两个函数的算法相同,只是处理的数据不同 | 将差异的数据参数化 |
调用型重复 | 如果两个函数的重复部分完全相同,可以将重复的部分提取为函数Func,然后原函数各自对Func进行调用 |
回调型重复 | 如果两个函数的重复部分完全相同,可以将重复的部分提取为函数Func,将差异的部分形成原型相同的两个函数s1、s2,然后通过函数Func分别对s1、s2进行调用 |
消除重复不影响原有功能的重用粒度。
重复产生的常见原因:
> 低成本(复制粘贴)
> 对于变化的恐惧(另起炉灶)
> 不易识别(代码混乱)
> 价值导向(不重视内部质量)
> 认知差异(不具备敏锐的洞察力)
重复和重用
> 消除重复的过程就是一个提供系统可重用性的过程;
> 提供系统的可重用性,也就是降低了未来产生重复的可能;
> DRY(Don't repeat yourself)
> OAOO (Once and only once)
> SRP(Singular Responsibility Principle)
(2)分离关注点
不同关注点的变化方向不一样,分离是为了更好的隔离变化。
(3)减少不必要的依赖
依赖总是会有的,不必要的依赖关系会带来变化的脆弱性。
(4)向稳定的方向依赖
依赖稳定点,稳定点即编程契约:抽象类、接口、概念