这个系列是早前发布在部门wiki上的,引导组里的兄弟入门OOD,希望同样对刚刚走到OOD门前的同学有用。
在继续探讨OOD的设计原则之前,我想先就OOD本身和相关的一些概念做些澄清,概念清楚以后再来看OOD的设计原则和我们现在的代码可能会把握的更好一点。
看我们有些模块的代码,最大的一个感觉就是:我们在用面向对象的语言写面向过程的程序。好多代码只是被聚集在类和方法中,没有被很认真地分析、抽象和封装。我举个例子说明一下一个简单的OOD过程吧,我们要写一个程序,模拟"把大象装进冰箱"这样一件事,步骤我们都知道:第一步,把冰箱门打开;第二步,把大象装进去;第三步,把冰箱门关上。在没有任何抽象的情况下,设计是这样的:
这是典型的面向过程的做法,虽然我们有接口有实现,但是OOD的思想被丢掉了。这里只是用代码把文字需求重新描述了一遍,没有做任何抽象,所有的事情都被"大象冷藏器"这个"伪对象"给干了,我们系统中可以找出很多这种"对象"。那么OOD的到底做什么呢?我觉得是:
找出一组相互协作的对象,并为它们分配职责。所以第一步,我们先把"对象"找出来,如下图:
需求中省略了主语,这里做了补充,张三开关冰箱,李四装大象。注意这里只是一些对象,通常来讲它们不是最终的抽象,我们通过分析把它们所属的"类"找出来:
1、大象是一种具体的东西,这里需求说的是装大象,但不排除将来会装狮子老虎,所以应该抽象一下,定名为"装载物"
2、冰箱也是一种具体的东西,这里需求说的是装到冰箱了,但不排除将来会装到洗衣机大衣柜里,所以也应该抽象一下,定名为"容器"
3、张三李四是具体的人,显然应该抽象出来,定名为"操作者"(不定名为"人"是因为机器一样可以完成类似的功能,"操作者"是更高的一个抽象等级)
抽象过后的类图如下:
接下来就是为这些类分配职责了:
1、操作员应该有一个打开容器的职责,一个关闭容器的职责,还有一个装载物体的职责
2、容器应该封装一个开关状态,要修改这个状态,应该提供打开和关闭两个方法
3、装载物在此处没有职责
于是我们得到了抽象过的设计:
在这个设计下,我们使用抽象隔离了容器可能的变化、装载物可能的变化,和操作员可能的变化。当出现新的需求"把老虎装进洗衣机"时,我们的物体装载器不需要变化,只是为装载物和容器添加新的实现而已。
这个例子多少有点滑稽,但是当问题出现在我们的系统中,你就不会觉得滑稽了,比方说昨天讨论MobileChargingServiceImpl时提到的EqHandleResponseService (Eq是对易趣的缩写),这是一个接口,接口通常是一种抽象,但是很难想象这个接口是对什么纬度进行抽象,或者是为了隔离什么样的变化;再比如MobileChargeLimitManageService接口中有个sumHalfAnHourTotalChargeAmount方法, 这显然也是一个没有经过抽象的方法。
抽象不但是遵循OCP原则的关键,从某种意义上说,也是面向对象设计的关键。我们使用Java做企业级开发的程序员必须要掌握这种方法才行。
- 大小: 15.1 KB
- 大小: 6.4 KB
- 大小: 7.8 KB
- 大小: 38.8 KB
分享到:
相关推荐
面向对象设计(Object-Oriented Design,简称OOD)是软件工程领域中的一种设计思想和方法,旨在通过模拟现实世界中的对象及其相互作用来构建软件系统。OOD的核心在于将复杂问题分解为一系列相对独立、功能明确的对象...
通过阅读这两篇文档,即使是对编程不熟悉的读者也能理解OOD的基本思想和桥接模式的精髓,这对于增进夫妻间的沟通,或者向非技术人员解释IT知识都十分有帮助。设计模式的掌握不仅可以提升个人的编程能力,也有助于...
面向对象设计(Object-Oriented Design,简称OOD)是软件工程领域中的一种设计思想,它强调将...正如文章中所提到的,即使是从日常生活的角度理解OOD,也能感受到其背后的智慧和魅力,这无疑是对OOD价值的最好诠释。
OOP(面向对象编程)和OOD(面向对象设计)是C#中的核心概念,对于任何希望深入理解和掌握C#的开发者来说,这两者至关重要。 面向对象编程(OOP)的核心理念是将现实世界中的实体抽象为类,然后通过类创建对象来...
接下来我们将详细探讨 OOA 和 OOD 的核心概念、发展历程及其应用。 ### 一、面向对象分析(OOA) #### 1.1 概念介绍 面向对象分析是一种分析问题域的技术,其目的是理解问题域并将其建模为对象模型。在这个阶段,...
《OOD启思录》这本书将详细阐述这些概念,并提供实例和练习,帮助读者掌握面向对象设计的精髓,提升软件开发技能。通过阅读和实践,你可以更好地理解和应用面向对象设计原则,从而提高软件项目的成功率。
通过理解OOA、OOD的基本概念,熟练掌握C++的面向对象特性,以及利用UML进行建模,开发者能够构建出符合业务需求且易于维护的软件系统。在整个过程中,泛型编程和模板的使用进一步增强了代码的通用性和效率。
本书将帮助你理解经验原则和“设计模式”这一流行概念之间的相互作用。你可以借助经验原则发现设计中所存在的某一方面的问题,而设计模式则提供了解决方案。 本书对各个层次的开发者都有价值。新手能借助本书走上...
8. **分析与设计**:在对象导向设计中,先进行需求分析,理解业务流程和实体,然后进行概念设计,定义类和对象的职责,最后是详细设计,包括接口设计和实现细节。 9. **重构**:OOD也强调代码的持续改进,通过重构...
在本教程中,我们将探索面向对象分析(OOA)和面向对象设计(OOD)的基本概念。这些方法是软件开发过程中的关键步骤,特别是在理解和建模复杂系统时。我们的目标是展示如何通过用例分析、场景定义、顺序图和类图来...
**对象导向分析(OOA)、对象导向设计(OOD)与统一建模语言(UML)是软件工程领域中的核心概念,对于理解和开发复杂系统至关重要。** **对象导向分析(OOA)**是软件开发过程的一个阶段,其目标是理解问题域,识别...
UML 是一种面向对象的建模语言,它通过图形化的表示方式帮助开发者理解系统的结构和行为。Java 与 UML 的紧密联系体现在以下几个方面: - **类图**: UML 类图用于描述系统的静态视图,展示类及其之间的关系。在 ...
- **JBOO 3.0使用方法**:JBOO可能是一个编程框架或者库,讲解如何在OOA和OOD实践中利用它来加速开发过程。 **通过北大教程中的实习示例,学习者能够获得实践经验,理解如何将理论知识应用于实际项目。这种实践性...
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法封装在一起,以提供更好的模块化和抽象性。在这个领域,有三个核心的理论基石,分别是:设计...
而OOD则是在OOA的基础上,将这些概念模型转换成计算机能够理解和处理的结构化模型,决定软件的结构和模块如何组织,以及如何利用面向对象编程语言实现这些结构。 面向对象的开发方法具有几个显著特点。它注重将系统...
总的来说,这份文档提供了丰富的面向对象设计知识,不仅涵盖了基本概念,还深入到设计模式的应用,是学习和理解OOD的宝贵资源。通过深入学习和实践,开发者可以更好地应用这些原则和模式,提高软件开发的质量和效率...
- **设计启发式原则**:由Arthur Riel提出的一系列面向对象设计启发式原则,旨在帮助开发者更好地理解和改进面向对象设计。这些原则不仅限于特定编程语言,而是适用于所有面向对象的设计过程。 - **目标**:提供...
面向对象设计(Object-Oriented Design,简称OOD)是一种软件设计方法,它基于面向对象编程的概念,如类、对象、封装、继承、多态等,旨在创建可维护、可扩展和可重用的软件系统。面向对象设计的目标是将分析模型...
面向对象分析(Object-Oriented Analysis,OOA)是软件开发过程中的一个关键步骤,主要任务是对问题域进行深入理解,识别出重要的对象和它们之间的关系。OOA关注于业务逻辑和需求,通过创建类和对象模型来描述系统的...