Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 了解何时对域关系建模以及如何处理上下文关系_Oop_Model_Dns_Entity Relationship - Fatal编程技术网

Oop 了解何时对域关系建模以及如何处理上下文关系

Oop 了解何时对域关系建模以及如何处理上下文关系,oop,model,dns,entity-relationship,Oop,Model,Dns,Entity Relationship,我是领域建模新手,所以请原谅我问了几个基本问题。我的第一个问题是关于知道何时对域关系建模。我发现,有时我觉得所有的类似乎都以某种方式与大多数其他类相关,我不清楚什么时候应该直接对这些关系建模(通过在一个类中保留对另一个类的引用) 例如,假设我有一个Person类,它与订单集合相关,而每个订单都与产品集合相关(请原谅这个缺乏想象力的示例)。这些实体的每个od在数据库中都有一个对应的表。如果我正在编写一些客户机逻辑来处理一个人与之关联的产品(通过persons orders),那么似乎有一个Pers

我是领域建模新手,所以请原谅我问了几个基本问题。我的第一个问题是关于知道何时对域关系建模。我发现,有时我觉得所有的类似乎都以某种方式与大多数其他类相关,我不清楚什么时候应该直接对这些关系建模(通过在一个类中保留对另一个类的引用)

例如,假设我有一个Person类,它与订单集合相关,而每个订单都与产品集合相关(请原谅这个缺乏想象力的示例)。这些实体的每个od在数据库中都有一个对应的表。如果我正在编写一些客户机逻辑来处理一个人与之关联的产品(通过persons orders),那么似乎有一个Person.Products集合,特别是因为我可以编写一些SQL来获取此集合,而无需撤回persons orders集合。这是好的还是坏的设计?如果有什么更好的方法来处理这个问题

第二,关系本质上是上下文关系的情况如何?继续前面的示例,我想在person方法中运行的一些业务逻辑需要处理包含特定产品的person的所有关联订单(即person的Orders集合的子集)。我可以构造一些SQL,它将非常容易地返回这个子集。问题是我在哪里公布结果?我是否应该在Person上放置一个方法,该方法接受产品参数并返回Orders集合,以便客户端代码如下所示

person.OrdersContaining(Product p)
实体是否应该有这样的多个方法来公开其关系的不同子集,或者一个人是否应该只有一个订单集合,并以其他方式处理子集

谢谢

如果我在写一些客户端逻辑 处理一个人需要的产品 与(通过那个)有关 (人们命令)它似乎是临时的 有一个人。产品收藏, 尤其是当我可以编写一些SQL时 要在没有 需要收回订单吗 收集这是好的还是坏的设计? 如果有更好的方法 处理这个

您在软件中编码的每个一级关系都说明了您的设计意图以及您对实体如何组合的理解。以这种方式将人与产品紧密地联系在一起可能被认为是不够理想的,因为每次你得到一个人,你也会得到他们的产品。这意味着人与产品之间的关系可能并不存在

实体是否应该有这样的多个方法来公开其关系的不同子集,或者一个人是否应该只有一个订单集合,并以其他方式处理子集


我可能更喜欢能够处理这类事情的
OrderService
,而不是将其放在实体上——它将具有类似
List OrdersForPerson(Person p)
等方法。在某些框架中,将其放在实体上更为惯用,不过这里会想到Rails的
ActiveRecord

我在这里看到了两个正在讨论的问题:

People --- Order

1) 。我们应该同时公开People.getOrders()和Order.getOrdersForPerson(p)吗

2) 。我们应该公开People.getProductsOrdered()吗

本能地,在做了很多年面向对象的事情之后,我会对这两个问题说“不”。但我能证明这一点吗?什么样的启发法可以指导我们?一些建议:

a) 。越少越好。每种方法都需要花费。开发时间、测试工作、文档。你的方法越多,就越难找到你想要的方法

b) 。单一责任。如果我们接受暴露People.getOrders()和Order.getOrdersForPerson(p)操作系统的过度杀伤力,那么哪个对象真正负责People-Order关系。我会说,订单的本质是与订购者相关,因此订单应该拥有这种关系

c) 。脱钩。忙碌的人订了很多东西。您可能会得到一个QUALIFIED getOrders()方法,采用其他条件,如何时订购或订单大小。以公开您使用订单的属性。所以People.getOrders(标准)现在用订单内容的细节来表示。如果你改变了顺序,你需要改变人。耦合不好!这一点解决了产品问题。很明显,订单本质上需要了解产品,并与产品有一定程度的耦合。人们没有这种内在的关系,因此不要把他们和产品结合起来

d) 。规模人们做很多事情。他们不仅仅下订单。您是否希望为他们做的每一件新事情更改人员类别?添加People.getrips()People.getExpenseReguments(),People.getHeathCareClaims()。当然不是

不要陷入“哦,在SQL中很容易实现”的争论中,在这一级别的讨论中,我们更关心的是设计好的接口和明确的职责分离。

所有关系都是上下文关系。

如果用户请求您提供某人已购买的产品列表,则他们已定义某人与产品关联的上下文。没有上下文,就没有关系

存在一种常见的误解,即应用程序只有一个域模型。这与事实相差甚远。原则上,每个功能都有不同的域模型

您应该将每个功能视为系统将支持的唯一功能。将现有代码视为重用机会;不多也不少。并通过无情的重构使事情干涸

People --- Order --- Product