Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Java 拆分服务->;业务对象?_Java_Design Patterns - Fatal编程技术网

Java 拆分服务->;业务对象?

Java 拆分服务->;业务对象?,java,design-patterns,Java,Design Patterns,我相信我会像很多人一样组织我的项目。您有一个数据层(DAO)、服务层(services)和表示层(SpringMVC、Wicket等) 通常情况下,一个服务开始时非常简单和“简短”。 然而,逐渐地,服务必须支持越来越多的用例,直到过了一段时间,它变成了一个庞大的类,有许多行和方法,难以阅读和维护。到那时,你可以决定坚持下去,也可以开始重构,这是一项繁重而“危险”的工作,需要做很多工作 我正在寻找一种解决方案,以防止将来需要进行任何重构。 一种方法是将您的服务拆分为几个子服务,并使您的原始服务成为

我相信我会像很多人一样组织我的项目。您有一个数据层(DAO)、服务层(services)和表示层(SpringMVC、Wicket等)

通常情况下,一个服务开始时非常简单和“简短”。 然而,逐渐地,服务必须支持越来越多的用例,直到过了一段时间,它变成了一个庞大的类,有许多行和方法,难以阅读和维护。到那时,你可以决定坚持下去,也可以开始重构,这是一项繁重而“危险”的工作,需要做很多工作

我正在寻找一种解决方案,以防止将来需要进行任何重构。
一种方法是将您的服务拆分为几个子服务,并使您的原始服务成为服务的外表。因此,例如,您可以使用UserServiceFacade来代替大型UserService,它将调用委托给PasswordService、RegistrationService等等

我认为这是一个不错的解决方案,但我对此不太感兴趣,因为:

  • 难以提前确定分包工作的子服务;如果您判断错误,您可能仍然需要在以后进行te重构,或者有一个只包含一个方法的服务
  • 例如,如果PasswordService和RegistrationService需要公共功能,则业务逻辑的重用可能会更加困难
  • 另一个解决方案可能是使用业务对象,据我所知,业务对象也可以被视为一个子服务,但每个特定用例都有一个子服务,因此您可能有像CreateUserBO、CheckPasswordBO、DeleteUserBO等BO

    我对这种方法更感兴趣,因为在我看来,它有很多优点:

  • BO本身可读性很强,只满足合同要求;所有其他BO都可以委托给其他BO,单个BO将是简短且切中要害的
  • 易于重用的功能
  • 更容易更改/切换特定用例的实现:只需使用Spring注入另一个实现
  • 更容易测试:只需要测试特定用例,其他BO的委托可以被嘲笑
  • 协作:如果几个开发人员在不同的BO上工作,那么当他们在同一个服务上工作时,冲突就会减少
  • 不过,我也看到了一些可能的不利因素:

  • 一点额外的工作(至少在排序术语中)
  • 更多的类会降低项目的可读性吗
  • 还有一个抽象层:需要额外的步骤来找到用例的实际实现
  • 问题或更确切地说是问题(对不起)是:

  • 业务对象是这个问题的理想解决方案吗
  • 您是否同意我在上面列出的BO的优点/缺点和/或您是否看到其他优点/缺点
  • 是否有其他(好的)解决方案来防止大型服务破坏您的一天

  • 对于您提到的第一种方法,与其创建“门面”,为什么不扩展该服务呢?在这种情况下,您可以重用来自超级/原始类的代码

    我认为,如果一个人以可读的方式组织他们的包结构,那么在任何情况下,拥有一些较小的类肯定比拥有具有大量功能的大型类更可取,因此更容易发生更改


    最后,我认为这两种方法非常相似,要么你最终可以得到高度的代码重用,如果你需要在结构方面进行更新,那么进行全局更改(相对而言)是非常容易的,而且很容易做出具体的实现更改。

    我个人所做的是,我总是为我的服务使用门面。逻辑在服务的内部类中,但我提供了一个接口,该服务的客户端可以调用该接口

    我试图从一开始就避免把任何逻辑放在表面上。只是锅炉板代码重定向到正确的代码逻辑

    因此,即使您的服务具有许多功能,外观也是可以维护的


    但是,如果您控制了整个源代码库,那么如果您在一个服务中开始有太多的特性,您应该毫不犹豫地进行重构和细分。即使你用几门课来做这项工作,从长远来看,明确地分开你的服务会更好。

    我建议你看看这篇文章,看看你的申请是否比大学作业更重要。基本前提是围绕实体构建所有内容,并拥有强大的域模型。区分提供与基础架构相关的服务(如发送电子邮件、持久化数据)和实际执行核心业务需求的服务

    我还建议探索——这带来了一些革命性的东西,比如不需要DAO层等


    希望这会有所帮助。

    所以,保留UserService,但也创建一个扩展UserService的PasswordService?实际上,这两种解决方案是相似的,这是一个粒度问题。尽管如此,使用BO方法,您不需要过多考虑如何组织您的用例;你只需要一个用例(每个类),如果唯一的目标是代码重用,我会尽量避免使用继承。如果可能的话,我更喜欢在助手类/对象中提取公共代码并使用组合;我们已经划分了我们的域,它们是松散耦合的。但是,您能否解释DDD与如何将您的服务划分为BO或子服务的问题有何关系?BO是DDD的一部分吗?取决于你的观点。如果您的应用程序是分层的,而不是复杂的应用程序,那么BO可能不会真正代表DDD中的任何内容。然而,如果您拥有丰富的域模型,并且逻辑只由域对象处理,那么我会质疑大量业务对象的存在。如果他们不是crunc