部分关注点“横切”程序代码中的数个模块,即在多个模块中都有出现,它们即被称作“横切关注点(Cross-cutting concerns Horizontal concerns)”。
这样说好像还是特别抽象?那我们举个例子。
日志功能就是横切关注点的一个典型案例。日志功能往往横跨系统中的每个业务模块,即“横切”所有需要日志功能的类和方法体。所以我们说日志成为了横切整个系统对象结构的关注点 —— 也就叫做横切关注点啦。
对于 OOP 来说,我们很难在不同的继承关系链中共用代码。
虽然我们对此嗤之以鼻,但在业务时间紧迫(或懒懒懒)时,很多人还是会采用这种方案。
方案的缺点一目了然:代码重复率高。复制粘贴一时爽,后期维护火葬场。
像 PHP、Java、Swift 等是不支持多重继承的,Python 或 C++ 可以使用这种方案。
但多重继承会带来另一个问题:菱形缺陷(Diamond Problem)。
依赖注入是指通过外部传入带有某个方法的对象来使用这个方法。
例如我们定义一个带有写日志方法的 Log 类,如果我们要在类 A 中调用这个方法,那么就把 Log 的一个对象直接注入类 A 中。
在 PHP 框架 Laravel 中就大量使用了依赖注入。
这里涉及到 Swift 中的协议和协议扩展。
先定义一个包含写日志方法 writeLog() 的协议:
然后为这个 writeLog() 提供一个默认的实现方法,即协议扩展:
这样一来,任何遵守 Log 协议的类都可以使用默认的 writeLog() 方法了。
如果你觉得文章写得不错,请帮我两个小忙:
关注公众号“编程拯救世界”,公众号专注于编程基础与服务端研发,你将第一时间获得新文章的推送~