Java 拆分服务->;业务对象?
我相信我会像很多人一样组织我的项目。您有一个数据层(DAO)、服务层(services)和表示层(SpringMVC、Wicket等) 通常情况下,一个服务开始时非常简单和“简短”。 然而,逐渐地,服务必须支持越来越多的用例,直到过了一段时间,它变成了一个庞大的类,有许多行和方法,难以阅读和维护。到那时,你可以决定坚持下去,也可以开始重构,这是一项繁重而“危险”的工作,需要做很多工作 我正在寻找一种解决方案,以防止将来需要进行任何重构。Java 拆分服务->;业务对象?,java,design-patterns,Java,Design Patterns,我相信我会像很多人一样组织我的项目。您有一个数据层(DAO)、服务层(services)和表示层(SpringMVC、Wicket等) 通常情况下,一个服务开始时非常简单和“简短”。 然而,逐渐地,服务必须支持越来越多的用例,直到过了一段时间,它变成了一个庞大的类,有许多行和方法,难以阅读和维护。到那时,你可以决定坚持下去,也可以开始重构,这是一项繁重而“危险”的工作,需要做很多工作 我正在寻找一种解决方案,以防止将来需要进行任何重构。 一种方法是将您的服务拆分为几个子服务,并使您的原始服务成为
一种方法是将您的服务拆分为几个子服务,并使您的原始服务成为服务的外表。因此,例如,您可以使用UserServiceFacade来代替大型UserService,它将调用委托给PasswordService、RegistrationService等等 我认为这是一个不错的解决方案,但我对此不太感兴趣,因为:
对于您提到的第一种方法,与其创建“门面”,为什么不扩展该服务呢?在这种情况下,您可以重用来自超级/原始类的代码 我认为,如果一个人以可读的方式组织他们的包结构,那么在任何情况下,拥有一些较小的类肯定比拥有具有大量功能的大型类更可取,因此更容易发生更改
最后,我认为这两种方法非常相似,要么你最终可以得到高度的代码重用,如果你需要在结构方面进行更新,那么进行全局更改(相对而言)是非常容易的,而且很容易做出具体的实现更改。我个人所做的是,我总是为我的服务使用门面。逻辑在服务的内部类中,但我提供了一个接口,该服务的客户端可以调用该接口 我试图从一开始就避免把任何逻辑放在表面上。只是锅炉板代码重定向到正确的代码逻辑 因此,即使您的服务具有许多功能,外观也是可以维护的
但是,如果您控制了整个源代码库,那么如果您在一个服务中开始有太多的特性,您应该毫不犹豫地进行重构和细分。即使你用几门课来做这项工作,从长远来看,明确地分开你的服务会更好。我建议你看看这篇文章,看看你的申请是否比大学作业更重要。基本前提是围绕实体构建所有内容,并拥有强大的域模型。区分提供与基础架构相关的服务(如发送电子邮件、持久化数据)和实际执行核心业务需求的服务 我还建议探索——这带来了一些革命性的东西,比如不需要DAO层等
希望这会有所帮助。所以,保留UserService,但也创建一个扩展UserService的PasswordService?实际上,这两种解决方案是相似的,这是一个粒度问题。尽管如此,使用BO方法,您不需要过多考虑如何组织您的用例;你只需要一个用例(每个类),如果唯一的目标是代码重用,我会尽量避免使用继承。如果可能的话,我更喜欢在助手类/对象中提取公共代码并使用组合;我们已经划分了我们的域,它们是松散耦合的。但是,您能否解释DDD与如何将您的服务划分为BO或子服务的问题有何关系?BO是DDD的一部分吗?取决于你的观点。如果您的应用程序是分层的,而不是复杂的应用程序,那么BO可能不会真正代表DDD中的任何内容。然而,如果您拥有丰富的域模型,并且逻辑只由域对象处理,那么我会质疑大量业务对象的存在。如果他们不是crunc