3层架构中各层职责分配用例解析

假设有这样一个应用场景通过分页的方式显示文章列表

需求:
1 显示文章标题 作者 发布时间
2 如果标题超过15个汉字则截断并显示...
3 表如果是当前浏览的用户是作者本人还需要在后面显示编辑和删除按扭如博客园里的评论.

现在的问题是在3层架构中我如何合理的分配他们职责呢?下面就这个问题做个分析在这篇文章中我刻意使他不会涉及到一些特定的web开发技术,所以不论是使用asp技术和还asp.net技术这篇文章应该是都适用的。

分析:

通过在表现层调用业务对象的方法返回一个文章的实体的集合
文章实体对象中应该有个作者的属性

对于需求3这里需要完成2个动作。一是判断当前显示的文章是否是作者本人的,假如使用方法IsAutor(username);二是如果是的话要完成控制按钮的显示,假如使用方法ShowControl()来完成。ShowControl这个应该在表示层实现相信这里是没有什么疑问的。判断作者这个功能可以直接使用文章实体对象的作者属性去判断它是否等于session("username")就可以得到结果。但是这个职责应该分配给业务逻辑层还是表现层或者是实体对象来完成呢?我们挨个来分析好了。

1 分配给业务逻辑层:判断文章的作者和和我们的业务有关吗?
  我认为回答这个问题的一个方法是把它放到不同的业务环境中去检查它的实现方式是否相同如果都是相同则说明它和业务无关。那么它就不属于业务逻辑层的职责。
  例如:在论坛里、贴吧里、B2B里面、我们判断当前登陆的用户是否某一文章的作者不都是用登陆的session来与文章的作者的属性做比较的吗。当然我们也有可能使用cookie来保存当前登陆的用户名,这时就要使用COOKIE里面的内容来做判断了。但是不管我们是用cookie还是用session或用其他的方式来保存当前用户。这些都是和业务逻辑无关的,这只是技术上的一种实现手段,所谓的业务逻辑应该是业务员或老板最精通和了解的东西。但是这些显然都不是他们所擅长的。
  所以我断定这个职责不属于业务逻辑层的。

2 分配给表现层:想把他放到表现层的原因是由于要完成文章列表的显示需要同时做IsAutor(username)和ShowControl()这两个动作。但是我们已经确定了ShowControl()这个是在表现层实现,而完成IsAutor这个功能所需要的信息session和作者名,在这里都具有,不需要做参数的传递。高内聚原则告诉我们相关的东西应该放到一起。信息专家模式告诉我们如果某个对象具有完成某项职责所需要的信息那么就把该职责分配给这个对象。 结合高内聚,低耦合和信息专家这3个面向对象通用职责分配原则的知识所以给了我在表现层实现的理由。

3 分配给实体对象:为什么不把他分配给实体对象是因为应用中的各个层都需要用实体对象来进行通信,而且我所看的3层架构案例中一般情况下实体对象都是只有属性。另外OOD追求的目标是功能内聚数据耦合。所以我没有把他放到实体对象里。
      既然这样那为什么会考虑这种方式呢?因为当系统应用的其他地方需要输出文章列表时候我不想重复的来写这段实现代码。因为在.net里面一个aspx页面就是一个类 . 如果能有一个类可以把这段代码放进去让我用的就new它然后调用它的方法来完成这个功能就好了。

      综合以上分析我决定采用第二种解决方案,但我并不认为这个一定是对的或许还有更好方法,但是由于目前掌握的知识所限我没能发现,我就暂且先把它归纳到表现层完成。希望以后能找到。

      如果各位看到了这里,因为我是新手不确定说的是否正确,所以其他的一些分析我没发布出来。由于项目需要最近疯狂的在补这些知识,希望各位能给予一些指导性意见,谢谢大家!

posted @ 2009-02-08 10:11  rentj  阅读(5375)  评论(12编辑  收藏  举报