假设您正在编写一个“更大”的应用程序,并且想要在类中记录某些错误。现在几乎每个班级都需要访问记录器。分享重要实例,无需耦合
一个简单的解决办法是以下(PHP,但是这并不重要):
class SomeClass {
public function someMethod() {
// stuff ...
Logger::log("something happened");
// stuff ...
}
}
这种方法的问题是,它使得它使用记录仪每类依赖于它,你可以在没有Logger的情况下,不要在其他项目中使用相同的类。它紧密结合在一起。如果不更改SomeClass
的实施方式,则无法更改消息的记录方式。
该办法的一个“小”的升级上面会如下:
class SomeClass {
private $logger;
public function __construct(/* stuff */) {
$this->logger = LoggerFactory::getLogger();
}
public function someMethod() {
// stuff ...
$this->logger->log("something happened");
// stuff ...
}
}
这并不能真正解决问题,因为现在SomeClass
简单地依赖于LoggerFactory
,它的紧耦合到它。好的是,LoggerFactory
现在可以返回Logger
类的不同实例。所以,如果你想改变消息的记录方式,你不需要改变SomeClass
的实现。
的另一种方法将使用依赖注入:
class SomeClass {
private $logger;
public function __construct(Logger $logger, /* stuff */) {
$this->logger = $logger;
}
public function someMethod() {
// stuff ...
$this->logger->log("something happened");
// stuff ...
}
}
现在,这并不夫妇SomeClass
于任何特定的类。它只需要一个实现Logger
接口的类。但是我遇到的问题是,只要创建对象,就需要将Logger
实例传递给构造函数。
$object = new Position($this->logger, $x, $y);
另一个问题我有这个的是,该记录器是不是真的Position
类像$x
和$y
的一部分。这只是一个实用程序。
你如何处理最好的情况?在这种情况下,耦合与内聚之间的最佳折衷是什么?
在StackOverflow的另一个线程上找到了一些PHP AOP框架:http://stackoverflow.com/questions/4738282/are-there-任何面向-工作纵横-PHP-库 – Peter 2013-03-01 13:13:35