问题标签 [object-composition]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
620 浏览

c++ - 组合类 C++ 中的冗余代码

我正在尝试学习 C++。一切都很顺利,直到我的“练习”计划遇到了很小的障碍。我相信,这个障碍源于设计问题。

想想二十一点(21)。我做了几节课。

  1. 卡片
  2. 甲板
  3. 播放器

一个甲板由 - 为简单起见 - 有一系列卡片组成。
-它可以显示所有卡片
-它可以洗牌
-它可以移除卡片

一手牌就是一副牌——它的好处是
——它可以计算它的手牌价值
——它可以把牌加到手上

现在来解决我的问题 - 播放器设计

-A Player Has A hand (private access)
我对玩家的问题是,那只手有一个名为 addCardToHand 的方法函数。如果我必须创建一个名为 addCardToHand(Card c) 的 Player 方法,在该方法中调用并传递给同一方法,我会感到一种冗余/糟糕的设计。

或者

将 Hand h 声明为可公开访问的成员,并在“main()”中执行类似于
Player p 的操作;
卡卡;
phaddCard(卡片);

任何建议都会很有启发性并受到高度赞赏。请记住,我正在学习。

0 投票
2 回答
1440 浏览

java - Java - 为什么当变量是静态的时 ClassName.this.variable 工作?

我试图完全理解“这个”是如何工作的。在我之前的帖子中,我理解了为什么我们使用“this”关键字。

我对静态的理解是该类具有该成员的一个副本。“this”用于表示当前对象。对于所有对象,静态成员变量都是相同的,那么为什么“this”对静态成员变量起作用?

代码:

另外,在 setVar 方法中,我们可以使用 ClassName.this 来操作对象的值,但我认为使用 setter 更好,因为它更清晰。我错过了在这里使用“这个”有什么好处吗?

请发布代码以显示您要解释的示例。

0 投票
3 回答
783 浏览

java - 通过 getter 方法改变对象的状态通常被认为是一种不好的做法吗?

在我过去的开发过程中,我一直在考虑这个问题。

我有点反对做这样的事情,我通常声明一个单独的方法来明确处理逻辑。

例如

如果一个类有一个返回对象列表的方法,我认为直接通过它的 getter 方法修改这个集合是个坏主意。

我认为通过执行以下操作是不好的做法:

我会使用以下方法:

然而,我想到的还有一件事是,如果 Configuration 对象也有 getter 和 setter,那么你不能通过这样做来阻止其他人

他们仍然可以通过使用 ReportGenerator 的 getter 方法来更改 Configuration 对象的状态,我认为这是不允许的。但是如果我们想防止这种情况发生,我们必须在 ReportGenerator 类中声明更多方法来将调用转发到 Configuration 对象,并使用防御性副本。

所以我的问题是,如果您有一个对象 A,其中包含另一个使用组合的对象 B,并且它们都有 getter 和 setter,您是否更喜欢通过 A 的 getter 方法更改对象 B 的状态?例如

还是您更喜欢向 A 添加方法以更改 B 的状态(基本上将调用转发到 B)

例如

在此方法内部,A 调用 B.setTitle("");

很抱歉这个问题很长,我想我不确定我到底想问什么。希望你能理解。:P

0 投票
1 回答
135 浏览

jpa - 使用 JPA 管理复合对象并正确映射其属性

再次,我到达了一些十字路口,这让我与(“丰富”)域模型对象的对象组合设计的正确原则作斗争。

请注意,组合的含义是UML建模带来的含义:当有人声明一个对象包含另一个对象或对象集合时,所包含的对象(或对象集合)的生命是附加到(或依赖于)的容器对象的生命周期。

让我们举一个例子,这样我就可以直接表达我的观点。想象一下,我们有一个存储“食物”请求的食品商店,每个请求是每个元素都由一个或多个订单组成,一个订单由一个食物和一个数量来描述。所以,让我们用 UML 图来说明这个场景 --> http://imageshack.us/photo/my-images/546/5lfa.jpg/

基本上我们有三个类RequestOrderFood。我可能会清楚这一点,在不属于请求的订单中,没有任何可以想象的方法。

