OOP:什么时候是对象?

Dan*_*Dan 23 language-agnostic oop

我试图理解面向对象.我当然理解它,但有时候我并不是100%清楚.你如何决定什么应该变成一个对象(另一个大整个对象的小对象部分)或者什么不值得成为一个对象,或者它应该只是那个大整个对象的属性?

对于一扇门,我猜门把手应该是一个独立的物体,但是你插入钥匙的中间部分应该是一个独立的物体还是什么?这是一个简单的例子,所以我可以解释我的困惑.您可以使用您的示例,如果它可以帮助您更好地表达您的观点.

我在想,如果我要多次使用它,我应该把它作为一个对象.我认为这是解决这个问题的实用方法,你同意吗?

谢谢

And*_*s_D 30

一如既往,答案是不幸的:这取决于......

一开始,你有某种环境,你想为它创建一个模型.但你不会模仿每一件事,你会专注于重要的事情.这就是我开始的原因:这取决于.这取决于完成任务所需的详细信息.

乘坐汽车和它的轮子 - 如果你为一个城市建模并想要一些交通,你可以创建一个属性为'numberOfWheels'的'Car'类.但是如果你设计汽车,那么你很可能想要创建一个类'Wheel',并将其中的四个添加到'Car'类.

经验法则:

  1. 如果那个,你在想什么,有多个属性,定义一个类
  2. 如果那个,你在想什么,有一些行为,定义一个类
  3. 如果那样,你正在考虑的,可能会增长或扩展,定义一个类
  4. 如果那个,你在想什么,必须是可排序的,可比的,定义一个类
  5. 如果你不确定,定义一个类;)

编辑

因为你强调了"多用途"方面:我不认为这是决定是否使用课程的一个方面.想想一个简单的计数器,一个for循环中的整数值.你将使用这个概念数百次,但我敢打赌,你永远不会想到将这个可怜的小伙伴包装int成'计数器'类 - 只是因为你多次使用'计数器的概念'.

  • 如果我可以只为最后一段再次+1,+ 1. (4认同)
  • 汽车和它的车轮示例很棒:) (4认同)

Mic*_*man 12

第一:忘记物理对象.我知道所有的教科书"学习示例"都使用它们,但是当你试图模拟一个真实的系统时,你只会迷惑自己.物理对象和对象之间没有直接关系.

Object是一种数据结构,它与一组可以对该数据结构进行操作的方法相结合.对象的属性保持对象状态,方法对状态进行操作.

您尝试建模的系统状态是什么?它是否存在于门,旋钮或两者的某种组合中?

有一些方法试图在编码开始之前明确指定对象模型.其他方法(例如,TDD)允许对象模型通过编码过程出现.在您的情况下,我建议使用TDD编写一些中小型应用程序,以便您可以看到各种模式的优缺点.很少有一种"正确"的方式来模拟给定的情况,但有些模型比其他模型更容易使用和理解; 认识到适用于你面前情况的模式带来了经验.

所以,底线:制作很多模特.考虑应用程序域,对它们进行建模和编码.这样做会使事情变得更加清晰.制作一个沙箱,然后跳进去.


Chr*_*ley 10

在决定某件事物是否是某个物体时,请问自己是否有以下物品......

候选人是否有重要的州?如果没有,那么它上面的所有方法都可能只是微弱相关.在这种情况下,您可能已经确定了可重用函数模块库.

行为

对象实际上是否在域中执行某些操作?例如,它只是充满了操纵结构或记录的访问器.

身分

对象是否真的存在于域中作为可识别的实体?该实体是否存在一些天生的方面,使其与其他类似的实体区别开来?门把手就是一个例子 - 由于一个门把手可能与另一个门把手相同,因此它并没有真正的特征.

如果你对其中一些回答"否",那么你可能没有一个对象 - 而且库或模块可以是一个有价值的可重用工件


最重要的是,不要担心......

我也不会过分担心这个问题的重用方面.设计类层次结构就像设计可扩展的软件一样 - 早期优化太容易了.在一张纸上画出一个设计,如果可以的话,用一些手绘的交互图验证设计.您会发现,随着时间的推移,您将真正了解真正有价值和可重复使用的内容.


Vil*_*lx- 2

我建议您考虑一下将如何​​使用它。想想你必须对你的“东西”进行哪些操作,然后考虑什么是最简单的方法。有时将其设为另一个对象的属性会更容易,有时将其设为自己的新对象会更容易。

没有通用的方法,可能有很多因素可以使一种解决方案变得更好。只需单独考虑每种情况即可。

补充:以门/门把手/钥匙孔为例 - 您将如何处理钥匙孔?以下是一些因素,使得将钥匙孔作为一个单独的对象变得合乎逻辑:

  • 您想要存储锁孔的许多属性,例如大小、形状、方向、针数、钥匙是否可以旋转一次或两次等;
  • 门把手上可以有多个锁孔;
  • 您想为钥匙孔提供一些只读属性(例如是否锁定),然后只允许通过特定方法修改它们(例如将“钥匙”对象作为参数的“解锁”方法);
  • 锁孔存储在一个单独的数据库表中,每个数据库行一个锁孔(那么让锁孔对象模仿数据库结构可能是有意义的);
  • 系统中的某些方法如果可以将锁孔作为参数,则可以以优雅的方式实现;

使其成为属性的情况相反:

  • 每个门把手只能有一个锁孔,并且只有一种或很少的属性;
  • 钥匙孔与门把手一起存储在数据库中;
  • 您通常并不单独关心钥匙孔,您只想将其作为门把手的描述性属性(例如是否有);