软件设计架构

最近看了几本关于编程的书籍,都是些讲解软件架构和设计的书。根据目前脑袋中还残留的记忆,我将这些软件设计的相关知识总结如下:

1. 编程范式

目前被提出来的编程范式为:结构化编程范式、面向对象编程范式、函数式编程范式。从bob大叔的大作中看出,编程范式的提出并非为编程增加了什么东西,而是限制了什么。

  • 结构化编程范式,由Edsger Wybe Dijkstra于1968年最先提出。限制了程序的控制权的直接转移;
  • 面向对象编程范式,是在1966年由Ole Johan Dahl和Kriste Nygaard在论文中总结归纳出来的。这两个程序员注意到在ALGOL语言中,函数调用堆栈可以被挪到堆内存区域里,这样函数定义的本地变量就可以在函数返回之后继续存在。限制了程序控制权的间接转移;
  • 函数式编程范式,是基于与阿兰.图灵同时代的数学家Alonzo Church在1936年发明的λ演算的直接衍生物。限制了程序中的赋值。

2. SOLID原则

SOLID原则中最广为人知的应该是单一职责,这也是很多程序员学习的第一个简单原则。但在SOLID原则中,最核心的原则是开闭原则,所有其他的原则都是为其服务的。

  • 单一职责原则,内涵不是指函数或类或模块只做一件事,而是说只有一个变化的方向,只为一个角色服务。这一点很多人存在误解。难点在于如何识别变化的方向!
  • 里式替换原则,类的继承体系,子类均可以替换父类;
  • 迪米特法则(有些地方翻译为得墨忒法则,最少知识原则),只与你的直接朋友交谈,不和陌生人说话;
  • 接口隔离原则,客户端不应该依赖他不需要的接口,类间的依赖关系应该建立在最小的接口上。一个大的接口,可以拆分成两个小的接口给两个不同的类使用。
  • 依赖倒置原则,上层模块不应该依赖于底层模块,他们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这个原则在软件设计和解耦中极其重要,平时应该要有意识的去关注软件层次的依赖。
  • 开闭原则,本质上这不是一个具体的原则。一切的一切,都是为了保持软件对扩展开放对修改关闭,维持软件的高内聚低耦合。

3. 设计模式

设计模式是为SOLID原则服务的,所有的设计模式无非就是为了解决上述的开闭问题。我们经常使用的23种设计模式中,