Answers:
在了解“ 横切关注点”之前,我们必须先了解“ 关注点”。
甲关注的是,是指系统的功能的基础上划分的一部分的术语。
关注分为两种类型:
该图代表了一个细分为模块的典型应用程序。每个模块的主要关注点是为其特定领域提供服务。但是,每个模块还需要类似的辅助功能,例如安全日志记录和事务管理。横切关注点的一个示例是“日志记录”,它经常在分布式应用程序中使用,以通过跟踪方法调用来辅助调试。假设我们在每个函数体的开头和结尾都进行日志记录。这将导致横切所有具有至少一个功能的类。
我认为,跨部门关注的最佳例子就是交易行为。例如,必须在所有服务方法中都放置带有提交和回滚调用的try-catch块,这会令人反感。用标记注释方法,AOP可以使用这些标记将其封装为所需的交易行为,这是一个很大的胜利。
授权是跨领域关注的另一个很好的候选人。与在服务方法代码中处理标记相比,用标记来标记服务方法,该标记可以告诉谁可以调用它,并让一些AOP建议决定是否允许该方法调用。
使用AOP建议实施日志记录可能是获得更大灵活性的一种方式,因此您可以通过更改联接点来更改记录的内容。在实践中,我看不到项目经常这样做。通常使用log4j之类的库,使您可以根据日志记录级别和类别进行过滤,如果需要,可以在运行时很好地解决问题。
核心问题是应用程序存在的原因,即应用程序自动化的业务逻辑。如果您有一个物流应用程序来处理货运,那么弄清楚您可以在卡车上装多少货物,或者卡车下车的最佳路线是什么,这可能是核心问题。跨部门关注点通常是实现细节,需要与业务逻辑分开。
除了已接受的答案外,我还要提及另一个涉及跨领域的问题:远程处理。假设我只想在本地调用我的生态系统中的其他组件,就像它们在运行一样。也许在某些情况下,他们甚至这样做。但是现在我想在云或群集中运行我的服务。作为应用程序开发人员,我为什么要关心这方面?一个方面可以照顾到找出呼叫者和呼叫方式,并在必要时对传输的数据进行序列化并进行远程呼叫。如果一切都在进行中,则方面将只转发本地呼叫。在被叫方,方面将反序列化数据,进行本地呼叫并返回结果。
现在,让我告诉您一个有关日志输出等“琐碎”事情的小故事:就在几周前,我为客户端重构了一个复杂但不太大的代码库(大约25万行代码)。在数百个类中,使用了一种日志记录框架,在另外数百个中,使用了一种。然后有几千行System.out.println(*)
真正应该有日志输出的地方。因此,我最终修复了分散在整个代码库中的数千行代码。幸运的是,我可以在IntelliJ IDEA(结构化搜索和替换)中使用一些巧妙的技巧来加快整个操作的速度,但是,男孩,您不认为这很简单!当然,与上下文密切相关的调试日志记录肯定会始终在方法主体中发生,但是许多重要的日志记录类型,例如跟踪方法调用(甚至分层地显示缩进的输出),记录已处理或未处理的异常,用户审核(记录对基于用户角色的受限方法等)可以轻松实现,而又不会污染源代码。日常应用程序开发人员无需考虑它,甚至无需查看遍布整个代码库的记录器调用。
对于其他跨领域问题,我可以提出类似的解释。保持代码整洁并避免IMO的散乱和缠结是专业问题,而不是可选的问题。最后但并非最不重要的一点是,它使代码保持可读性,可维护性和可重构性。阿们
横切关注点是始终存在的场景,无论应用程序的类型如何。
例如日志记录,安全性,性能分析,本地化,可访问性,事务处理等。无论我们要构建的软件是什么,都需要日志记录(否则,有人将如何调试产品或从产品数据中获取一些相关信息)。只有只有可靠的用户才能使用正确的特权集进入应用程序,才需要安全性(身份验证/授权等)。我们需要知道您的应用程序如何执行,然后需要进行性能分析。如果国际用户使用应用程序(使用他们自己的本地化语言),那么我们需要在应用程序中支持该应用程序。可访问性是残疾人使用我们的应用程序的可用性案例。
现在,无论我们的应用程序是基于桌面,基于Web的应用程序,还是如果最终用户都需要在生产环境中跨地区使用它,那么都需要交叉使用。到目前为止,我还没有透露有关应用程序的全部内容,但给出了在生产环境中将其发布给最终用户之前应解决的问题列表。而这全都涉及交叉问题(所有应用程序/方法/类都需要处理,即在各个级别上)。