如果没有业务逻辑可执行,则没有理由执行业务层。三层体系结构不是一个神秘的协议,只是业务处理过程中形成的最佳实践。
在当前的应用程序中,我们经常在没有涉及业务流程的情况下直接从JSF控制器访问DAO。这个想法是由java champion给出的,他强调了简单性至关重要的观点。
如果您担心未来可能需要添加业务逻辑的修改。我这样思考问题:无论如何,额外的业务逻辑将被添加到业务层,包括数据访问,所以这里没有区别。
CRUD代码大多非常简单。因此,服务中的更改将等于将DAO中的一个调用或几个调用重新路由到一个EJB - 这是一个简单的重构。 CRUD代码本身仍然存在,但会被推入到EJB中 - 另一个简单的重构。
这并不完美,但IMO更好,然后替代方案:有一个空的间接层。这增加了无用的复杂性。业务对象只会将呼叫转发给DAO。
有两个code smells,我认为适用于这种情况:人为的复杂性和feature envy。
我不是说业务层中的DA是某种代码味道。我的意思是有一个没有别的的业务对象,但代理DAO是一种气味。这与复杂性相同 - 一个没有自己的目的的增加的数据结构/架构层 - 似乎应用程序中已经有了DAL。
您考虑的另一方面是 - 开发人员看到直接使用DAO的服务有多令人惊讶?有5个服务,其中2个直接访问DAO不同于100个服务,其中只有一个服务直接访问DAO。在第一种情况下,代码的简单性将超过增加的概念复杂性(2个概念对于单一事物),在第二种情况下,我宁愿坚持业务层 - 惊喜(也称为WTF效应; )以不同的方式做一次就太大了。
和往常一样,晶莹剔透!虽然这个问题在ins性质上是自相矛盾的('我怎么总是跳过依赖它的应用程序中的中间层')。 – skuntsel 2013-04-25 10:57:55
@skuntsel - 谢谢:)是啊,如果DAO被认为是业务层的一部分,那么你就用3层固定 - 对我来说DAO是DAL的一部分,所以我失去了一层廉价的口头语言诀窍;) – kostja 2013-04-25 12:09:06
如果在一段时间后你必须在做CRUD操作之前添加一些业务呢?如果您在Service层中添加业务代码的方式是错误的,因为服务不应该有业务代码,所以您必须在业务层中添加业务,更改服务以获得业务并完成其工作,因此您必须更改2个不同的地点以添加商业。这是我相信的问题! – 2013-04-25 13:36:27