Class 决定班级责任

Class 决定班级责任,class,architecture,single-responsibility-principle,Class,Architecture,Single Responsibility Principle,我知道这是一个固执己见的问题。然而,它经常在工作中出现。 在创建方法时,通常很难知道哪个类应该负责 e、 g vs 在我看来,CategoryService应该负责,因为该方法采用categoryId并且特定于该类别 在我工作的其他人说,如果产品已经卖完,ProductService应该负责处理这个方法 只是试图更好地理解服务体系结构和良好的流程。我对其他人解释为什么他们会选择一个而不是另一个感兴趣 谢谢你的免责声明-这纯粹是我的回答。我是本着设计头脑风暴的精神来回答这个问题的 根据OP,类别和

我知道这是一个固执己见的问题。然而,它经常在工作中出现。 在创建方法时,通常很难知道哪个类应该负责

e、 g

vs

在我看来,CategoryService应该负责,因为该方法采用categoryId并且特定于该类别

在我工作的其他人说,如果产品已经卖完,ProductService应该负责处理这个方法

只是试图更好地理解服务体系结构和良好的流程。我对其他人解释为什么他们会选择一个而不是另一个感兴趣


谢谢你的免责声明-这纯粹是我的回答。我是本着设计头脑风暴的精神来回答这个问题的

根据OP,类别和产品之间的关系似乎是一对多的可选关系:类别(0..1)(*)产品

在实现方面,这意味着类别实体可能有一个产品容器,而产品实体对类别的引用可能为空

在这种情况下,我同意将产品的
类别归属于
类别
实体的决定。方法名称明确表示类别实体应负责通知其API用户其产品的状态

然而,还有另一个选择:一个。这个实体背后的动机是描述其他两个实体之间的关系

在本例中,您可以拥有一个功能关联实体,为了本例的目的,我们将其称为
ProductContainment

ProductContainement将没有内部状态,并将保存以类别和/或产品实体作为参数提供的功能。 然后,协会实体有责任提供与类别和产品如何相互关联相关的功能的实施


如果您最终使用了ProductContainess,那么产品的分类应该是它的功能之一。

既然您在征求意见,下面是我的: (免责声明:这可能是您在商业世界中无法轻松实现的)

当您使用术语“类”时,我假设您想要一些面向对象的东西。问题是,服务不是任何可以创建有效对象的东西。相反,它只是函数的名称空间

此外,它是非常普遍的。这就像叫一个班级“经理”。你可以把所有的东西都放在里面,这个类有可能发展成拥有数百个函数

我的建议是:创建小实体。小到可以不使用任何setter创建,只需调用构造函数。如果您注意到您的对象需要更多功能,请创建一个稍微聪明一点的装饰器,它可以为您完成这项工作

我需要更多关于您的环境的详细信息才能更精确,但我想在您的情况下,您可能会有一个类似于Category类的东西,它包含产品并知道何时售罄。想象一下,你有一个团队,每个人都知道一些事情。请合适的人做这些事,远离经理或服务人员

bool result = ProductService.CategoryHasSoldOutOfProducts(int categoryId)
bool result = CategoryService.CategoryHasSoldOutOfProducts(int categoryId)