命令式编程与面向对象编程
命令式编程将计算表达为改变状态的命令序列;面向对象编程则将状态和行为组织成封装的、通过消息传递进行交互的对象。
用 PaperMind 寻找选题即将推出Find papers & topics
Tools & resources
Learn & explore
视频即将推出
Definition
命令式编程将计算描述为通过赋值和控制流改变程序状态的语句序列;面向对象编程是一种结构化范式,其中状态和操作被捆绑到通过调用方法进行交互的对象中。
Scope
本主题涵盖了基于可变变量、赋值和显式控制流的命令式计算模型,以及围绕对象、类、继承、封装和动态分派来构建命令式程序的面向对象范式。它包括子类型化和行为可替换性、设计模式,以及对象与抽象数据类型之间的关系。
Core questions
- 封装如何控制可变状态的复杂性?
- 一个类型是另一个类型的行为子类型意味着什么?
- 继承何时有益,何时会产生脆弱的耦合?
- 对象与抽象数据类型和模块之间有何关系?
Key theories
- 行为子类型化(Liskov替换原则)
- Liskov和Wing形式化了子类型对象何时可以安全地替换超类型对象,要求子类型保留超类型所期望的可观察行为和不变性。
- 结构化编程
- Dahl、Dijkstra和Hoare确立了有纪律的控制流和逐步求精作为可理解命令式程序的基础,取代了不受限制的基于goto的控制。
- 设计模式
- Gamma及其同事编目了面向对象设计问题中反复出现的解决方案,为组织协作对象提供了共享词汇。
Clinical relevance
面向对象设计是许多工业软件的基础,因为封装和多态性支持大规模的模块化开发和代码重用。Liskov替换原则和设计模式仍然是构建可维护的类层次结构和接口的实用指南。
History
命令式编程起源于最早的存储程序机器和诸如Fortran、Algol等语言。Simula 67引入了类和继承;Smalltalk在20世纪70年代和80年代普及了纯粹的面向对象和消息传递。C++以及后来的Java将面向对象带入了主流工业界,而Liskov关于数据抽象的工作以及1994年的《设计模式》一书则将面向对象方法论系统化。
Debates
- 继承与组合
- 设计者们争论实现继承和对象组合哪种方式更能促进重用和灵活性,随后的许多实践倾向于组合和基于接口的设计。
Key figures
- Barbara Liskov
- Ole-Johan Dahl
- Kristen Nygaard
- Alan Kay
- Edsger Dijkstra
Related topics
Seminal works
- goldberg1983
- liskov1994
- dahl1972
- gamma1994
Frequently asked questions
- 什么是Liskov替换原则?
- 它指出,子类型对象应该能够在任何预期超类型对象的地方使用,而不会破坏程序的正确性,这限制了子类如何覆盖行为。
- 面向对象编程本质上是命令式的吗?
- 经典的面向对象编程依赖于可变对象状态,因此是命令式编程的一种形式,尽管面向对象的特性也可以与函数式和不可变风格结合使用。