横切关注点与面向切面编程(AOP)

945 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

横切关注点指的是一类具有横越多个模块的行为,即使用传统的软件开发方法不能够达到有效模块化的一类特殊的关注点。

在面向切面的程序设计(AOP)中,横切关系是程序中和其他模块有联系的“切面”。这些关系在程序模块化的设计和实现中无法被自然地分解,从而导致代码过于分散、或者代码冲突。

AOP:

面向切面的程序设计将代码逻辑切分为不同的模块(即关注点,指一段特定的逻辑功能)。几乎所有的编程思想都涉及代码功能的分类,将各个关注点(Concern)封装成独立的抽象模块(如函数、过程、模块、类以及方法等),后者又可供进一步实现、封装和重写。部分关注点“横切”程序代码中的数个模块,即在多个模块中都有出现,它们即被称作横切关注点(Cross-cutting concerns, Horizontal concerns)。

image.png

举个例子来说,编写一个处理医生记录的app,这些记录的索引是核心模块,同时关于存储就医记录或用户信息的历史日志,或者是登录的验证系统,他们由于和app中大部分模块都有联系所以成为了“横切关系”。

补充概念(知识点)

关注点是对软件工程有意义的小的、可管理的、可描述的软件组成部分,一个关注点通常只同一个特定概念或目标相关联。传统的程序设计语言,以一种线性的文本来描述软件,只采用一种方式比如类,将软件分解成模块;这导致某些关注点比较好的被捕捉,容易进一步组合、扩展;但还有一些关注点没有被捕捉,弥散在整个软件内部。

关注点分离(SOC) 是标识、封装和操纵只与特定概念、目标相关联的软件组成部分的能力,即标识、封装和操纵关注点的能力。分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通切面来封装、维护,这样原本分散在在整个应用程序中的变动就可以很好的管理起来。

核心关注点是一个软件最主要的关注点。在传统的程序设计语言中,将软件分解成模块的主要方式,是支配性分解,即按主关注点进行模块分解。用来描述、设计、实现一个给定关注点的软件构造单位是方法。如果两个关注点的实现的方法存在交集,则称谓这两个关注点相互横切(Crosscut)。

面向切面的程序设计的核心概念,是从核心关注点中分离出横切关注点。面向切面编程,在支配性分解的基础上,提供叫做切面(Aspect)的一种辅助的模块化机制,这种新的模块化机制可以捕捉横切关注点。

React HOC 中的实践

官方文档之前建议使用 mixins 用于解决横切关注点相关的问题。但他们已经意识到 mixins 会产生更多麻烦。Mixins 被认为是有害的这篇文章做了很好的阐述,中英文对照在这。

官方文档的使用 HOC 解决横切关注点问题对通过HOC解决横切关注点相关的问题进行了描述和逐步实践,建议仔细阅读。

参考内容:

面向切面的程序设计

横切关注点

React 官方文档 HOC

httpweixin.qq.comr5RGXj2jETTUyrSzs90T3.png

来源:前端妙妙屋 - 前端开发者的学习资源