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)

这种情况似乎是对称的,我想知道两者之间存在哪些考虑因素(甚至可能是第三种解决方案?)

我无法在此处提供有关该领域的所有现有信息,但请随意包括以下考虑事项:如果 [关于该领域的假设] 那么 [您的设计解决方案],如果感觉合适

4

4 回答 4

3

我的看法,但基于 DDD 原则,所以我不知道这是否适合您的需求,但无论如何......

所以你有一个Station和一个Product。我会说它们都是可以相互引用的实体,但是您正在谈论的逻辑包含这些实体,并且可能会被放入像ProductPassingService这样的域服务中,并带有像GetLastPassFor(product, station)这样的操作。

此域服务将负责使用底层域实体 Station 和 Product(以及用于查询它们的存储库)并执行不属于 Station 和 Product 的逻辑。它使实体 Station 和 Product 保持清洁,避免过多的责任。

此外,域实体不应使用存储库(DDD - 实体不能直接访问存储库的规则),因此此逻辑属于域服务。

于 2013-03-14T08:03:02.763 回答
1

我不完全清楚 是Product代表一种产品(例如椅子)还是代表产品的单个实例(例如chair-001、chair-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;

这种方法将工厂流程与产品本身分离,并支持其他一些场景(例如,找到平均持续时间等......)

于 2013-03-14T08:53:52.960 回答
1

与往常一样 - 这取决于您如何使用它。

但是探索频道上有一个很好的“它是如何工作的”示例——一家汽车工厂。在槽式输送机的行程中,汽车接收越来越多的附加部件。每辆汽车都附有一种工作计划——为了完成任务而要完成的工作列表。当它通过生产线时,负责一项工作的人会为工作完成打分。因此,当发现缺陷时 - 您肯定知道来源。

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

其次 - 我建议将“产品”与“生产线日志”对象分开,该对象与产品具有一对一的关系,但在产品发布后可能没有必要。“生产线日志”存储与工作站处理的对象相关的事件。此外,您可以将其用作时间表,即包含如何处理特定产品的说明(作为汽车,是否包含或不包含某些功能,如空调或雾灯)。工人应将“计划中的”行动标记为“完成”。

在现在的术语中,它也可以用“事件溯源”术语来表达:在移动过程中,产品修改被写入日志;因此可以通过一个一个地重播修改事件来重新构建一个产品。

于 2013-03-14T20:35:09.277 回答
0

我建议将其放入产品中。我关心的是产品的数量很大,但站应该是固定的,在那个产品的对象中记录特定产品的状态是很自然的。对于车站来说,可能只需要记录一些统计数据。

于 2013-03-14T06:42:19.480 回答