2013-03-14 44 views
2

在我的应用程序中,我有产品在生产线的车站之间旅行。记录站内产品的每次通过记录:失败成功。 产品和电台之间的关系是多对多的。何处放置处理两个类之间关系的方法?

如果我是在程序语言编程我想有以下功能:

get_last_pass_result($station_id, $product_id) {...} 

返回的上一次出现这种特定产品这个特定的站传递的结果。

现在你将如何在OOP方面这个逻辑模型? 我肯定会有班级,班级的产品。 但我应该做的(PHP语法):

$station->get_last_product_pass_result($product_id) 

或者

$product->get_last_pass_on_station_result($station_id) 

的情况似乎对称的,我不知道是什么因素存在,那么这两者之间决定

(或者甚至是一些第三方解决方案吗?)

我无法在这里提供有关该域的所有现有信息,但可随意添加以下注意事项:if [关于域的假设]然后[您的设计解决方案],如果感觉合适

回答

3

我取,但基于DDD的原则,所以我不知道这个适合你的需要,但无论如何...

所以,你有一个产品。我会说,他们是两个实体,可以有引用到对方,但是你所谈论的逻辑包括这些实体很可能被放在一个域名服务像ProductPassingService与操作像GetLastPassFor(产品,站)

您正在访问的服务必须使用底层域实体火车站和产品(和存储库查询它们),执行不属于要么站和产品逻辑责任。它使实体站和产品保持了太多的责任。

此外,域实体不应使用库(DDD - the rule that Entities can't access Repositories directly)所以这个逻辑属于某个域的服务。

+1

我喜欢这个答案。即使感觉背后有一个复杂的想法,我可能想要或不想采用 – shealtiel 2013-03-14 08:22:55

+1

@shealtiel你是否知道DDD? – 2013-03-14 09:21:02

+0

@Zdeslav Vojkovic,不,除了在看到它的答案中提到的维基百科页面之外。我对潜入更多更概念化的河流有点小心,除非它们非常集中并且广泛同意(如MVC) – shealtiel 2013-03-17 12:11:17

0

我建议把它的产品。我担心的是产品的数量很大,但是这些工作站应该是固定的,并且将特定产品的状态记录在该产品的对象中是很自然的。对于该台,它可能只需要记录一些统计数据。

+0

产品和工作站之间的关系是多对多的,因此不可能*存储有关产品传递的数据。我在问哪里把方法 – shealtiel 2013-03-14 06:50:33

1

我不完全清楚Product是代表产品(例如椅子)的类型还是产品的单个实例(例如,椅子001,椅子002)。从你的例子看来后者就是这种情况,所以我会使用它,否则get_last_pass_result没有多大意义。

我相信,我会介绍Path型(不知道很多有关领域,虽然)。现在,根据其他用例,这可能是一个聚合根(DDD术语)或不是。

这意味着它可以通过Product实例或直接从DB/repository/whatever访问。随着路径例如,我可以简单地做:

var path = product.GetPath(); // if it is accessible only via product 
var path = Path.GetPathForProduct(product); // or pathRepository.GetPathFor(), or ... 
var result = path.LastResult; 

这种方法从产品本身的解耦工厂过程,并允许其他一些情况下(例如,发现平均时间,等...)

+0

这是否意味着Path是一个访问存储库的域实体? – 2013-03-14 09:10:51

+0

可能是因为您决定遵循DDD路线。尽管如此,我无法分辨在这种情况下DDD是否合理。但是,如果它是一个聚合根,它将只有一个回购,并且正如我在答案中所写的那样,我不太了解有关决定 – 2013-03-14 09:20:16

+0

的要求。实际上,域实体应该最好无法访问存储库。这就是为什么我提出了一个域服务来协调行为。 (http://stackoverflow.com/questions/5694241/ddd-the-rule-that-entities-cant-access-repositories- directirect) – 2013-03-14 09:24:12

1

一如往常 - 这取决于你如何使用它。

但是在探索频道 - 汽车工厂有一个很好的“它是如何工作”的样本。在槽式输送机的行程中,汽车会接收越来越多的附加部件。每辆汽车都附有一种作业计划 - 要完成任务的作业清单。当它通过生产线时,负责工作的人会对工作完成情况做出评判。所以当发现缺陷时 - 你肯定知道源。

因此,回到程序方法。首先,使用结构+过程方法而不是纯粹的操作更自然。但是,当然,这取决于你。

第二 - 我建议将“产品”与“生产线日志”对象分开,该对象与产品处于一对一关系,但在产品发布后不一定需要。 “生产线日志”存储与站点处理对象有关的事件。此外,您可以将其作为一个时间表使用,即包括如何处理特定产品(如汽车包括或不包括调节器或雾灯等特定功能)。并且“计划”的行动应该被工人标记为“完成”。在现今的术语中,它也可以用'事件采购'术语来表示:在移动过程中,产品修改被写入日志;因此可以通过逐个重放修改事件来重新构建产品。