关注分离的艺术 已翻译 100%

我是菜鸟我骄傲 投递于 2015/09/03 08:21 (共 24 段, 翻译完成于 09-12)
阅读 3859
收藏 143
5
加载中

前言

在软件工程中,关注的分离是指在系统中为达到目的对软件元素的划分与对比。通过适当的关注分离,将复杂的东西变成可管理的。这篇文章的目的是促进对关注分离的原则的理解,以及提供一个基础概念的设置来帮助软件工程师开发出可维护的系统。

我是菜鸟我骄傲
我是菜鸟我骄傲
翻译于 2015/09/03 11:39
1

关注点分离原则

关注点分离原则所描述的是系统的元素应该表现出互不相干的目的。也就是说,没有会分担另外一个元素职责的,或者其它不相干职责的元素。关注点的分离是通过明确边界来达成的。边界是任何逻辑或者物理的限制,它能给一组特定的职责划定界限。一些边界的例子包括在一个应用程序中定义了系统核心行为的方法,对象,组件以及服务;针对源代码组织结构的项目,方案,以及目录的层级结构;用于处理组织的应用程序层级或分片结构;以及用于产品发布组织结构的版本库和安装文件。尽管达成关注点分离的处理经常涉及一组职责的分离,但其目标并不是将系统限制成一个不可分割的部分,而是去将系统组织成互不重复的高凝聚的责任单位。正如阿尔伯特爱因斯坦所言 “让一切尽可能简约而不简单。”本质上讲,关注点分离关乎于秩序。关注点分离的全局目标是建立一个组织良好的系统,其每个部分都满足一个有意义和直白的作用,从而最大化其适应改变的能力。

风情少爷
风情少爷
翻译于 2015/09/03 13:39
2

关注点分离的价值

将关注点分离原则应用于软件设计有许多的好处。首先,单个组件少了重复并且目的单一,会使得整个系统更易于维护。其次,作为提高了可维护性的副产品,系统整体变得更加稳定。第三,这一需要确保每个组件只把关注点放在一组单一明确职责的策略,常常可以得到天然的可扩展性。第四,由组件专注于单一目标所形成的解耦,使得在其它系统中的复用,或者在同一个系统中的不同上下文的容留,变得更加的容易。关注点分离原则在应用于商业组织机构时也可以带来好处。在大公司中,确保组织及其子机构分配到独立明确的职责,将有助于通过最小化团队之间的协调工作,并最大化每个团队专注于其各自职责的潜能,来促进整体目标的达成。关注点分离原则同样能促进企业级规模的系统性问题的解决。当责任被正确的分配,问题的定位就会变得更加容易,解决起来更加快速, 个人的职责能力也得到了增加。这些领域中的每一个都可以回过头来使得质量控制过程得到促进。无论所面对的是有人构成的组织,还是软件系统,关注点分离原则都能通过消除不必要的重复和分配适当的责任来帮助对于复杂性的管理。在下一节,将讨论在应用程序的设计中实现关注点分离,可以使用的各种技术。

风情少爷
风情少爷
翻译于 2015/09/03 14:04
1

水平分离

关注点的水平分离指的是将一个应用程序分离成满足应用程序中相同角色逻辑功能层级的过程。一个通行的针对图形用户界面应用程序的分离就是对展现层、业务层和资源访问层进行分离的过程。这些类别涵盖了大部分应用程序所需要的主要关注点,并呈现出一种最小化了应用程序中依赖层次的组织结构。图 1 就描述了一个典型的三层级应用程序:

    图 1

LeoXu
LeoXu
翻译于 2015/09/03 14:13
2

表示层包含与应用程序用户界面相关的处理和组件。这包括组件定义一个应用程序的可视化显示,并可能包括先进的设计理念,如控制器,演示层,或表示模型。表示层的主要目标是封装所有用户界面的关注,以便允许应用程序域独立变化。表示层应该包括所有组件和过程,只涉及到应用程序的可视化显示需求,并应排除其他所有组件和流程。这允许在应用程序中的其他层不同于他的显示关系。业务层包含与应用程序域相关的流程和组件。这包括定义对象模型、管理业务逻辑、控制系统工作流程的组件。业务层可以通过专门的组件为代表的工作流程,为业务流程,并在应用程序使用的实体,或通过传统的面向对象的域模型封装了数据和行为。业务层的主要目标是封装核心业务关注的应用程序的数据和行为如何被曝光,或如何具体地获得数据。业务层应该包括所有的组件和流程,只涉及到应用程序的业务域,并且应该排除所有其他组件和流程。资源访问层包含相关的外部信息的访问过程和组件。这包括与本地数据存储或远程服务接口的组件。资源访问层的目标是提供一个围绕数据访问特定的细节的抽象层。这包括建立数据库和服务连接的任务,维护数据库模式或存储过程的知识,服务协议的知识,以及服务实体和业务实体之间的数据的传送。资源访问层应该包括所有的组件和过程,只涉及到系统访问数据的外部,并且应该排除所有其他组件和过程。面向服务的应用程序使用的另一个公共部门是将应用程序划分为服务接口层、业务层和资源访问层,如图 2 所示:

