我们有一个分层应用,或至少是在转换到一个,过程细分如下:需要咨询关于层状溶液,关注点分离等
- 接口(用户界面或应用程序 - 接口,即web服务等)
- 业务逻辑
- 数据访问
为了使这个问题的其余部分更具体,我将描述一个具体的实例。
我们有一个用户界面,它有一个控制器对象(业务逻辑层)。该控制器通过另一个对象(数据访问层)与数据库通信。
在给定的上下文中,用户界面允许用户选择一名员工以将正在执行的操作绑定到。由于有关于用户(当然,控制器真的以外的任何世界),可以挑选员工的规则,该控制器提供了这样两两件事:
- 包含可用的员工名单一个可读的属性从 选择
- 读/写包含当前选择的员工
用户界面可以阅读列表,并使用它来填充组合框属性。
在本申请的第1版中,组合框包含雇员的标识号+员工的姓名。
一切都很好...
...直到版本1.1,一个错误修正。用户抱怨他不能在Jimmy Olson和Jimmy Olson之间选择,因为该应用程序不能让他很容易知道哪个是哪个。他知道销售部门有一个Jimmy,开发部门有另一个Jimmy,所以这个1.1版本的解决方案是简单地在组合框中加上斜杠+部门名称。在版本2中,我们将选择使用支持列的组合框替换组合框,删除斜杠,但在1.1中,为了最大限度地减少进一步错误的风险,选择了这种方法。
换句话说,组合框将包含:
- 1 - 吉米·奥尔森/销售
- 2 - 吉米·奥尔森/开发
-
- 别人
但是,用户界面代码没有SQL代码或任何获取方式对该部门的控制,因此我们必须去控制器并查看那里的代码。控制器不需要部门,老实说,它甚至不需要员工的姓名,识别号码就足够了,因此控制器中没有任何要求或对部门做任何事情。所以我们必须下到数据访问层并在那里更改SQL。
这个解决方案很坦率地闻到。
如果有多个接口到该控制器,具有不同的要求,我们有三个可能的解决方案:
- 更改数据访问层,以迎合(增加/多样)的多个接口需求(2层客场),这意味着所有的接口将可能获得他们所需要的数据,但他们也将获得所有所需的任何其他接口的
- 添加的东西,让用户界面告诉数据访问层的数据(仍在2层以外)它需要什么
- 不知何故使用户界面la你可以在不改变涉及的控制器或访问层的情况下获得所需的数据,这听起来像我们需要更多的数据访问代码。
以上解决方案的感觉很好。
我想知道是,我们是完全偏离航向?你会如何做到这一点?在上述3以下是否有第四个和第五个解决方案?
每一个问题:Separation of Concerns,公认的答案包含了这句话:
关注分离是保持代码为每个这些问题分开。更改界面不应该要求更改业务逻辑代码,反之亦然。
这是否仅仅意味着所有控制器/数据访问层应该为我们提供的是执行其工作所需的任何内容(即员工的识别号码),然后用户界面应该与数据库并询问有关这些特定员工的更多信息?
对,这些都对我感觉不错。例如,如果我们只发送控制器需要的东西,就像你说的那样,我们需要一种方式来说“好吧,我需要更多”,并且这必须尽可能地精益,而不是执行一个sql每个员工... – 2008-11-18 18:37:07