2017-09-13 2 views
1

나는 php 앱을 가지고 있습니다. 솔리드 원칙을 준수하지는 않지만 전체 팀은 변경 사항에 대해 리펙토 코드를 시도합니다. 모델의 업데이트에 생성 된 전역 로그 (데이터베이스 중 하나에 저장 됨)를 추가해야합니다. 그 모델은 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()); 
} 

... 맞습니까? 나는 또한 고체와 compilant 아니 생각하고 현재의 새로운 혼란을 만들고 싶지 않아요. 어디에서 이런 식으로 뭔가를 추가해야합니다 - 모델 절약 호출 한 후 모델, 아니면 컨트롤러 :

public function saveAction() 
{ 
    // Controller code here 

    $model->save($objectEntity); 
    Logger::save(new LogObjectEntitySave()); 
} 

을하지만 질문이 : 하나 개의 동작에 대해 저장하고 또한 모델에서 데이터를 업데이트 할 것을 (나는 새로운 요소 경우 추가 나는 기존 ID가 없다)?/else와 두 개의 로그 클래스가 여전히 나 빠진다. 어떻게 그것이 옳을 지 모른다.

답변

1

1) 컨트롤러에없는 save() 모델의 로깅 동작을 saveAction에서 수행하십시오. 다른 당신은 모든 $model->save($objectEntity) 조각을 찾아 로깅을 추가해야 할 것입니다. 그 중 하나를 잊어 버리면 로깅 기능이 안정적이지 않고 로그가 거짓말을하고 신뢰할 수 없으면 쓸모 없게됩니다.

2) 모델 save() 작업이 2 개의 작업 (insert() 및 saveLog)을 수행하기 때문에 SOLID의 S를 위반했다고 생각하면 그렇지 않습니다. 로깅 동작을 수행하는 책임을 saveLog()에 위임하기 때문입니다. saveLog()를 호출하면 문제가 없으며 SOLID를 위반하지 않습니다.

3) 정적 로거 클래스가 실제로 최선의 선택이 아닙니다 (다른 구현으로 쉽게 대체 할 수 없으며, 어디에서나 하드 코딩 ...)하지만 응용 프로그램에 컨테이너와 같은 종속성 주입 기능이없는 경우 나쁜 선택 : 그것은 사용하기 쉽고, 통제하고 유지하기 쉽습니다. 개발자로서의 삶을 더 쉽게 만든다면 이미 좋은 발걸음입니다. :)

의존성 주입이 있다면 Symfony 프레임 워크처럼 Logger 서비스를 삽입하십시오.

4) 저장 및 업데이트시기에 대한 마지막 질문에 대해서는 if/else 로깅 사례가 필요하다고 생각합니다. 네, 이것은 복잡하게 만듭니다. 아마도 복잡성을 숨기기 위해 개인적인 기능으로 감싸는 것이 좋겠지 만 로그는 분명하고 정확할 것입니다. 그리고 이것은 중요합니다. 기록되는 내용이 복잡하기 때문에 로깅 동작이 복잡합니다. 그것에 대해 할 수있는 일이 없습니다.

희망이 도움이되었습니다.