在应用程序中添加全局日志 - SOLID 怎么样
Add global logs in app - what about SOLID
我有 php 应用程序,它不符合 SOLID 原则,但整个团队尝试重构代码以进行更改。我必须添加全局日志(存储在其中一个数据库中),保存在模型更新的创建中。该模型不使用 ORM。第一个解决方案:创建静态记录器并在模型操作后调用:
public function save(ObjectEntity $entity)
{
// Some code to prepare entity
$this->insert($entity);
Logger::saveLog('Object has been saved');
// Or maybe better - separate classes for logs with interface
Logger::save(new LogObjectEntitySave());
}
但是……是这样吗?我认为也不符合 SOLID 并且不想在当前造成新的混乱。我应该在哪里添加这样的东西 - 在模型上,或者在调用模型保存后在控制器上:
public function saveAction()
{
// Controller code here
$model->save($objectEntity);
Logger::save(new LogObjectEntitySave());
}
但有一个问题:在模型中保存和更新数据的一个操作怎么样(我在没有现有 ID 时添加新元素)? If/else 和两个日志 类.. 看起来仍然很糟糕。不知道应该怎样才对。
1) 在模型 save()
中执行记录操作,而不是在控制器中,在 saveAction 中。否则,您将不得不找到每 $model->save($objectEntity)
段代码并添加日志记录。如果您忘记了其中之一,您的日志记录功能将不可靠,您的日志就会对您撒谎,您无法信任它们,它们将变得毫无用处。
2) 如果您认为您违反了 SOLID 中的 S,因为您的模型 save()
操作做了 2 件事(insert() 和 saveLog),不,它没有。因为它将执行日志记录操作的责任委托给了 saveLog()。调用 saveLog() 没问题,不违反 SOLID。
3) static Logger class 确实不是最好的选择(不能轻易被另一个实现替换,到处都是硬编码......)但是如果你的应用程序没有容器等依赖注入能力,这不是一个糟糕的选择:它易于使用、易于控制和维护。如果它让您作为开发人员的生活更轻松,那已经是向前迈出的一大步 :) .
如果您有依赖注入,请像 Symfony 框架那样注入 Logger 服务。
4) 关于你何时进行保存和更新的最后一个问题,我认为你将需要 if/else 日志记录案例。是的,这使它变得复杂(将其包装在私有函数中以隐藏其复杂性可能很好),但您的日志将清晰准确。这很重要。
您的日志记录操作将很复杂,因为记录的内容很复杂。你对此无能为力。
希望对您有所帮助
我有 php 应用程序,它不符合 SOLID 原则,但整个团队尝试重构代码以进行更改。我必须添加全局日志(存储在其中一个数据库中),保存在模型更新的创建中。该模型不使用 ORM。第一个解决方案:创建静态记录器并在模型操作后调用:
public function save(ObjectEntity $entity)
{
// Some code to prepare entity
$this->insert($entity);
Logger::saveLog('Object has been saved');
// Or maybe better - separate classes for logs with interface
Logger::save(new LogObjectEntitySave());
}
但是……是这样吗?我认为也不符合 SOLID 并且不想在当前造成新的混乱。我应该在哪里添加这样的东西 - 在模型上,或者在调用模型保存后在控制器上:
public function saveAction()
{
// Controller code here
$model->save($objectEntity);
Logger::save(new LogObjectEntitySave());
}
但有一个问题:在模型中保存和更新数据的一个操作怎么样(我在没有现有 ID 时添加新元素)? If/else 和两个日志 类.. 看起来仍然很糟糕。不知道应该怎样才对。
1) 在模型 save()
中执行记录操作,而不是在控制器中,在 saveAction 中。否则,您将不得不找到每 $model->save($objectEntity)
段代码并添加日志记录。如果您忘记了其中之一,您的日志记录功能将不可靠,您的日志就会对您撒谎,您无法信任它们,它们将变得毫无用处。
2) 如果您认为您违反了 SOLID 中的 S,因为您的模型 save()
操作做了 2 件事(insert() 和 saveLog),不,它没有。因为它将执行日志记录操作的责任委托给了 saveLog()。调用 saveLog() 没问题,不违反 SOLID。
3) static Logger class 确实不是最好的选择(不能轻易被另一个实现替换,到处都是硬编码......)但是如果你的应用程序没有容器等依赖注入能力,这不是一个糟糕的选择:它易于使用、易于控制和维护。如果它让您作为开发人员的生活更轻松,那已经是向前迈出的一大步 :) .
如果您有依赖注入,请像 Symfony 框架那样注入 Logger 服务。
4) 关于你何时进行保存和更新的最后一个问题,我认为你将需要 if/else 日志记录案例。是的,这使它变得复杂(将其包装在私有函数中以隐藏其复杂性可能很好),但您的日志将清晰准确。这很重要。 您的日志记录操作将很复杂,因为记录的内容很复杂。你对此无能为力。
希望对您有所帮助