需要咨询有关的分层方案,关注分离,等等
题
我们有一个分层的应用程序,或者至少是在该过程中过渡到一个,细分如下:
- 接口(用户接口或应用程序接口,即。服务等。)
- 业务逻辑
- 数据访问
为使剩下的这个问题更加具体,我将描述一个具体实例。
我们有一个用户接口,其中有一个控制器对象在它之后(业务逻辑层)。这个控制器会谈的数据库通过的另一个目(数据访问层)。
在特定情况下,用户界面,允许用户选择的一名雇员,以配合运作,正在做。因为有规则关于其员工的使用者(以及,任何外部世界的控制器真的)可以挑选,控制器提供了两件事:
- 一个可读性的含一系列可用员工的选择
- 一读/写的财产含有目前选择的雇员
用户接口的可能读的清单,并用它来填充的一个组合框。
在第1版的这个应用程序,该组合框含有的识别号码的雇员+名雇员。
一切都很好...
...直到1.1版,修正。用户抱怨说,他不能选择之间 吉米奥尔森 和 吉米奥尔森 因为该程序不让它很容易为他知道哪个是哪个。他知道有一个吉米在销售部门,而另一个在发展部门,因此解决这个1.1版本是简单地加一条斜线+的部门名称的组合框。第2版中我们会选择更换组合框有组合框有列支持,消除削减,但在1.1,这是什么选择,以便尽量减少风险的进一步的错误。
换句话说,组合框会包括:
- 1-吉米奥尔森/销售
- 2-吉米奥尔森发展
- 其他人
但是,在用户接口的代码有没有SQL码,或以任何方式取得该部门,因此,我们必须去控制,并期待在代码。控制器不需要的部门,并且是诚实的,甚至不需要这名员工,识别号是不够的,所以没有什么在控制器,询问为或不任何东西的部门。因此,我们必须去到数据存取层,并改变SQL。
这个解决方案相当坦率的气味。
如果有多个接口,以此控制器,具有不同的要求,我们有三个可能的解决方案:
- 变化的数据存取层,满足对于(增加/多样化)需要多个接口(2层走),这意味着,所有的接口,将可能获得所有他们需要的数据,但是他们也将获得所有数据所需的任何其他接口
- 添加的东西,让用户接口告诉数据访问层(仍2层务)需要什么
- 以某种方式使用户接口层掌握的所需的数据没有改变或者控制或接层参与,这听起来像我们需要更多的数据访问代码,什么地方。
没有上述解决方案感觉良好。
我想知道的是,我们完全关闭的课程?你会怎么做这个?还有第四个和第五个解决方案下的3上面?
每一个问题: 分离的问题, 公认的答案包含这句话:
分离的关切问题是保留的代码,用于每个这些关切问题分开。改变的界面,不应该要求改变的业务逻辑码,反之亦然。
不这只是意味着所有的控制数据存取层应该为我们提供的是无论它需要做的工作(ie。识别号码的雇员),然后用户接口应该去帮你的数据库,并要求提供更多的信息 这些具体员工?
解决方案
在我看来,你有两个可能性:
- 有的较低层发起 所有 信息他们有关 人可能作为一种XML文件, 即使许多消费者的 这些信息不需要它所有。
- 提供APIs对于较高级的 层钻下去,并得到的 他们的信息需要。所以在这 情况你给,有一个方法,该方法 该接口可以要求企业 层问的数据库层 该部给予的用户标识。
两者都有权衡取舍。第一个揭露更多的信息,可能对消费者没有任何权利这一信息。第二个经过很多的信息较少每笔交易,但需要更多的交易。第一个不需要更改API每次你有更多的信息,但是变化的XML。第二次保留的接口现有的Api相同,但是提供了新的Api作需求的变化。等等。