任何算法都会有两个部分, 一个是 Logic 部分,这是用来解决实际问题的。另一个是 Control 部分,这是用来决定用什么策略来解决问题。Logic 部分是真正意义上的解决问题的算法,而 Control 部分只是影响解决这个问题的效率。程序运行的效率问题和程序的逻辑其实是没有关系的。我们认为,如果将 Logic 和 Control 部分有效地分开,那么代码就会变得更容易改进和维护。
编程的本质
- Programs = Algorithms + Data Structures
- Algorithm = Logic + Control
- Program = Logic + Control + Data Structure
有效地分离 Logic、Control 和 Data 是写出好程序的关键所在!
代码复杂度的原因:
- 业务逻辑的复杂度决定了代码的复杂度;
- 控制逻辑的复杂度 + 业务逻辑的复杂度 ==> 程序代码的混乱不堪;
- 绝大多数程序复杂混乱的根本原因:业务逻辑与控制逻辑的耦合。
如何分离 control 和 logic 呢?我们可以使用下面的这些技术来解耦。
- State Machine 状态定义 状态变迁条件 状态的 action
- DSL – Domain Specific Language
- HTML,SQL,Unix Shell Script,AWK,正则表达式……
- 编程范式
- 面向对象:委托、策略、桥接、修饰、IoC/DIP、MVC……
- 函数式编程:修饰、管道、拼装
- 逻辑推导式编程:Prolog
这就是编程的本质:
- Logic 部分才是真正有意义的(What)
- Control 部分只是影响 Logic 部分的效率(How)