共计 5037 个字符,预计需要花费 13 分钟才能阅读完成。
分享下前 Google 工程师「王争」对于这个话题的思考。
思考到各个程度档次的同学,并且保障专栏内容的系统性、全面性,我会循序渐进地解说跟设计模式相干的所有内容。所以,专栏注释的第一个模块,我会讲一些设计准则、设计思维,比方,面向对象设计思维、经典设计准则以及重构相干的常识,为之后学习设计模式做铺垫。
在第一个模块中,咱们又首先会讲到面向对象相干的理论知识。提到面向对象,我置信很多人都不生疏,随口都能够说出面向对象的四大个性:封装、形象、继承、多态。实际上,面向对象这个概念蕴含的内容还不止这些。所以,明天我打算花一节课的工夫,先大略跟你聊一下,当咱们议论面向对象的时候,常常谈判到的一些概念和知识点,为学习前面的几节更加细化的内容做一个铺垫。
特地阐明一下,对于明天讲到的概念和知识点,大部分我都是点到为止,并没有开展具体解说。如果你看了之后,对某个概念和知识点还不是很分明,那也没有关系。在前面的几节课中,我会花更多的篇幅,对明天讲到的每个概念和知识点,联合具体的例子,一一做具体的解说。
什么是面向对象编程和面向对象编程语言?
面向对象编程的英文缩写是 OOP,全称是 Object Oriented Programming。对应地,面向对象编程语言的英文缩写是 OOPL,全称是 Object Oriented Programming Language。
面向对象编程中有两个十分重要、十分根底的概念,那就是类(class)和对象(object)。这两个概念最早呈现在 1960 年,在 Simula 这种编程语言中第一次应用。而面向对象编程这个概念第一次被应用是在 Smalltalk 这种编程语言中。Smalltalk 被认为是第一个真正意义上的面向对象编程语言。
1980 年左右,C++ 的呈现,带动了面向对象编程的风行,也使得面向对象编程被越来越多的人认可。直到明天,如果不依照严格的定义来说,大部分编程语言都是面向对象编程语言,比方 Java、C++、Go、Python、C#、Ruby、JavaScript、Objective-C、Scala、PHP、Perl 等等。除此之外,大部分程序员在开发我的项目的时候,都是基于面向对象编程语言进行的面向对象编程。
以上是面向对象编程的大略倒退历史。在刚刚的形容中,我着重提到了两个概念,面向对象编程和面向对象编程语言。那到底什么是面向对象编程?什么语言才算是面向对象编程语言呢?如果非得给出一个定义的话,我感觉能够用上面两句话来概括。
- 面向对象编程是一种编程范式或编程格调。它以类或对象作为组织代码的根本单元,并将封装、形象、继承、多态四个个性,作为代码设计和实现的基石。
- 面向对象编程语言是反对类或对象的语法机制,并有现成的语法机制,能不便地实现面向对象编程四大个性(封装、形象、继承、多态)的编程语言。
一般来讲,面向对象编程都是通过应用面向对象编程语言来进行的,然而,不必面向对象编程语言,咱们照样能够进行面向对象编程。反过来讲,即使咱们应用面向对象编程语言,写进去的代码也不肯定是面向对象编程格调的,也有可能是面向过程编程格调的。这里听起来是不是有点绕?不过没关系,咱们在前面的第 7 节课中,会具体解说这个问题。
除此之外,从定义中,咱们还能够发现,了解面向对象编程及面向对象编程语言两个概念,其中最要害的一点就是了解面向对象编程的四大个性。这四大个性别离是:封装、形象、继承、多态。不过,对于面向对象编程的个性,也有另外一种说法,那就是只蕴含三大个性:封装、继承、多态,不蕴含形象。为什么会有这种一致呢?形象为什么能够排除在面向对象编程个性之外呢?对于这个问题,在下一节课具体解说这四大个性的时候,我还会再拿出来说一下。不过,话说回来,实际上,咱们没必要纠结到底是四大个性还是三大个性,要害还是了解每种个性讲的是什么内容、存在的意义以及能解决什么问题。
而且,在技术圈里,封装、形象、继承、多态也并不是固定地被叫作“四大个性”(features),也有人称它们为面向对象编程的四大概念(concepts)、四大基石(cornerstones)、四大根底(fundamentals)、四大支柱(pillars)等等。你也发现了吧,叫法挺凌乱的。不过,叫什么并不重要。咱们只须要晓得,这是前人进行面向对象编程过程中总结进去的、能让咱们更容易地实现各种设计思路的几个编程套路,这就够了。在之后的课程解说中,我对立把它们叫作“四大个性”。
如何断定某编程语言是否是面向对象编程语言?
如果你足够仔细,你可能曾经留意到,在我刚刚的解说中,我提到,“如果不依照严格的定义来说,大部分编程语言都是面向对象编程语言”。为什么要加上“如果不依照严格的定义”这个前提呢?那是因为,如果依照刚刚咱们给出的严格的面向对象编程语言的定义,后面提到的有些编程语言,并不是严格意义上的面向对象编程语言,比方 JavaScript,它不反对封装和继承个性,依照严格的定义,它不算是面向对象编程语言,但在某种意义上,它又能够算得上是一种面向对象编程语言。我为什么这么说呢?到底该如何判断一个编程语言是否是面向对象编程语言呢?
还记得咱们后面给出的面向对象编程及面向对象编程语言的定义吗?如果遗记了,你能够先翻到下面回顾一下。不过,我必须坦诚通知你,那个定义是我本人给出的。实际上,对于什么是面向对象编程、什么是面向对象编程语言,并没有一个官网的、对立的定义。而且,从 1960 年,也就是 60 年前面向对象编程诞生开始,这两个概念就在不停地演变,所以,也无奈给出一个明确的定义,也没有必要给出一个明确定义。
实际上,面向对象编程从字面上,依照最简略、最原始的形式来了解,就是将对象或类作为代码组织的根本单元,来进行编程的一种编程范式或者编程格调,并不一定须要封装、形象、继承、多态这四大个性的反对。然而,在进行面向对象编程的过程中,人们不停地总结发现,有了这四大个性,咱们就能更容易地实现各种面向对象的代码设计思路。
比方,咱们在面向对象编程的过程中,常常会遇到 is- a 这品种关系(比方狗是一种动物),而继承这个个性就能很好地反对这种 is- a 的代码设计思路,并且解决代码复用的问题,所以,继承就成了面向对象编程的四大个性之一。然而随着编程语言的一直迭代、演变,人们发现继承这种个性容易造成档次不清、代码凌乱,所以,很多编程语言在设计的时候就开始摒弃继承个性,比方 Go 语言。然而,咱们并不能因为它摒弃了继承个性,就一刀切地认为它不是面向对象编程语言了。
实际上,我集体感觉,只有某种编程语言反对类或对象的语法概念,并且以此作为组织代码的根本单元,那就能够被粗略地认为它就是面向对象编程语言了。至于是否有现成的语法机制,齐全地反对了面向对象编程的四大个性、是否对四大个性有所取舍和优化,能够不作为断定的规范。基于此,咱们才有了后面的说法, 依照严格的定义,很多语言都不能算得上面向对象编程语言,但依照不严格的定义来讲,当初风行的大部分编程语言都是面向对象编程语言。
所以,多说一句,对于这个问题,咱们肯定不要过于学院派,非要给面向对象编程、面向对象编程语言下个死定义,非得对某种语言是否是面向对象编程语言争个一清二白,这样做意义不大。
什么是面向对象分析和面向对象设计?
后面咱们讲了面向对象编程(OOP),实际上,跟面向对象编程常常放到一块儿来讲的还有另外两个概念,那就是面向对象分析(OOA)和面向对象设计(OOD)。面向对象分析英文缩写是 OOA,全称是 Object Oriented Analysis;面向对象设计的英文缩写是 OOD,全称是 Object Oriented Design。OOA、OOD、OOP 三个连在一起就是面向对象分析、设计、编程(实现),正好是面向对象软件开发要经验的三个阶段。
对于什么是面向对象编程,咱们后面曾经讲过了。咱们当初再来讲一下,什么是面向对象分析和设计。这两个概念相对来说要简略一些。面向对象分析与设计中的“剖析”和“设计”这两个词,咱们齐全能够从字面上去了解,不须要适度解读,简略类比软件开发中的需要剖析、零碎设计即可。不过,你可能会说,那为啥后面还加了个修饰词“面向对象”呢?有什么非凡的意义吗?
之所以在后面加“面向对象”这几个字,是因为咱们是围绕着对象或类来做需要剖析和设计的。剖析和设计两个阶段最终的产出是类的设计,包含程序被拆解为哪些类,每个类有哪些属性办法,类与类之间如何交互等等。它们比其余的剖析和设计更加具体、更加落地、更加贴近编码,更可能顺利地过渡到面向对象编程环节。这也是面向对象分析和设计,与其余剖析和设计最大的不同点。
看到这里,你可能会问,那面向对象分析、设计、编程到底都负责做哪些工作呢?简略点讲,面向对象分析就是要搞清楚做什么,面向对象设计就是要搞清楚怎么做,面向对象编程就是将剖析和设计的的后果翻译成代码的过程。明天,咱们只是简略介绍一下概念,不开展具体解说。在前面的面向对象实战环节中,我会用两节课的工夫,通过一个理论例子,具体解说如何进行面向对象分析、设计和编程。
什么是 UML?咱们是否须要 UML?
讲到面向对象分析、设计、编程,咱们就不得不提到另外一个概念,那就是 UML(Unified Model Language),对立建模语言。很多解说面向对象或设计模式的书籍,罕用它来画图表白面向对象或设计模式的设计思路。
实际上,UML 是一种非常复杂的货色。它不仅仅蕴含咱们常提到类图,还有用例图、程序图、流动图、状态图、组件图等。在我看来,即使仅仅应用类图,学习老本也是很高的。就单说类之间的关系,UML 就定义了很多种,比方泛化、实现、关联、聚合、组合、依赖等。
要想齐全把握,并且纯熟使用这些类之间的关系,来画 UML 类图,必定要花很多的学习精力。而且,UML 作为一种沟通工具,即使你能齐全依照 UML 标准来画类图,可对于不相熟的人来说,看懂的老本也还是很高的。
所以,从我的开发教训来说,UML 在互联网公司的我的项目开发中,用途可能并不大。为了文档化软件设计或者不便探讨软件设计,大部分状况下,咱们顺手画个不那么标准的草图,可能达意,不便沟通就够了,而齐全依照 UML 标准来将草图标准化,所付出的代价是不值得的。
所以,我这里特地阐明一下,专栏中的很多类图我并没有齐全恪守 UML 的标准规范。为了兼顾图的表达能力和你的学习老本,我对 UML 类图标准做了简化,并配上了具体的文字解释,力求让你一眼就能看懂,而非事与愿违,让图减轻你的学习老本。毕竟,咱们的专栏并不是一个讲方法论的教程,专栏中的所有类图,实质是让你更清晰地了解设计。
重点回顾
明天的内容讲完了,咱们来一起总结回顾一下,你须要重点把握的几个概念和知识点。
1. 什么是面向对象编程?
面向对象编程是一种编程范式或编程格调。它以类或对象作为组织代码的根本单元,并将封装、形象、继承、多态四个个性,作为代码设计和实现的基石。
2. 什么是面向对象编程语言?
面向对象编程语言是反对类或对象的语法机制,并有现成的语法机制,能不便地实现面向对象编程四大个性(封装、形象、继承、多态)的编程语言。
3. 如何断定一个编程语言是否是面向对象编程语言?
如果依照严格的的定义,须要有现成的语法反对类、对象、四大个性能力叫作面向对象编程语言。如果放宽要求的话,只有某种编程语言反对类、对象语法机制,那基本上就能够说这种编程语言是面向对象编程语言了,不肯定非得要求具备所有的四大个性。
4. 面向对象编程和面向对象编程语言之间有何关系?
面向对象编程个别应用面向对象编程语言来进行,然而,不必面向对象编程语言,咱们照样能够进行面向对象编程。反过来讲,即使咱们应用面向对象编程语言,写进去的代码也不肯定是面向对象编程格调的,也有可能是面向过程编程格调的。
5. 什么是面向对象分析和面向对象设计?
简略点讲,面向对象分析就是要搞清楚做什么,面向对象设计就是要搞清楚怎么做。两个阶段最终的产出是类的设计,包含程序被拆解为哪些类,每个类有哪些属性办法、类与类之间如何交互等等。
课堂探讨
明天咱们要探讨的话题有两个:
- 在文章中,我讲到 UML 的学习老本很高,沟通老本也不低,不举荐在面向对象分析、设计的过程中应用,对此你有何认识?
- 无关面向对象的概念和知识点,除了咱们明天讲到的,你还能想到其余哪些吗?
欢送在留言区发表你的观点,积极参与探讨。你也能够把这篇文章分享给你的敌人,邀请他一起学习。