2017-09-13 5 views
1

私はphpアプリを持っていますが、SOLIDの原則には合致していませんが、チーム全体が変更についてリファクタリングを試みています。私はグローバルログ(データベースの1つに保存されている)を追加し、モデルの更新に関する作成に保存しなければなりません。そのモデルはORMを使用しません。最初の解決策:静的ロガーを作成し、モデル上の操作後に呼び出します。グローバルログをアプリに追加 - SOLIDについて

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()); 
} 

しかし、問題がある:1つのアクションについて、何が保存しても、モデル内のデータを更新するためには、(私は、ときに新しい要素を追加したモデルの節約を呼び出した後のモデルで、または多分コントローラ上の - 私はこのような何かをどこに追加する必要があります私は既存のIDを持っていない)?/elseと2つのログクラスがまだ悪く見えます。それがいかに正しいべきか考えていない。

答えて

1

1)saveActionのコントローラにないModel save()のロギングアクションを実行します。そうでなければ、毎秒$model->save($objectEntity)コードを見つけてロギングを追加する必要があります。そのうちの1つを忘れてしまった場合、ログ機能は信頼できず、ログはあなたに嘘をつきます。信頼できず、無駄になります。

2)あなたのモデルsave()アクションが2つのもの(insert()とsaveLog)を実行しているためにSOLIDのSに違反していると思われる場合、それはありません。これは、loggingアクションを実行する責任をsaveLog()に委任するためです。 saveLog()を呼び出しても問題ありません。また、SOLIDに違反しません。

3)静的なLoggerクラスは実際には最良の選択肢ではありません(他の実装では簡単には置き換えられず、どこにでもハードコードされています...)が、アプリケーションにコンテナなどのDependency Injection能力がない場合、悪い選択:それは使いやすく、制御し、維持するのは簡単です。それが開発者としてのあなたの人生を楽にしてくれるなら、それはすでに良い一歩です。

依存性注入がある場合は、たとえばSymfonyフレームワークと同じように、Loggerサービスを挿入します。

4)保存と更新の時期に関する最後の質問として、if/elseロギングが必要になると思います。はい、これは複雑になります(その複雑さを隠すためにプライベート関数でラップするのは良いでしょう)が、ログはクリアで正確です。そして、これは重要です。 ログに記録されているものが複雑なため、ログ処理が複雑になります。あなたはそれについて何もできません。

希望すると便利です。

関連する問題