当我们在谈论面向对象的时候,我们到底在谈论什么?

什么是面向对象编程和面向对象编程语言?

面向对象编程的英文缩写是OOP,全称是Object Oriented Programming。对应地,面向对象编程语言的英文缩写是OOPL,全称是Object oriented Programming Language。

面向对象编程中有两个非常重要、非常基础的概念,那就是类(class)和对象(object)。如果不按照严格的定义来说,大部分编程语言都是面向对象编程语言,比如Java、C++、Go、Python、C#、Ruby、JavaScript、Objective-C、Scala、PHP、Perl等。除此之外,大部分程序员在开发项目的时候,都是基于面向对象编程语言进行的面向对象编程。

  • 面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四大特性,作为代码设计和实现的基石。
  • 面向对象编程语言是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。

一般来讲,面向对象编程都是通过使用面向编程语言来进行的,但是,不用面向对象编程语言,我们照样可以进行面向对象编程。反过来讲,即便我们使用面向对象编程语言,写出来的代码也不一定是面向对象风格的,也有可能是面向过程编程风格的。

理解面向对象编程及面向对象编程语言两个概念,其中最关键的一点就是理解面向对象编程的四大特性。这四大特性分别是:封装、抽象、继承、多态。

如何判定某编程语言是否是面向对象编程语言?

如果按照刚刚我们给出的严格的面向对象编程语言的定义,前面提到的有些编程语言,并不是严格意义上的面向对象编程语言,比如JavaScript,它不支持封装和继承,按照严格的定义,它不算是面向对象编程语言。

实际上,面向对象编程从字面上,按照最简单、最原始的方式来理解,就是将对象或类作为代码组织的基本单元,来进行编程的一种编程范式或者编程风格,并不一定需要封装、抽象、继承、多态这四大特性的支持。但是,在进行面向对象编程的过程中,人们不停地总结发现,有了这四大特性,我们就能更容易地实现各种面向对象的代码设计思路。

比如,我们在面向对象编程中,经常会遇到is-a这种关系,而继承这个特性就能很好地支持这种is-a的代码设计思路,并且解决代码复用的问题,所以,继承就成了面向对象编程的四大特性之一。但是随着编程语言的不断迭代、演化,人们发现继承这种特性容易造成层次不清、代码混乱,所以,很多编程语言在设计的时候就开始摒弃继承特性,比如Go语言。但是,我们并不能因为它摒弃了继承特性,就一刀切地认为它不是面向对象编程语言了。

实际上,只要某种编程语言支持类或对象的语法概念,并且以此作为组织代码的基本单元,那就可以粗略地认为它就是面型对象编程语言了。至于是否有现成的语法机制,完全地支持面向编程的四大特性、是否对四大特性有所取舍和优化,可以不作为判定的标准。基于此,我们才有了前面的说法,按照严格的定义,很多语言都不能算得上面向对象编程语言,但按照不严格的定义来讲,现在流行的大部分编程语言都是面向对象编程语言。

什么是面向对象分析和面向对象设计?

面向对象分析英文缩写是OOA,全称是Object Oriented Analysis;面向对象设计的英文缩写是OOD,全称是Object Oriented Design。OOA、OOD、OOP三个连在一起就是面向对象分析、设计、编程,正好是面向对象软件开发要经历的三个阶段。

面向对象分析和设计中的”分析”和”设计”这两个词,我们完全可以从字面上去理解,不需要过度解读,简单类比软件开发中的需求分析、系统设计即可。

之所以在前面加”面向对象”这几个字,是因为我们是围绕对象或类做需求分析和设计的。分析和设计两个阶段最终的产出是类的设计,包括程序被拆解为哪些类,每个类有哪些属性方法,类与类之间如何交互等等。它们比其他的分析和设计更加具体、更加落地、更加贴近编码,更能够顺利地过渡到面向对象编程环节。这也是面向对象分析和设计,与其他分析和设计最大的不同点。

面向对象分析要搞清楚做什么,面向对象设计要搞清楚怎么做,面向对象编程就是将分析和设计的结果翻译成代码的过程。

什么是UML?我们是否需要UML?

UML,统一建模语言,常用它来画图表达面向对象或设计模式的设计思路。

实际上,UML是一种非常复杂的东西。它不仅仅包含我们常提到的类图,还要用例图、顺序图、活动图、状态图、组件图等。即便仅仅使用类图,学习成本也是很高的。就单说类之间的关系,UML就定义了很多种,比如泛华、实现、关联、聚合、组合、依赖等。

要想完全掌握,并且熟练运用这些类之间的关系,来画UML类图,肯定要花很多的学习精力。UML在互联网公司的开发项目中,用处可能并不大。为了文档化软件设计或者方便讨论软件设计,大部分情况下,我们随手画个不那么规范的草图,能够达意,方便沟通就够了,而完全按照UML规范来将草图标准化,所付出的代价是不值得的。

你可能感兴趣的:(设计模式学习之旅)