需要有关分层解决方案、关注点分离等方面的建议

Posted

技术标签:

【中文标题】需要有关分层解决方案、关注点分离等方面的建议【英文标题】:Need advice regarding layered solution, separation of concerns, etc 【发布时间】:2010-09-22 21:56:02 【问题描述】:

我们有一个分层的应用程序,或者至少正在过渡到一个,分解如下:

界面(用户界面或应用程序界面,即网络服务等) 业务逻辑 数据访问

为了让这个问题的其余部分更加具体,我将描述一个具体的例子。

我们有一个用户界面,它背后有一个控制器对象(业务逻辑层)。该控制器通过另一个对象(数据访问层)与数据库通信。

在给定的上下文中,用户界面允许用户选择一名员工来与正在执行的操作相关联。由于有关于用户(实际上是控制器之外的任何世界)可以选择哪些员工的规则,控制器为此提供了两件事:

一个可读的属性,包含可供选择的员工列表 包含当前选择的员工的读/写属性

用户界面可能会读取列表并使用它来填充组合框。

在此应用程序的版本 1 中,组合框包含员工的识别号 + 员工的姓名。

一切都好……

...直到版本 1.1,一个错误修复。用户抱怨他无法在 Jimmy OlsonJimmy Olson 之间进行选择,因为该应用程序无法让他轻松地知道哪个是哪个。他知道销售部门有一个 Jimmy,开发部门有另一个,所以这个 1.1 版本的解决方法是简单地在组合框中添加一个斜线 + 部门名称。在版本 2 中,我们会选择将组合框替换为具有列支持的组合框,移除斜线,但在 1.1 中,选择此选项是为了最大限度地减少出现更多错误的风险。

换句话说,组合框将包含:

1 - Jimmy Olson/销售 2 - Jimmy Olson/开发 其他人

但是,用户界面代码没有 SQL 代码,也没有任何方法可以控制该部门,因此我们必须到控制器那里查看代码。控制器不需要部门,老实说,它甚至不需要员工的姓名,识别号就足够了,因此控制器中没有任何东西向部门索取或做任何事情。所以我们必须下到数据访问层并在那里更改 SQL。

坦率地说,这个解决方案闻起来很香。

如果这个控制器有多个接口,有不同的要求,我们有三种可能的解决方案:

    更改数据访问层以满足多个接口(2 层之外)的(增加/多样化)需求,这意味着所有接口可能会获取它们需要的所有数据,但它们也会获取所有数据任何其他接口都需要 添加一些内容,让用户界面告诉数据访问层(仍然是 2 层)它需要什么 以某种方式让用户界面层获取所需的数据,而无需更改所涉及的控制器或访问层,这听起来像是我们需要更多的数据访问代码,在某个地方。

以上解决方案都感觉不好。

我想知道的是,我们完全偏离了轨道吗?你会怎么做?上面3个以下还有第四个和第五个解决方案吗?

根据这个问题:Separation of Concerns,接受的答案包含此引用:

关注点的分离是将每个关注点的代码分开。改变接口应该不需要改变业务逻辑代码,反之亦然。

这是否仅仅意味着所有控制器/数据访问层应该为我们提供完成其工作所需的一切(即员工的识别号码),然后用户界面应该与数据库对话并询问有关这些特定员工的更多信息?

【问题讨论】:

【参考方案1】:

在我看来,你有两种可能:

    让底层发送所有 他们掌握的关于 人,可能是一个 XML 文档, 尽管许多消费者 这些信息并不需要全部。 为更高级别提供 API 层向下钻取并获得 他们需要的信息。所以在 如果你给,有一个方法 接口可以问业务 层向数据库层询问 给定用户 ID 的部门。

两者都有取舍。第一个公开了更多信息,可能是对无权获得该信息的消费者。第二个是每笔交易传递的信息要少得多,但需要更多的交易。第一个不需要在每次获得更多信息时都更改 API,但会更改 XML。第二种是保持现有 API 的接口不变,但根据需要提供新的 API。以此类推。

【讨论】:

对,我觉得这些都不好。例如,如果我们只发送控制器需要的东西,我们需要,正如你所说,有一种方式来说“好吧,我需要更多”,这必须尽可能精简,而不是执行一个 sql每个员工... @lassevk - 就像我说的,这是一种权衡。您必须决定哪种权衡最适合您。

以上是关于需要有关分层解决方案、关注点分离等方面的建议的主要内容,如果未能解决你的问题,请参考以下文章

服务读写分离(读服务,写服务),是否可行?

需要有关基于内存拉取的队列库的建议

java中分层架构写代码

探秘SpringAop_介绍以及使用详解

关于校园霸凌,刚刚发生(解决问题之霸凌方家庭操作建议)

关于校园霸凌,刚刚发生(解决问题之霸凌方家庭操作建议)