编程原则

本文罗列了软件开发中的编程原则,这些原则是多年来软件行业的最佳实践和规律总结,每一个原则不是孤立的,你常常须要在相互冲突的原则之间进行权衡.
 
KISS(保持简单傻瓜)
大部分系统若是能保持简单而不是复杂时会工做得很好.由于:
  • 更少的代码只花费更少的时间编写,有更少的错误,更容易修改.
  • 简单是终极的成熟.
  • 一点都不能移除时才是完美,而不是在没有什么可增长时.
 
YAGNI
YAGNI是"你不须要它"的意思,直到你须要时再实现.由于:
  • 任何为明天所须要的功能而实现编程工做,意味着失去了为当前功能进行迭代的努力.
  • 它会致使代码膨胀;软件变得更大更复杂.
如何作?
当你真正须要的时候再去实现,而不是你预想你会须要它们时就去实现.
 
作只要能运行的事情
若是咱们只是针对问题工做,针对问题的真正实施过程才能效率最大化.所以,常常问你本身:什么是让它工做的最简单事情?
 
分离关注
分离的关注是一个设计原则,将计算机程序分离成不一样的部分,使得每一个部分解决了一个单独关注点.例如,应用程序的业务逻辑是一个关注点,用户界面是另外一个关注点.改变用户界面不该该要求更改业务逻辑,反之亦然.
  • 简化软件应用程序的开发和维护.
  • 当关注是分离的,单独的部分能够重复使用,以及独立开发和更新.
将程序功能切分红不一样模块,尽量让相互重叠比较小.
 
让事情DRY
每个知识都必须有一个单一的,明确的,在一个系统内的权威表示. 不要重复,须要干脆.
在一个程序中的每个重要的功能都应该在源代码中的一个地方实现.
  • 重复(无心或有目的的重复)可能会致使维护噩梦,不可能的因式分解和逻辑矛盾.
  • 任何一个系统的任何一个元素的修改不须要在其它逻辑上修改无关的元素.
  • 逻辑上相关的全部元素的变化,必须能够是可预见的和均匀的,这样才能保持同步.
如何作?
  • 将业务规则,长表达式, if语句,数学公式和元数据等各自放在一个地方.
  • 肯定表示你系统中每一个知识片断的惟一性,防止重复,明确来源和使用该源码有关知识如代码文档测试和适用状况.
 
为维护者编码
维护是迄今为止任何项目中最昂贵的阶段.
  • 成为一个维护者
  • 编码时,要想象这个代码的最终维护者会像神经病同样发疯地找到你
  • 代码和注释遵循后来者可以很高兴地阅读和学习
  • 不要让我思考Don't make me think.
  • 使用最小惊讶原则Principle of least Astonishment.
 
避免过早性能优化
  • 瓶颈在哪里是未知的
  • 优化后,可能更难以阅读和维护
怎么作?
  • Make it work make it right make it fast.
  • 直到你须要时再优化,也只有在性能测试后发现优化瓶颈所在.
 
最小化耦合
  • 一个模块的改变一般会引发其它模块的连锁反应.
  • 模块组件由于模块之间的依赖会须要更多努力和时间编写维护.
  • 一个特定的模块可能会更难重用或测试,由于所依赖的模块也必须加入重用或测试.
  • 开发人员可能惧怕修改代码,由于他们不知道可能会发生什么影响.
怎么办?
  • 消除尽可能减小和下降没必要要的复杂度.
  • 经过隐藏实现细节,下降耦合.
  • 应用Law of demeter德墨忒耳定律.
 
德墨忒耳定律(迪米特法则)
不要和陌生人讲话
  • 一个对象的方法调用其它方法实际就是发生了紧耦合.
  • 太多实现细节暴露在外面.
怎么办?一个对象的方法调用其它方法时,必须遵循下面迪米特法则:
  1. 能够调用对象本身的方法
  2. 本身方法的参数的方法
  3. 在方法内部被建立的任何对象
  4. 该对象任何直接属性或字段
 
用组合而不是继承
  • 类之间的耦合少.
  • 用继承,子类容易做出假设,也就是父类的不少属性状态可能会被子类改变,虽然可能在一块儿运行,可是阅读不方便,并打破LSP.
怎么办?
  • 根据LSP(可置换性)决定何时继承.
  • 当有"has a"关系时用组合,表达"is a"时使用继承.
 
正交性
正交性的基本思想是,不相关的东西在概念上不该该在一个系统中.
它与简单性相关联;设计的正交性越正交,例外性越少.这使得它更容易在编程语言中学习,读和写程序代码.正交特征的意义是独立于上下文的,关键参数是对称性和一致性.
 
最大聚合
一个单一的模块/组件的凝聚度是它造成一个有意义的职责单元的的程度,更高的凝聚度意味着更好.
  • 增长理解模块的难度.
  • 增长在维护系统的困难,由于在领域逻辑变化会影响多个模块,由于在一个模块的变化,会增长相关模块的变化,不如将它们放在一个模块中.
  • 增长重用一个模块的困难,由于大多数应用程序不须要由模块提供的随机操做集.
怎么办?将共享同一职责的相关功能放在一个块中.
 
Liskov替换原则
LSP是关于对象行为的预期,程序中的对象在不改变该程序的正确性的状况下,能够用他们的子类型实例来替换.
 
开闭原原则
软件类实体应该对拓展开放,对修改闭合.经过下降对现存代码的修改,提升可维护性和稳定性.
怎么办?
  • 编写能够被拓展的类.
  • 只暴露可能须要拓展的地方,其它都隐藏起来.
 
单一职责
每一个类应该有单一职责,职责应该被类封装.全部职责混合在一个模块或类中会致使维护改变很难.
 
Curly法则
为任何特定的代码选择一个单一的,明确的目标,作一件事.
 
童子军规则
童子军规则规定,咱们应该老是把代码清除比咱们发现时更干净.
 
命令查询分离
命令查询分离Command Query Separation分离命令和查询,命令是用于执行一个动做,而查询时返回数据给调用者.
相关文章
相关标签/搜索