我相信我像许多人一样构建我的项目。你有一个数据层(DAO),服务层(服务)和表示层(Spring MVC,Wicket,...)。
通常服务开始变得非常简单和“短”。 然而,逐渐地,服务必须支持越来越多的用例,直到一段时间之后它成为一个具有许多行和方法并且难以阅读和维护的庞大类。那时你可以决定坚持下去或者开始重构,这是一项繁琐且“危险”的工作,可能需要大量的工作。
我正在寻找一种解决方案,以防止未来任何重构的需要 一种方法可能是将您的服务拆分为多个子服务,并使您的原始服务成为服务外观。因此,例如,您可以使用UserServiceFacade代替大型UserService,该调用将调用委托给PasswordService,RegistrationService,....
我认为这不是一个糟糕的解决方案,但我对它并不太热心,因为:
另一种解决方案可能是使用Business Objects(在我的理解中)也可以看到一个子服务,但每个特定的UseCase可以看一个,所以你可能有BO的类似CreateUserBO,CheckPasswordBO,DeleteUserBO,......。
我对这种方法更加热衷,因为在我的观察中,它提供了一些优势:
但我也看到了一些可能的缺点:
问题或者说问题(抱歉)是:
答案 0 :(得分:4)
如果您的申请比大学任务严重,我建议您查看Domain Driven Design上的这篇文章。基本前提是构建实体周围的所有内容,并拥有强大的域模型。区分提供基础设施相关事物的服务(如发送电子邮件,持久化数据)和实际执行核心业务需求的服务。
我还建议探索Spring Roo - 这会带来一些革命性的东西,就像你不需要DAO图层等那样关注你的层而言。
希望有所帮助。
答案 1 :(得分:0)
使用您提到的第一种方法,为什么不扩展该服务,而不是创建“外观”?在这种情况下,您将能够重用超级/原始类中的代码。
我认为如果以可读的方式组织他们的包结构,那么在任何情况下拥有许多较小的类当然更可取的是具有大量功能的大类,因此更有可能进行更改。
最后我认为这两种方法非常相似,要么你最终都要有高度的代码重用,如果你需要在结构上更新某些东西,那么很容易做出全局变化(相对来说) ),也很容易做出具体的实施变更。
答案 2 :(得分:0)
我个人所做的是我总是使用门面来提供服务。逻辑在服务的内部类中,但我提供了该服务的客户端可以调用的接口。
我尽量避免从一开始就把任何逻辑放在外立面上。只是锅炉板代码重定向到正确的代码逻辑。
因此,即使您的服务具有许多功能,外观仍然可以维护。
但是,如果您控制整个源代码库,如果您在一个服务中开始拥有太多功能,则应该毫不犹豫地进行重构和细分。即使您使用多个课程来完成这项工作,从长远来看,明确区分您的服务也会更好。