作者:平泽章,译者:侯振龙,出版日期:2020-07-13
电子书地址:面向对象是怎样工作的(第二版)-图灵社区
关键词:术语洪流、比喻滥用、“一切都是对象”综合征
-
面向对象编程(Object Oriented Programming,OOP)使得大规模软件的可重用构件群的创建成为可能,这些被称为类库或者框架。
-
创建可重用构件群时使用的固定的设计思想被提炼为设计模式。
-
使用图形来表示 OOP 的方法称为统一建模语言(Unified Modeling Language,UML)。
-
尽管面向对象是众多优秀技术的集大成,却经常被认为很难理解;造成混乱的主要原因大致有三点:术语洪流、比喻滥用和“一切都是对象”综合征。
- 继承、泛化、特化、超类、子类、接口、多重继承、属性、关联、集合、委托、重写、重载、访问控制、构造函数、包、异常、垃圾回收机制、框架、类库、组件、设计模式、用例、建模、UML、重构、敏捷开发流程、RUP、XP……
- 更本质的问题是基本术语的定义混乱;
- 如果只强调比喻而不详细介绍编程语言的结构和目的,那么就只有比喻能给人留下深刻的印象,而且听众很有可能会根据自己的理解,对实际的结构产生错误的认识。
- “动物是超类,哺乳类和鱼类是子类。既产卵又用乳汁哺乳幼仔的鸭嘴兽也就相当于爬虫类和哺乳类的多重继承。”
- “人具有‘出生年月日’的属性。如果给小王这样具体的一个人发出‘请告诉我你的年龄’的消息,就会得到‘28 岁’的回答。”
- “正如医院里的医生、护士和药剂师互相联系、协同工作一样,对象也是通过在计算机中互相发送消息来进行工作的。”
- 按照字面意思进行解释,现实世界的人、组织、事件、计算机系统的功能、系统管理的信息和程序的构成元素等一切事物都可以说是对象。这种极端的抽象称为“一切都是对象”综合征;
- 可能引起“只要使用面向对象,就可以直接将现实世界表示为程序”的误解。
-
用清晰的逻辑向读者介绍面向对象所涉及的各项技术。
-
本书并不会为大家详细讲解 Java 等编程语言的语法、UML 表示法等各项技术的详细内容,而是重点讲解这些技术是什么(What),以及为什么需要这些技术(Why)。
-
本书构成
关键词:面向对象的三大要素、现实世界
- “面向对象是直接将现实世界表示为软件的技术”。从结论上来讲,虽然面向对象编程的结构和现实世界的情形有一些相似点,但两者在本质上存在很大差别。
- 站在面向对象直接表示现实世界的角度,是无法很好地解释设计模式和类库等从编程派生出来的技术的。如果将所有内容都对应到现实世界来掌握概念,势必就会感觉面向对象难以理解,十分混乱。
类(Class)
- 类是面向对象的最基本的结构,与其对应的概念是实例(Instance):类指类型,实例则指具体的物
狗:斑点狗、柴犬、牧羊犬……
国家:中国、日本、韩国、美国、英国……
多态(Polymorphism)
- 如果用一句话来表示该结构,多态就是“让向相似的类发送消息的方法通用的结构”,也可以说是“发送消息时不关心对方具体是哪一个类的实例的结构”。
将该结构比作现实世界,可以做出如下说明:当向狗发送 cry 的消息时,会得到“汪”的响应;如果接收该消息的是婴儿,则会“哇”地哭;如果是乌鸦,则会发出“呱”的叫声;
继承(Inherit)
- 用一句话来表示继承,就是“系统地整理物的种类的共同点和不同点的结构”。
动物分为哺乳类、鸟类、昆虫类、爬虫类、两栖类和鱼类等,这些类又可以细分为很多种。
除了动物的分类体系之外,这种继承关系还可以应用于现实世界中的各种情况,比如将医生分为内科医生、外科医生、眼科医生和牙科医生,将公司职员分为营业人员、技术人员和办公人员等
-
在面向对象中,类是用来创建实例的结构,实例只属于一个类。而在现实世界中,首先有具体的物(实例),然后再根据观察该物的人的立场和兴趣而采用不同的基准进行分类(类)。
以笔者自己为例,在公司就是“员工”,与客户打交道时就是“技术人员”,而回到家就是“父亲”,走在街上时就是“路人” 。
像这样,某个实例(无继承关系)可以属于多个类的现象称为“多重分类”。在面向对象语言中基本不支持这种多重分类。
-
在面向对象的世界中,实例固定属于唯一的类,即使经过一段时间,也无法变为属于其他类。而现实世界中的人和物会随着时间的流逝而成长或老化,因此其分类也会发生变化。
典型的,如少年、青年、老年;
像这样,某个实例可以变为属于其他类的现象称为“动态分类”。在面向对象语言中基本不支持这种动态分类。
-
现实世界的人和物并不只是根据消息来行动;
现实世界中的人是根据自己的判断来行动的,虽然有时也会听从他人的指示,但这种情况只占很小的一部分。
- 类、多态和继承应该被明确定义为能提高软件的可维护性和可重用性的结构。
- 类用于将变量和子程序汇总在一起,创建独立性高的构件;
- 多态和继承用于消除重复代码,创建通用性强的构件。
- 仿照现实世界进行的讲解只是一种比喻,最终还是应该按照编程结构来理解。
- 从结论上讲,几乎所有的软件都只能涵盖人类工作的一部分。
- 面向对象与现实世界是似是而非的。这是妨碍大家理解面向对象的主要原因,但同时也是扩展该技术可能性的原动力。
- 面向对象之所以能够应用于业务分析、需求定义等上流工程,其中一个原因就在于类、实例、继承和消息传递等结构与现实世界的情形非常相似。
关键词:机器语言、汇编语言、高级语言、结构化编程、GOTO 语句、全局变量、局部变量