横切关注的例子

什么是一个cross-cutting concern的好例子? 维基百科页面上的医疗logging示例似乎不完整。

特别是从这个例子来看,为什么日志会导致代码重复( 散射 )? (除了简单的调用,如log("....")到处都是,这似乎不是一个大问题)。

core concerncross-cutting concern什么区别?

我的最终目标是更好地理解AOP。

在了解Crosscutting Concern之前,我们必须理解关心的问题

关注是指根据function划分的系统的一部分。

关注点有两种:

  1. 代表主要需求的单一和特定function的担忧被称为核心问题
    要么
    系统的主要function是知道的核心关切。
    例如 :业务逻辑
  2. 代表二级要求function的关注被称为横切关注或全系统关注
    要么
    横切关注是一个在整个应用程序中都适用的问题,它会影响整个应用程序。
    例如:日志logging,安全性和数据传输是应用程序几乎每个模块都需要考虑的问题,因此它们是交叉的关注点。

礼貌

在这里输入图像说明

这个图代表了一个典型的应用程序,被分解成模块。 每个模块的主要关注点是为其特定的领域提供服务。 但是,这些模块中的每一个还需要类似的辅助function,例如安全日志logging和事务pipe理。 横切关注的一个例子是“日志logging”,这是分布式应用程序中经常使用的,通过跟踪方法调用来帮助debugging。 假设我们在每个函数体的开头和结尾进行logging。 这将导致横切所有至less有一个函数的类。

(礼貌)

我认为跨领域关注的最好例子就是交易行为。 例如,必须在所有服务方法中将提交和回滚调用放在try-catch块中。 使用AOP可用来将它们与期望的交易行为封装在一起的标记来注释方法是一大胜利。

作为一个交叉问题的例子,另一个好的候选人是授权。 使用标记来注释一个服务方法,告诉谁可以调用它,让一些AOPbuild议决定是否允许方法调用,可能比服务方法代码更好。

使用AOPbuild议来实现日志logging可能是获得更多灵活性的一种方式,以便通过更改连接点来更改logging的内容。 在实践中我看不到经常这样做的项目。 通常使用类似log4j的库,可以根据日志logging级别和类别进行过滤,如果需要,可以在运行时进行处理。

核心问题是应用程序存在的原因,即应用程序自动化的业务逻辑。 如果您有一个处理运输货物的物stream应用程序,弄清楚可以在卡车上装多less货物,或者卡车卸下货物的最佳路线,这可能是核心问题。 横切关注点通常是需要与业务逻辑分开的实现细节。

除了被接受的答案之外,我想提出另一个交叉担忧的例子:远程处理。 假设我只是想调用本地生态系统中的其他组件,就好像它们正在运行一样。 也许在某些情况下甚至可以。 但是现在我想运行分布在云或群集中的服务。 为什么我应该关心这方面的应用程序开发人员? 一个方面可以找出谁打电话和如何,如果需要串行传输的数据,并进行远程通话。 如果一切正在运行,该方面只会转发本地电话。 在被调用端,该方面会对数据进行反序列化,进行本地调用并返回结果。

现在让我告诉你一些关于日志输出这样的“微不足道的事情”的小故事:几个星期前,我为客户重构了一个复杂但不是太大的代码库(约25万行代码)。 在几百个class级中,使用了一种logging框架,另外还有另外几百个logging框架。 然后有几千行的System.out.println(*)真的应该是日志输出。 所以我最终修复了遍布整个代码库的数千行代码。 幸运的是,我可以在IntelliJ IDEA(结构search和replace)中使用一些巧妙的技巧来加速整个动作,但男孩不认为这是微不足道的! 当然,强烈依赖于上下文的debugging日志logging将始终发生在方法体内,但是许多重要的日志loggingtypes(例如跟踪方法调用(甚至是层次结构都有很好的缩进输出),logging处理或未处理的exception,用户审计基于用户angular色的受限方法)等等,可以方便地在不污染源代码的情况下实现。 日常应用程序开发人员不需要考虑,甚至可以看到分散在代码库中的logging器调用。 有人负责保持方面的最新,甚至可以在一个地方集中切换日志logging策略或整个日志logging框架。

我可以为其他交叉问题提出类似的解释。 保持代码清洁,避免散布和纠缠IMO是一个专业的问题,而不是任何可选的。 最后但并非最不重要的是它保持代码的可读性,可维护性,可重构性。 阿门。

Interesting Posts