我的“框架”中有一些库,例如路由、配置、记录器……我希望它们彼此独立,就像一些众所周知的 PHP 框架一样。
我了解松散耦合的所有原则,但我不知道如何同时遵循松散耦合和 DRY 原则。如果我制作配置和记录器的路由库,那么我不会重复自己,但如果我想单独使用路由器,它将无法工作。同样,如果我将日志记录和配置代码写入我的路由库,我会重复自己。
我的“框架”中有一些库,例如路由、配置、记录器……我希望它们彼此独立,就像一些众所周知的 PHP 框架一样。
我了解松散耦合的所有原则,但我不知道如何同时遵循松散耦合和 DRY 原则。如果我制作配置和记录器的路由库,那么我不会重复自己,但如果我想单独使用路由器,它将无法工作。同样,如果我将日志记录和配置代码写入我的路由库,我会重复自己。
松散耦合通常意味着您的组件不需要具体实例,而只需要一个具有兼容接口的实例。
然后,每个协作者都可以替换为相同类型的不同协作者。该代码不再依赖于其中之一的具体实现。
所以:
不使用:
全局(静态)函数
Foo:bar();
基于类的编程(传递类名)
stream_wrapper_register("var", "VariableStream");
全局常量
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
但:
使用对象
$foo->bar();
针对接口编程
public function __construct(LoggerInterface $logger) {
使用模拟进行单元测试
$logger = $this->getMock('LoggerInterface', array('log'));
另见: