面向对象
面向对象编程(Object Oriented Programming)中的基础概念:类(class)和对象(object)。
如果不按照严格的定义来说,大部分编程语言都是面向对象编程语言,比如 Java、C++、Go、Python、C#、Ruby、JavaScript、Objective-C、Scala、PHP、Perl 等。大部分程序员在开发项目的时候,都是基于面向对象编程语言进行的面向对象编程。
作者自己的定义:
定义:面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。
面向对象编程语言是支持类或对象的语法机制,并有现成的语法机制来实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。
一般来讲, 面向对象编程都是通过使用面向对象编程语言来进行的,但是,不用面向对象编程语言,照样可以进行面向对象编程。反过来讲,即便使用面向对象编程语言,写出来的代码也不一定是面向对象编程风格的,也有可能是面向过程编程风格的。
面向对象编程的四大特性:
- 封装
- 继承
- 多态
- 抽象
理解每种特性讲的是什么内容、存在的意义以及能解决什么问题。这些特征是前人在进行面向对象编程的过程中总结出来的,这些特性能帮助开发者方便的实现各种设计思路,后来才有了为了原生支持这些特性而设计的面向对象编程语言。
如果按照刚给出的严格的面向对象编程语言的定义,前面提到的有些编程语言,并不是严格意义上的面向对象编程语言,比如 JavaScript,它不支持封装和继承特性,按照严格的定义,它不算是面向对象编程语言,但在某种意义上,它又可以算得上是一种面向对象编程语言。
面向对象编程从字面上理解,就是将对象或类作为代码组织的基本单元,来进行编程的一种编程范式或者编程风格,并不一定需要封装、抽象、继承、多态这四大特性的支持。但是,在进行面向对象编程的过程中,人们不停地总结发现:有了这四大特性,就能更容易地实现各种代码设计思路。
比如,在面向对象编程的过程中,经常会遇到 is-a 这种类关系(比如狗是一种动物),而继承这个特性就能很好地支持这种 is-a 的代码设计思路,并且解决代码复用的问题,所以,继承就成了面向对象编程的四大特性之一。但是随着编程语言的不断迭代、演化,人们发现复杂的继承关系容易造成层次不清、代码混乱,所以,很多编程语言在设计的时候就开始摒弃继承特性,比如 Go 语言。但是,并不能因为它摒弃了继承特性,就一刀切地认为它不是面向对象编程语言了。
实际上,只要某种编程语言支持类或对象的语法概念,并且以此作为组织代码的基本单元,那就可以被粗略地认为它就是面向对象编程语言了。至于是否有现成的语法机制,完全地支持了面向对象编程的四大特性、是否对四大特性有所取舍和优化,可以不作为判定的标准。
面向对象编程(OOP)、面向对象分析(OOA)和面向对象设计(OOD)
OOA、OOD、OOP 三个连在一起就是面向对象分析、设计、编程(实现),正好是面向对象软件开发要经历的三个阶段。分析和设计类比软件开发中的需求分析、系统设计,之所以在前面加“面向对象”这几个字,是因为我们是围绕着对象或类来做需求分析和设计的。
分析和设计两个阶段最终的产出是类的设计,包括程序被拆解为哪些类,每个类有哪些属性方法,类与类之间如何交互等。
面向对象分析、设计、编程到底都负责做哪些工作呢?简单点讲,面向对象分析就是要搞清楚做什么,面向对象设计就是要搞清楚怎么做,面向对象编程就是将分析和设计的的结果翻译成代码的过程。
UML(UnifiedModel Language),统一建模语言。很多讲解面向对象或设计模式的书籍,常用它来画图表达面向对象或设计模式的设计思路。
UML包含类图,用例图,顺序图,活动图,状态图,组件图。类图中类之间的关系又包含了泛化、实现、关联、聚会、组合、依赖等。