Figure 2

华夏第一帅神
华夏第一帅神
翻译于 2015/09/03 16:13
2

这部分,业务和资源访问层服务于先前讨论的相同的目标,暴露的服务封装成一个服务接口层。这层包括服务接口,如业务流程的曝光,通过各种协议服务的约定和数据类型的管理。服务接口层的主要目标是封装所有服务接口,以便允许应用程序域独立地改变。服务接口层应该包括所有的组件和过程,只涉及到应用程序的曝光服务,并且应该排除所有其他组件和过程。分组处理涉及基于他们的应用程序中的作用,提高整个系统的可管理性。这些好处包括易于维护,通过一致的体系结构和隔离的过程,增加了绝缘的变化的影响,增加适应性变化,并增加了潜在的重用。

华夏第一帅神
华夏第一帅神
翻译于 2015/09/03 16:21
2

垂直分离

垂直分离指的是将应用程序划分为与子系统功能相似的功能模块。垂直分离将整体应用的特点,在一个单一的边界内,将任何接口、业务和资源访问问题关联。图 3 描述了一个应用程序分成三个模块:


Figure 3

华夏第一帅神
华夏第一帅神
翻译于 2015/09/03 16:24
2

将一个应用程序的功能分离出来,阐明了每个功能的责任和依赖关系,可以帮助测试和整体维护。从逻辑上讲,边界可以定义为帮助组织,或物理上,独立的开发和维护。逻辑边界意味着模块化的存在,虽然用于表示分离的方法可能与应用程序的实际部署或运行时行为无关。这对于提高应用程序的可维护性是有益的,因为在物理上分离功能的未来的努力是有益的。图4描述了一个包含逻辑边界的应用程序:

Figure 4

华夏第一帅神
华夏第一帅神
翻译于 2015/09/03 16:27
2

物理边界通常被用在开发插件或者组合式应用程序这些场景中, 可以使得其功能特性由不同的开发团队来管理. 支持模块插件技术的应用程序经常采用诸如自动发现,或者基于一个外部配置源来对模块进行初始化的技术。图 5 所展示的托管框架就包含了由不同的开发团队开发的模块:

    图 5

LeoXu
LeoXu
翻译于 2015/09/04 11:15
1

而垂直的分离,会基于总体上能实现一个应用程序中的特定功能,对彼此相关的一个关注点集合进行组合, 而这并不排除对其它关注点分离策略的使用。例如,每个模块其自身可能会被设计成使用层级来圈定模块内部组件各自的角色。图 6 展示了一个同时使用垂直和水平关注点分离策略的应用程序:

图 6

LeoXu
LeoXu
翻译于 2015/09/04 11:27
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(11)

我是菜鸟我骄傲
我是菜鸟我骄傲

引用来自“jQer”的评论

学 Java 的思想上最容易搞这些框框的东西,看不到内部的运作过程,思维总是局限于面上,达不到点上

引用来自“简单代码”的评论

书是死的,人是活的!别这么把你的先进经验强加在所有人身上!

引用来自“jQer”的评论

你的意思是你是写 Java 并且知道系统调用如何包装的?
主要就是遵循单一原则
jQer
jQer

引用来自“jQer”的评论

学 Java 的思想上最容易搞这些框框的东西,看不到内部的运作过程,思维总是局限于面上,达不到点上

引用来自“简单代码”的评论

书是死的,人是活的!别这么把你的先进经验强加在所有人身上!
你的意思是你是写 Java 并且知道系统调用如何包装的?
狗头666
狗头666
解耦?
顽Shi
顽Shi
高内聚低耦合,翻译的看不懂...
__JM_Joy__
__JM_Joy__
过度设计 😏
简单代码
简单代码

引用来自“jQer”的评论

学 Java 的思想上最容易搞这些框框的东西,看不到内部的运作过程,思维总是局限于面上,达不到点上
书是死的,人是活的!别这么把你的先进经验强加在所有人身上!
ranran__90
ranran__90
分离解耦 是 任何工程都需要遵循的法则,翻译的不错。
jQer
jQer
学 Java 的思想上最容易搞这些框框的东西,看不到内部的运作过程,思维总是局限于面上,达不到点上
jQer
jQer
这些名字不过是教条主义,实用的分离是按照你需要的模型构造各个包装器
百世经纶之傲笑红尘
百世经纶之傲笑红尘
不学软件工程体系,不知道那句口号高内低外者慎读
返回顶部
顶部