日志文件名的常量vs属性

时间:2013-08-29 12:32:44

标签: php oop

我有一个简单的导入器类,可以将成功和失败状态记录到日志文件中。

我已经在类中使日志文件名成为常量:

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
    }
}

鉴于我目前没有使用不同的日志文件,第二种方法有什么好处吗?

4 个答案:

答案 0 :(得分:2)

我认为在日志记录方面,您不应该允许更改日志路径。不在运行时 - 因为有一个问题 - 如果日志路径在'热门'上发生变化,数据完整性会发生什么?灵活性听起来不错,但我认为当你应该允许在运行时改变你的属性时,情况并非如此。

如果您对日志路径犹豫不决,则应通过配置文件调整 - 即在应用程序启动时读取一次。因此,您不会在课程中存储路径,而是从配置中读取(在__construct()为您的课程)。

答案 1 :(得分:0)

如果你的静态日志文件路径没有改变,你可以留在第一个。

如果它应该能够改变日志路径(现在天气或计划中的未来),我将使用第二个。 (好处是能够设置和获取logpath,getter也可以用于第一个解决方案)。

答案 2 :(得分:0)

您的课程可能会违反single responsibility principledoImport方法我得出的结论是您的班级的第一个责任是导入,而且它不应该关注日志记录的详细信息(格式化,文件到哪个)使用,登录开发/生产环境的内容)。为什么不在构造函数中传入一个记录器类(最好是一个实现PSR-3接口的类)? Monolog是一个非常灵活的记录库。

如果您保持文件名(或更好的记录器)的灵活性,您可以为您的班级编写单元测试,而无需担心覆盖重要文件。如果使用内存/虚拟记录器类,则甚至不需要文件系统!

如果您只是编写一个不会被测试的小型一次性脚本,那么使用常量是配置IHMO的好方法。

答案 3 :(得分:0)

这是一个明智的做法。第二种方法更灵活,更明确。此外,日志文件名称不是“真实”常量,例如,pi或赤道长度。当定义为常数时,它只是一个“神奇的价值”,你迟早会忘记它就在那里。

我已经摆脱了setter方法,只允许在构造函数中设置值。