Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何设计对象?_Oop - Fatal编程技术网

Oop 如何设计对象?

Oop 如何设计对象?,oop,Oop,所以有很多方法可以构造对象(我在这里谈论的是OOP)。对于这个问题,我将使用OOP的经典“汽车”示例。基本上,当两种程序结构都能实现目标时,我如何知道何时将汽车作为一个对象,或何时将车轮作为一个对象 如何对对象的各个部分进行分类和归类,以确定它们是否更适合作为对象的简单属性或变量,或者它们是否真的需要成为对象本身?不要从对事物进行分类开始。似乎人们太渴望开始构建继承层次结构 写下具体场景的列表-你的应用程序将一步一步地做什么。一个对象模型只有在它做了你需要它做的事情时才有用——因此,从场景中开始

所以有很多方法可以构造对象(我在这里谈论的是OOP)。对于这个问题,我将使用OOP的经典“汽车”示例。基本上,当两种程序结构都能实现目标时,我如何知道何时将汽车作为一个对象,或何时将车轮作为一个对象


如何对对象的各个部分进行分类和归类,以确定它们是否更适合作为对象的简单属性或变量,或者它们是否真的需要成为对象本身?

不要从对事物进行分类开始。似乎人们太渴望开始构建继承层次结构

写下具体场景的列表-你的应用程序将一步一步地做什么。一个对象模型只有在它做了你需要它做的事情时才有用——因此,从场景中开始回溯,看看你能从每个场景中摆脱哪些常见的对象和行为

确定场景中的“角色”——不一定是实际的类名——只是模糊的“角色”,当您仔细思考软件如何工作的具体场景时会出现。这些角色以后可能会变成类、接口、抽象类——不管你需要什么——开始时它们只是做某种工作的占位符

确定每个角色“做什么”。关键是要有一组命名的角色,这些角色识别对象将要做的事情。Thins是关于提炼出每个角色可以做的一组事情-他们可以做整个事情,或者把一堆其他对象放在一起做工作,或者他们可以协调工作。。。这取决于你的情况

OOD/OOP中最重要的事情是对象做事情——而不是它们内部的东西——它们做什么

不要过早地考虑继承问题,因为它会将您束缚在过于复杂的层次结构中,让您从面向SQL的编程而不是面向对象的编程的角度来思考。继承只是共享公共代码的一种方式。还有很多其他的方法——委托、混合、基于原型的编程

以下是我提出的一些指导方针:


首先你必须意识到OOAD(“面向对象的分析和设计”)是一种工具,而不是达到目的的手段。你从这个过程中得到的是一个模型,而不是你正在建模的东西的真实表现。该模型做出了某些假设。该模型的目的是解决您遇到的问题

那么,您如何知道如何设计对象呢?你怎么知道你做对了?最终结果:它解决了你的问题吗

因此,以汽车为例,在一些模型中,汽车计数可以是一个整数计数,例如交通模型中通过交叉口的汽车流量。在这种车型中,你很少关心汽车的品牌、型号或结构,只关心数量。您可能会关心车辆的类型,例如卡车或汽车。您是否将其建模为具有汽车或卡车类型的车辆对象?或者只是单独的汽车计数和卡车计数

简单的回答是:哪一个最好

对某事物是否为对象的正常测试是它是否有行为?请记住,最终对象=数据+行为

所以你可能会说汽车具有以下状态:

  • 车轮的转动
  • 悬挂高度
  • 左或右驱动
  • 颜色
  • 宽度
  • 重量
  • 长度
  • 高度
  • 门的尺寸
  • 是否有天窗;
  • 是否有立体声、CD播放器、MP3播放器和/或卫星导航
  • 油箱的尺寸
  • 气缸数
  • 涡轮增压和/或燃油喷射
  • 最大扭矩
  • 最大制动马力
  • 等等
很可能你只关心其中的一小部分:选择任何相关的。赛车游戏可能会更详细地介绍车轮,例如车轮有多热、磨损程度、宽度和胎面类型等。在这种情况下,车轮对象可以说是所有状态(但很少有行为)的集合,因为汽车有许多车轮,车轮可以互换

这就引出了关于对象的第二点:一个对象可以存在,因为这个对象代表了一组完整的数据。所以一个轮子可以有踏面,宽度,温度等等。你们不能把它分开,说一辆车有胎面,但并没有车轮宽度,所以车轮作为一个物体是有意义的,因为整个车轮是可互换的


但再说一次,这对我们所做的有意义吗?这是关键问题。

属性或变量通常是语言的“基本”类型。问题是你能理智地抽象什么

例如,您可以将
轮子
简化为由整数、浮点值和字符串等基本类型组成的描述符,它们表示任何轮子的特征属性:
踏板数
直径
宽度
推荐压力
品牌
。这些属性都可以用基本类型来表示,以生成
Wheel
对象

您能否将这些属性中的一些分组成一种更抽象的安排,以便可以独立于
控制盘
重用?我认为是这样。也许可以创建一个具有属性
diameter
width
Dimensions
对象。然后,您的
轮子
具有与其关联的
维度
对象实例,而不是
直径
宽度
。但您可以考虑将该
维度
对象与其他对象一起使用,这些对象不一定是
轮子
实例

向上移动列表,可以将
汽车
简化为基本类型,但也可以将其他对象(例如