이럴 - 관찰자 내가 그들이 생각하는 이유를 여러 가지 이유를 통해 갈 것이다
를 빨아. before_x 또는 after_x 메소드의 사용에도 일반적으로 적용됩니다. 일반적인 Observer의 더 작은 예입니다.
은 하드, 적절한 단위 테스트 일반적으로
를 작성하는 단위 테스트를 작성할 때, 당신은 기능의 특정 부분을 테스트 만듭니다. 그러나 관찰자를 테스트하려면 이벤트를 테스트하기 위해 이벤트를 트리거해야하며 때로는 매우 불편할 수도 있습니다.
예. 옵저버를 before_save에 연결 한 다음 코드를 트리거하려면 모델을 저장해야합니다. 이것은 당신이 끈기가 아닌 비즈니스 로직을 테스트 할 수 있기 때문에 테스트하기가 까다 롭습니다. 저장을 조롱하면 트리거가 작동하지 않을 수 있습니다. 그리고 당신이 그것을 구할 수 있다면, 당신의 시험은 느립니다.
상태
관찰자 테스트하기 어려운 경향이 있다는 사실에 이어이 필요, 관찰자는 많은 상태를 요구하는 경향이있다. 그 이유는 관찰자의 논리가 다양한 '비즈니스 이벤트'를 구별하려고하기 때문이며, 그렇게하는 유일한 방법은 객체의 상태를 보는 것입니다. 이를 위해서는 테스트에 많은 설정이 필요하므로 테스트가 어렵고 지루하고 문제가됩니다.
의도하지 않은 결과
의심의 여지가, 당신은 단지 여러 관찰를 연결 할 수 있기 때문에, 다양한 행동을 유발 할 수있는 것을 아무 생각이 없다는 것을 경험했다. 이로 인해 의도하지 않은 결과가 발생합니다. 통합/시스템 테스트 (느린 피드백)를 통해서만 선택할 수 있습니다. 당신의 관찰자를 추적하는 것도 많은 즐거움이 아닙니다.
주문 가정 문제
관찰자가. 당신은 단지 그것을 쫓겨 될 것이라고 보장 킥 수 있습니다 보장이 없습니다. 비즈니스 규칙의 일부로 암시 적 질서가있는 경우 옵저버가 잘못되었습니다.
가난한 설계로 연결 관찰자를 접선으로 가난한 디자인
일을 추가로 리드. 그것은 당신이 편리하고도 이해하기 어려운 이벤트를 저장, 삭제, 생성하기 위해 모든 것을 연결하도록 이끌어가는 경향이 있습니다. 예 : 사용자를 저장하면 사용자의 세부 정보를 업데이트 할 수도 있고 새 계정 이름을 추가 할 수도 있습니다.특정 대상에 대해 수행 할 수있는 작업을 파악하는 것이 방법과 의미있는 작업 기반 이름이있는 이유 중 일부입니다. 모든 것이 관찰자라면, 이것은 잃어 버리게되고 모든 것이 이벤트에 응답하고, 관찰 논리 내에서 어떤 비즈니스 이벤트에 속하는 이벤트를 구별하는 경향이 있습니다.
관찰자가 좋은 곳이 있지만 일반적으로 예외입니다. 콜백을 통해 로직을 암묵적으로 인코딩하는 것이 아니라 명시 적으로 수행 할 수있는 것을 이식하는 것이 훨씬 낫습니다.
Observers 대상의 경우에는 (비즈니스 논리) 단계 인 일련의 [비즈니스 사례] (http://webuild.envato.com/blog/a-case-for-use-cases/)를 사용하는 것이 좋습니다. 실행. 자신의 유스 케이스를 굴리기 란 어렵지 않지만 괜찮은 보석도 있습니다. [solid_use_case] (https://github.com/mindeavor/solid_use_case) 또는 [use_case] (https://github.com/cjohansen/use_case) – Dennis