我有一个简单的导入器类,可以将成功和失败状态记录到日志文件中。
我已经在类中使日志文件名成为常量:
class MyClass
{
const STATUS_LOG = "my_log.log";
public function doImport()
{
// do import here and log result
}
}
目前我知道没有理由使用不同的日志,但是最好是允许这种灵活性并改为:
class MyClass
{
private $statusLog;
public function __construct($statusLog)
{
$this->statusLog = $statusLog;
}
public function getStatus()
{
return $this->statusLog;
}
public function setStatusLog($statusLog)
{
$this->statusLog = $statusLog;
}
public function doImport()
{
// do import here and log result
}
}
鉴于我目前没有使用不同的日志文件,第二种方法有什么好处吗?
答案 0 :(得分:2)
我认为在日志记录方面,您不应该允许更改日志路径。不在运行时 - 因为有一个问题 - 如果日志路径在'热门'上发生变化,数据完整性会发生什么?灵活性听起来不错,但我认为当你应该允许在运行时改变你的属性时,情况并非如此。
如果您对日志路径犹豫不决,则应通过配置文件调整 - 即在应用程序启动时读取一次。因此,您不会在课程中存储路径,而是从配置中读取(在__construct()
为您的课程)。
答案 1 :(得分:0)
如果你的静态日志文件路径没有改变,你可以留在第一个。
如果它应该能够改变日志路径(现在天气或计划中的未来),我将使用第二个。 (好处是能够设置和获取logpath,getter也可以用于第一个解决方案)。
答案 2 :(得分:0)
您的课程可能会违反single responsibility principle:doImport
方法我得出的结论是您的班级的第一个责任是导入,而且它不应该关注日志记录的详细信息(格式化,文件到哪个)使用,登录开发/生产环境的内容)。为什么不在构造函数中传入一个记录器类(最好是一个实现PSR-3接口的类)? Monolog是一个非常灵活的记录库。
如果您保持文件名(或更好的记录器)的灵活性,您可以为您的班级编写单元测试,而无需担心覆盖重要文件。如果使用内存/虚拟记录器类,则甚至不需要文件系统!
如果您只是编写一个不会被测试的小型一次性脚本,那么使用常量是配置IHMO的好方法。
答案 3 :(得分:0)
这是一个明智的做法。第二种方法更灵活,更明确。此外,日志文件名称不是“真实”常量,例如,pi或赤道长度。当定义为常数时,它只是一个“神奇的价值”,你迟早会忘记它就在那里。
我已经摆脱了setter方法,只允许在构造函数中设置值。