cross-cutting concern
的一个好例子是什么? wikipedia页面上的医疗记录示例对我来说似乎不完整。
特别是从这个例子中,为什么日志记录会导致代码重复(散射)? (除了log("....")
之外的简单调用,这看起来并不是什么大不了的事。
core concern
和cross-cutting concern
之间的区别是什么?
我的最终目标是更好地了解AOP。
答案 0 :(得分:181)
在了解 Crosscutting Concern 之前,我们必须了解关注。
关注是指根据功能划分的系统部分的术语。
关注点有两种类型:
此图表示分解为模块的典型应用程序。每个模块的主要关注点是为其特定域提供服务。但是,这些模块中的每一个还需要类似的辅助功能,例如安全日志记录和事务管理。横切关注的一个例子是"伐木,"它通常用于分布式应用程序,以通过跟踪方法调用来帮助调试。假设我们在每个函数体的开头和结尾都进行日志记录。这将导致横切所有具有至少一个函数的类。
答案 1 :(得分:39)
我认为跨领域关注的最好例子是交易行为。例如,必须在所有服务方法中放置带有提交和回滚调用的try-catch块。使用AOP可用于使用所需事务行为封装它们的标记来注释方法是一个很大的胜利。
作为跨领域关注的一个例子,另一个好的候选人是授权。使用标记来注释服务方法,该标记告诉谁可以调用它,并让一些AOP建议决定是否允许方法调用,可以优于在服务方法代码中处理它。使用AOP建议实现日志记录可以提高灵活性,以便您可以通过更改连接点来更改记录的内容。在实践中,我看不到项目经常这样做。通常使用像log4j这样的库,允许您根据日志记录级别和类别进行过滤,如果需要,可以运行得很好。
核心问题是应用程序存在的原因,即应用程序自动化的业务逻辑。如果您有一个物流应用程序来处理运输货物,那么计算出您可以在卡车上装载多少货物,或者卡车运送货物的最佳路线可能是核心问题。横切关注点通常是需要与业务逻辑分开的实现细节。
答案 2 :(得分:11)
除了接受的答案之外,我想提一个跨领域问题的另一个例子:远程处理。假设我只是想在本地生态系统中调用其他组件,就像它们正在运行一样。也许在某些情况下他们甚至可以。但现在我想运行分布在云或集群中的服务。作为应用程序开发人员,我为什么要关心这方面?一个方面可以负责找出谁打电话,以及如何在必要时串行传输数据并进行远程呼叫。如果一切都在进行中,则方面只会转发本地呼叫。在被叫方方面,方面将反序列化数据,进行本地调用并返回结果。
现在让我告诉你一个关于日志输出等“琐碎”事情的小故事:就在几周前,我为客户端重构了一个复杂但不太大的代码库(大约250K行代码)。在几百个类中,使用了一种日志框架,另外还有几百种。然后有几千行System.out.println(*)
,其中确实应该有日志输出。所以我最终修复了遍布代码库的数千行代码。幸运的是,我可以在IntelliJ IDEA(结构搜索和替换)中使用一些聪明的技巧来加速整个动作,但是男孩不认为这是微不足道的!当然,强烈依赖于上下文的调试日志记录将始终发生在方法体中,但是许多重要类型的日志记录(例如跟踪方法调用(甚至是具有良好缩进输出的分层结构),记录处理或未处理的异常,用户审核(记录调用到基于用户角色的限制方法等等可以在不污染源代码的方面轻松实现。日常应用程序开发人员不需要考虑它,甚至不会看到分散在代码库中的记录器调用。有人负责保持方面是最新的,甚至可以集中在一个地方切换日志策略或整个日志框架。
我可以针对其他跨领域问题提出类似的解释。保持代码清洁,免受散射和纠缠IMO是一个专业的问题,而不是任何可选的。最后但并非最不重要的是,它使代码可读,可维护,可重构。阿门。
答案 3 :(得分:2)
我从维基百科中发现这一点非常清楚:
<块引用>如果编写处理医疗记录的应用程序,则此类记录的索引是核心问题,而记录对记录数据库或用户数据库或身份验证系统的更改历史记录将是交叉问题,因为它们会交互程序的更多部分。
往往是跨领域的关注点示例包括:
<块引用>业务规则
缓存
代码移动性
数据验证
特定领域的优化
错误检测和纠正
国际化和本地化,包括语言 本地化
信息安全
记录
内存管理
监控
坚持
产品特点
实时约束
同步
交易处理
上下文相关帮助
答案 4 :(得分:1)
横切关注点是无论应用类型如何都应始终存在的场景。
例如日志记录,安全性,性能分析,本地化,可访问性,事务等。 无论我们要构建的软件是什么,都需要日志记录(否则,有人将如何调试产品或从产品数据中获取一些相关信息)。只有只有可靠的用户才能使用正确的特权集进入应用程序,才需要安全性(身份验证/授权等)。我们需要知道您的应用程序的性能,然后我们需要进行性能分析。 如果国际用户使用应用程序(使用他们自己的本地化语言),那么我们需要在应用程序中支持该应用程序。 可访问性是残疾人使用我们的应用程序的可用性案例。
现在,无论我们的应用程序是基于桌面,基于Web的应用程序,还是如果最终用户都需要在生产环境中跨地区使用它,那么都需要交叉使用。 到目前为止,我还没有透露有关什么应用程序的全部内容,但是给出了在生产环境中将其发布给最终用户之前应该解决的问题列表。而这一切都是关于交叉问题的(所有应用程序/方法/类都需要处理,即各个级别)。