设计模式学习笔记 - 面向对象 - 1.面向对象到底讨论的是什么

1.到底什么是面向对象编程和面向对象编程语言?

面向对象编程(OOP)的全称是 Object Oriented Programming

面向对象编程语言(OOPL)的全称是 Object Oriented Programming Language

面向对象编程中有两个非常重要的概念,就是类(Class)和对象(Object)。面向对象编程这个概念第一次使用是在SmallTalk 这种编程语言中,它也被认为是第一个真正意义上的面向对象编程语言。后来C++带动了面向对象编程的流程。到今天,如果不按照严格的定义来说,大部分编程语言都是面向对象编程语言,比如JavaC++GoPythonJavaScript等等。

那么到底什么是面向对象编程?什么语言才算是面向对象编程语言呢?

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

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

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

在上面刚刚的讲解中,提到"如果不按照严格的定义来说,大部分编程语言都是面向对象编程语言"。为什么要加上"如果不按照严格的定义"这个前提呢?

这是因为如果严格按照面向编程语言的定义,前面提到的有些编程语言并不是严格意义上的面向对象编程语言。比如 JavaScript,它不支持封装和继承特性。

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

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

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

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

和面向对象编程经常放到一起讲的,还有面向对象分析(OOA)和面向对象设计(OOD)。OOAOODOOP 三个连在一起就是面向对象分析、设计、编程(实现),正好是面向对象软件开发要经历的三个阶段。

面向对象分析和面向对象设计中的"分析"和"设计"这两个词,完全可以从字面上去理解,不需要过度解读。之所以在前面加上"面向对象"这几个字,是因为我们是围绕着对象来做需求分析和设计的。分析和设计两个阶段的产出是类的设计,包括程序被拆解为哪些类,每个类有哪些属性方法,类与类之间如何交互等等。

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

4.什么是 UML?是否需要 UML?

降到面向对象分析、设计、编程,那就不得不提到 UML(Unified Model Language),统一建模语言。很多书籍中,常用它来画图表达面向对象或设计模式的设计思路。

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

要完全掌握,并且熟练运用这些类之间的关系,来画 UML 类图,肯定要花很多的学习经理,而且即使你按照 UML 画出类图,可对于不熟悉的人来说,看懂的成本还是很高的。

一般在互联网公司的项目开发中,UML 用处可能不大。为了文档化软件设计或者方便讨论软件设计,大部分情况下会画一个不是那么规范的草图,能够达意,方便沟通就够了。

相关推荐
牛奶咖啡1339 分钟前
学习设计模式《十七》——状态模式
学习·设计模式·状态模式·认知状态模式·状态模式的优缺点·何时使用状态模式·状态模式的使用示例
找了一圈尾巴1 小时前
设计模式(行为型)-责任链模式
设计模式·责任链模式
使一颗心免于哀伤3 小时前
《设计模式之禅》笔记摘录 - 5.代理模式
笔记·设计模式
Patrick_Wilson19 小时前
青苔漫染待客迟
前端·设计模式·架构
易元1 天前
设计模式-模板方法模式
后端·设计模式
花好月圆春祺夏安1 天前
基于odoo17的设计模式详解---策略模式
设计模式·策略模式
收破烂的小熊猫~2 天前
《Java修仙传:从凡胎到码帝》第四章:设计模式破万法
java·开发语言·设计模式
佛祖让我来巡山2 天前
【工厂和策略设计模式妙用】解决接口选择与多重if-else 问题
设计模式·策略模式·工厂模式
hqxstudying2 天前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
WebInfra2 天前
如何在程序中嵌入有大量字符串的 HashMap
算法·设计模式·架构