2

成功と失敗のステータスをログ ファイルに記録する単純なインポーター クラスがあります。

次のように、ログファイル名をクラスの定数にしました。

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

現在、別のログ ファイルを使用していないことを考えると、2 番目のアプローチに利点はありますか?

4

4 に答える 4

2

ログの観点から、ログパスの変更を許可すべきではないと思います。実行時ではありません - 質問があるので - ログパスが「ホット」に変更された場合、データの整合性はどうなりますか? 柔軟性は良さそうですが、実行時にプロパティを変更できるようにする必要がある場合はそうではないと思います。

ログのパスについて躊躇している場合は、構成ファイルを介して調整できる必要があります。つまり、アプリケーションの開始時に一度読み取られます。したがって、パスをクラスに保存せず、代わりに構成から読み取り__construct()ます(クラスの場合)。

于 2013-08-29T12:39:58.973 に答える
0

あなたのクラスは単一責任の原則に違反している可能性があります:doImportメソッドから、あなたのクラスの最初の責任はインポートであり、ロギングの詳細 (フォーマット、使用するファイル、開発/運用環境で何をログに記録するか) に関係するべきではないと結論付けました)。コンストラクターでロガー クラス (できればPSR-3インターフェイスを実装するクラス) を渡さないのはなぜですか? Monologは、素晴らしく柔軟なロギング ライブラリです。

ファイル名 (またはより良いロガー) を柔軟に保つと、重要なファイルの上書きを心配することなく、クラスの単体テストを作成できます。メモリ/ダミー ロガー クラスを使用する場合、ファイル システムも必要ありません。

ただし、テストされない小さな 1 回限りのスクリプトを作成するだけの場合は、IHMO の構成に定数を使用することをお勧めします。

于 2013-08-29T12:47:33.663 に答える
0

これは簡単です。2 番目のアプローチは、より柔軟で明確です。また、ログ ファイル名は、円周率や赤道の長さなどの意味で「実際の」定数ではありません。定数として定義されている場合、遅かれ早かれその存在を忘れてしまう「魔法の値」にすぎません。

ただし、セッターメソッドを取り除き、コンストラクターでの値の設定のみを許可します。

于 2013-08-29T12:47:33.913 に答える