Oop 构成特定对象的动机因素?

Oop 构成特定对象的动机因素?,oop,architecture,domain-driven-design,composition,Oop,Architecture,Domain Driven Design,Composition,我知道有很多理由让你把一个物体放在另一个物体里。一些学派已经明确说明了以某种方式设计程序的原因,例如“数据驱动设计”或“领域驱动设计”。我仍然是OOP的初学者,我常常很难理解为什么一个对象应该包含在另一个对象中。有时,我发现自己有一个看起来很棒的对象,然后我意识到,“好吧,现在我必须把它放在某个地方?”这背后的原因与我决定将文件放在硬盘上的原因类似吗 对此,我有几个指导原则: 如果它模拟了物理世界中的关系 如果编写器具有构造对象所需的数据 如果合成的对象正在侦听编曲器 当你做这个决定时,你在

我知道有很多理由让你把一个物体放在另一个物体里。一些学派已经明确说明了以某种方式设计程序的原因,例如“数据驱动设计”或“领域驱动设计”。我仍然是OOP的初学者,我常常很难理解为什么一个对象应该包含在另一个对象中。有时,我发现自己有一个看起来很棒的对象,然后我意识到,“好吧,现在我必须把它放在某个地方?”这背后的原因与我决定将文件放在硬盘上的原因类似吗

对此,我有几个指导原则:

  • 如果它模拟了物理世界中的关系
  • 如果编写器具有构造对象所需的数据
  • 如果合成的对象正在侦听编曲器

当你做这个决定时,你在寻找什么?

好吧,有一个非常简单的概念帮助我做到这一点,那就是“有一个”和“是一个”的概念。问问自己,包含的对象是包含对象所拥有的东西,还是包含对象所拥有的东西?如果它是包含对象所拥有的东西,那么包含是合适的。否则也许你应该考虑继承

狗是一种动物,有鼻子,所以它是:

class Animal
{
}

class Dog : Animal
{
    Nose n;
}
现在这个很好用。这种方法的一个“问题”是鼻子和狗紧密结合,所以有时候你会看到像包含接口指针而不是对象这样的东西,或者你可能会在谷歌上搜索“依赖注入”。但正如俗话所说,“有一个”和“是一个”往往是接近政府工作


在早期,只要尝试大量的例子,随着时间的推移,它就会变得自然。如果你最后吃的是意大利面,就朝它扔些肉丸,然后再试一次!:)

你在考虑什么替代方案?约翰·洛克伍德(John Lockwood)关于哈萨(hasA)和isA的评论有助于解决这一问题

或者你说的是遏制还是联想?哈萨有各种味道。例如,一个人可能有配偶,但显然没有配偶。换配偶和换鼻子是有区别的

您考虑的关系类型:

  • 一生:创造一个没有鼻子的人有意义吗?鼻子能没有人存在吗?一个人没有配偶能生存吗?这些问题的答案决定了您选择对个人进行的操作类型。可能不需要setNose()方法,尽管可能我们确实需要一个wipeNose()方法,并且可能确实需要一个mary(Person)方法

  • 基数:一个人有多少个鼻子?一辆车有多少个车轮和座椅?这个问题的答案决定了数据结构的类型?只是一个参考?名单?哈希表

我发现阅读UML建模,特别是类图很有帮助。这反映了许多关于如何有效地捕捉各种关系的经验

有时,我发现自己有一个 看起来很棒的东西,然后我 让我意识到, “好吧,现在我得把这个 在什么地方?”


从上面这句话中,听起来好像你在尝试从下到上的设计。多年来我学到的一点是,自上而下的设计是一条必由之路。只有在知道需要在何处使用该类之后,才应该编写该类。否则,您只会编写“看起来很棒”的类,并且包含可能毫无用处的代码。

这是对象包含(即集合)还是类定义包含(即在另一个类中定义类)?你在问题的中间换个条件。是的!听起来很准确;谢谢但是,我知道设计是一种自上而下到自下而上再到反复无常的互动。似乎从来没有一条明确的“路要走”:/