在那之后,我开始编码。我到达了两个不同的方案,但在展示这两个方案之间的差异之前,让我们编写通用类 Food。

嗯,是的..你说得对,我说这是类......所以是一种具有众所周知的对象的类(毕竟我猜是枚举)。

第一个方案)

这是Order课程

请注意方法equalshashCode

这是Request类:

请注意方法placeOrder

我真的开始想知道是否正确实例化一个新的订单,让列表使用重新定义的方法进行搜索equalshashCode就像我的东西在某个起点是一个很好的面向 Java 的方法,但这里显示了一些我没有的薄弱侧翼期待。

第二方案)

这是Order类:

请注意,不需要equals 和hashcode,因为我在Request 类中使用了一个map 来进行组合。

这是Request类:

请再次注意方法placeOrder

同样,我更喜欢这种方法,但让我怀疑它是否是正确的方法,以及我如何注释以供以后与 JPA 一起使用。

还有一件事。关于这个问题,我真的试图找到一些好的解释以及如何处理这种常见情况。但我总是失败。在Hibernate Quickly中,我没有找到任何线索。我一直读到第 7 章。在Hibernate in action 中,我发现了一些关于 Bid 和 Item 的内容,但没有解决组合问题,而是使用聚合显示示例。(我看到了几篇关于在组合上下文中管理集合的问题的文章,但它并没有提供关于如何解决我在这里陈述的弱实体和强实体问题的线索)

更重要的一件事

请:甚至不要认为可以通过这种方式解决

上面的方法是使用Aggregation,这样我将创建和销毁委托给另一个不在图片中的上层模块,可能是在服务层中,让我所有的域模型类都非常厌倦,指的是差的类仅包含state的封装行为。这是我不想要的,因为我想要一个丰富的模型,从某种意义上说,其中包含一些业务逻辑,而部分业务逻辑是关于实例化的(这是真实的历史,让我们面对现实吧)。

所以,最后,问题是这样的:

1)什么是最好的方法?显然,我愿意看到新的视角。

2)(更懒惰的问题)为了使用 ORM,我应该用 JPA 对类进行适当的注释吗?

嗯,谢谢大家!

问候。

胜利者!

PD:我的一个非常相关的问题是这个

0 投票
5 回答
246 浏览

python - 在 Python 中用子类替换成员对象

我有以下问题,我将尝试通过以下示例进行说明。

但是现在假设我创建了一种新的 Brick,StrongBrick,这样我就创建了一个房子,它是 StrongHouse 的子类,StrongBrick 在 StrongHouse 中扮演的角色与 Brick 在 House 中扮演的角色完全相同。我怎样才能以一种好的方式做到这一点(不仅仅是重新输入所有的类定义)?

所以基本思想是,如何将由一些对象组成的类更改为同一个类,但由原始成员对象的子类组成?

非常感谢您能给我的任何帮助。

0 投票
1 回答
78 浏览

architecture - 无法弄清楚 go 对象组合

由于很棒的并发原语,我目前正在使用 go 来实现游戏服务器。这一切都很容易实施并且工作非常可靠。虽然我主要来自 Java 背景,但我很难忘记 Java 的类型层次结构。我需要一个游戏对象的集合,它们都共享类似的数据结构,如位置、速度等,但它们在更新方法中可能都有不同的行为,或者允许不同功能的特殊字段。最初我有一个包含所有共享数据的结构,每个自定义类型都会嵌入该结构。问题在于使用数据结构进行组织。我使用四叉树让客户了解附近对象的状态。这样,我可以将树传递给每个游戏对象的嵌入式结构的指针,并且一切正常。

这样做的问题是,一旦我查询四叉树,我就无法访问包含类型。例如,

现在,如果我想更新附近玩家关于对象状态的信息,我会查询四叉树,但现在有办法确定 GameObject 是否实际上是客户端,并且无法访问它的连接以发送数据包。

从 Java 开始,我习惯于创建一个基类并将其子类化为 Client 等。然后我可以使用instanceof它来确定哪些需要特殊处理并相应地转换它们以访问自定义功能。我想我可以做以下事情:

使用这种方法,我可以使用类型断言来隔离客户端,但这会导致大量重复代码来实现其他游戏对象。我认为有一种更惯用的方式来做这样的事情,我很感激我能得到的任何帮助。如果这是可行的方法,也许有人可以帮助我理解这种设计背后的原因。

0 投票
1 回答
1585 浏览

c++ - 另类 PImpl 成语 - 优点与缺点?

传统的 PImpl 成语是这样的:

但是,为了好玩,我尝试使用带有私有继承的组合来代替:

[测试.h]

[第一翻译单元]

【第二翻译单元】

http://ideone.com/WcxJu2

我喜欢这个替代版本的工作方式,但是我很好奇它是否比传统版本有任何主要缺点?

编辑:DyP 还提供了另一个版本,它甚至更“漂亮”。

0 投票
2 回答
1039 浏览

java - 有什么更好的方法?垂头丧气?界面?抽象类?

全部,

我必须做错了。当时这似乎是一个好主意,但随着我深入研究,我认为有一种更合适的编程方式来处理它。所以我问你...

一注。我正在使用 Google AppEngine 和 Datastore 来存储这些信息。

好的......假设我有一个超级类车辆,然后有 3 个子类......汽车、卡车、摩托车。

在 Super Class 中,有 3 个属性……Manufacturer、Model、Type

例如,这些可能是:

  • 制造商:福特
  • 型号:焦点
  • 类型:汽车

因此,在 Datastore 中,我有许多具有这些属性的 Vehicle 实体。因此,如果用户想查看所有的汽车......我用“汽车”类型拉所有东西。

如果用户随后想要将这些车辆之一添加到“收藏夹”列表中,那么我将根据车辆对象的类型将车辆对象转换为其特定的子类。然后添加该特定子类的额外属性。

这个新的子实体连同其添加的属性一起存储在数据存储区中。

所以基本上,我正在贬低,例如,从车辆到汽车。我通过在 Car 类中创建一个以 Vehicle 作为参数的额外构造函数来做到这一点。创建后,Car 对象现在具有所有属性(制造商、模型、类型)集,以及其特定实现附带的所有新属性。

这似乎令人费解和错误。它有效,但必须有更好的方法来做到这一点。

我选择这种方式的主要原因是因为 GAE 数据存储的工作方式。存储超类及其有限属性并查询它们“更便宜”。很长的故事。

我正在尝试使用接口和/或抽象类来解决这个问题,但我想获得您的所有输入。

谢谢您的帮助。

0 投票
1 回答
253 浏览

java - 如何创建一个可以组合多个类的方法的代理?

我有A实现接口的类I。我有两个类BC每个类都扩展A并添加了一个新方法。Class 中的新方法BC. 我需要创建一个代理(某种复合),它应该具有 的所有方法和A中的新方法。BC

我试图在 CGLIB 中使用 Mixin$Generator 但我得到了 Error java.lang.ClassFormatError: Duplicate interface name in class file

有人可以提出解决方案吗?

0 投票
1 回答
62 浏览

javascript - 使用 Angular 构建应用程序的组合方法

如何使用 HTML 代码中的数据连接角度控制器?

我有一个服务器端框架,它允许我通过将组件连接在一起来构建应用程序。其中一些组件被转换为一些 HTML 标记。其他组件仅提供第一种组件的数据。这部分的技术细节并不重要。

示例:服务器上有两个组件 VideoPlayer 和 PlayButton。PlayButton 连接到 VideoPlayer。当页面被渲染时, VideoPlayer 变为<div id="the_player" class="flowplayer">...</div>并且 PlayButton 变为<button data-player-id="the_player">...</button>。所以按钮的点击处理程序可以data-player-id用来查找播放器并使其播放。VideoPlayer ID ( the_player) 使用服务器上的连接在组件之间传递,因此可以有两个播放器和多个按钮,每个按钮只控制指定的播放器。请注意,这些连接并未在 JavaScript 代码中指定,因此组件连接的更改不会以任何方式影响 JavaScript 代码。

问题:如何使用 Angular 控制器来做这样的事情?Angular DI 太天真了,只希望每种服务都有一个实例。我喜欢控制器和 HTML DOM 之间的双向绑定,它使我的小部件非常简单。但是如何将此类小部件连接到 HTML 属性中寻址的数据源?