注:文章内容仅用于本人日常学习记录
一、前言
软件也像人一样,具有生命力,从出生到死亡,会经历多种变化。软件架构设计也不是一蹴而就的,是不断地演进发展。每个程序员都可以从理解编程原则和模式中受益。
软件设计原则是一组帮助我们避开不良设计的指导方针。根据Robert Martin的理论,应该避免不良设计的以下三个重要特点:
- 僵化:很难做改动,因为每一个细微的改动都会影响到系统大量的其他功能
- 脆弱:每当你做一次改动,总会引起系统中预期之外的部分出现故障
- 死板:代码很难在其他应用中重用,因其不能从当前应用中单独抽离出来
下面这些软件设计原则是我从一些书籍和网络中收集而来,并不完整,而且你也需要在一些有“冲突的原则”之间进行权衡和取舍。本文或许会对你的编程、程序设计、讨论或评审工作有所帮助。
二、通用设计原则
1. KISS
所谓KISS原则,即:Keep It Simple,Stupid,指设计时要坚持简约原则,避免不必要的复杂化,并且易于修改。
Everything should be made as simple as possible, but not simpler. - Albert Einstein
简单清晰、功能强大是软件设计最重要的原则和目标。但是软件工程天然错综复杂,而“简单”却没有一个衡量标准,判断和实现一个东西是不是简单,可以通过以下方式来参考。
- 让别的软件工程师以一种最容易的方式使用你的方案。
- 简单不是走捷径,不是为手边的问题找一个最快的方案。
- 当系统变得更庞大更复杂的时候依然能够被理解。
- 如果系统无法保持简单,那么我们能做的就是保持各个局部简单,即任何单个的类、模块、应用的设计目标及工作原理都能被快速理解。
我的理解:保持简单但不能掩盖软件丰富的内涵。即简约而不简单!简约是对复杂的事物抽丝剥茧、去除细枝末节显露主要逻辑的过程。就像小时候老师教写文章,要求尽可能用朴实的语言,言简意赅的写出来,但却又要避免语言过于贫乏。软件的“抽象”和它的“直观性”,其实是一对矛盾的关系,软件设计就要保证这两者的平衡。代码抽象过于复杂会陷入“过度设计”不易理解的困境;为了“直观性”缺乏抽象,长此以往又会出现大量的重复、不易于扩展和难维护的困境。
2. DRY
所谓DRY原则,即:Don't Repeat Yourself,不要让自己重复。
重复代码是软件程序变烂的万恶之首。DRY并不是指你不能复制代码,而是你复制的代码不能包含重复的“信息”。复制的东西并不仅仅是复制了代码,而是由于你把同一个信息散播在了代码的各个部分导致了有很多相近的代码也散播在各个地方。代码之所以要写的好,不要重复某些“信息”,因为需求人员总是要改需求,不改代码你就要“死”,改代码你就要加班,所以为了减少修改代码的痛苦,我们不能重复任何信息。举个例子,有一天需求人员说,要把分隔符从分号改成顿号!一下子就要改多个地方了。
所以,去掉重复的信息会让你的代码结构发生本质的变化。
“重复代码”有很多变体:
- 魔法数字、魔法字符串等
- 相同代码块
- 相似的代码逻辑及操作
对于消除重复的代码有事不过三法则。
- 第一次先写了一段代码。
- 第二次在另一个地方写了一段相同或相似逻辑的代码,你已经有消除和提取重复代码的冲动了。
- 再次在另一个地方写了同样的代码,你已忍无可忍,现在可以考虑抽取和消除重复代码了。
我的理解:解决重复的最佳的方式是通过培养良好的编码习惯来避免重复,通过重构的手段来消除重复。发现和解决重复并不困难,通过提取抽象、提取方法等措施就能消除重复,但困难的是立即行动去解决重复,从而不断的磨砺和提升自己的编程技艺,不断将私人代码变成公共代码,这才是自我提升的过程。解决了重复,经过一段时间,你就会发现,你对整个系统的理解程度在不知不觉中提高了不少。
3. Maximize Cohesion, Minimize Coupling
所谓Maximize Cohesion,Minimize Coupling原则,即:高内聚低耦合。这是判断设计好坏的标准,主要是看模块内的内聚性是否高,模块间的耦合度是否低。
- 耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。
- 内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。
内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他模块之间是低耦合。在进行软件设计时,应力争做到高内聚,低耦合。
Java中实现高内聚低耦合的常用方式:
- 少使用类的继承,多用接口隐藏实现的细节。
- 模块的功能化分尽可能的单一,道理也很简单,功能单一的模块供其它模块调用的机会就少。
- 遵循一个定义只在一个地方出现。
- 少使用全局变量。
- 类属性和方法的声明少用public,多用