2013-07-23 3 views
2

SRP 교장은 말한다 :외관 패턴이 SRP를 위반합니까?

클래스 또는 모듈, 내 서비스 계층 클래스와 같은 일부 Facade 클래스가

을 변경하는 이유를 하나, 단 하나 있어야합니다. 예컨대 SaleService, 그것은 몇 가지 방법을 제공하는 예컨대 SaveOrder(), CancelOrder(), CreateOrder(), GetAllOrders(), GetAllPlannedOrders() ...

나는 단지 그들의 개념 관계의 함께 넣어.
변경하는 이유가 여러 개있을 수있는이 메서드를 사용하는 클래스는 SRP를 위반합니까? 그렇다면이 문제를 어떻게 처리 할 수 ​​있습니까?

답변

7

외관 패턴은 SRP 그 자체에 위배되지 않습니다. 종종 파사드 패턴은 기본 객체간에 복잡한 상호 작용을 숨 깁니다. 이 경우 외관에 대한 '단일 책임'은 이러한 상호 작용을 관리하는 것입니다. 이러한 상호 작용이 변하지 않는 한, 외관 변경의 이유가 없어야합니다. 상호 작용이 실제로 복잡해지면 여러 오브젝트에서 Facade의 구현을 다시 분할하는 것이 좋습니다.

예를 보면 복잡한 것을 숨기려고한다는 인상을받지 못하기 때문에 여기에 외관 패턴의 사용을 재검토하는 것이 흥미로울 수 있습니다.

+0

감사합니다. "그래서 여기에 외관 패턴의 사용을 재검토하는 것이 재미 있을지 모릅니다." 너의 제안은 뭐니? – Masoud

+0

불행하게도 시스템에 대해 더 알지 못하면 말하기가 어렵습니다. 좋은 출발점은 왜 당신이 파사드 패턴을 필요로한다고 생각하는지 생각하는 것입니다. 하나를 사용해야하는 타당한 이유가 있습니다. 귀하의 이유가 그들 중 하나가 아니라면, 당신은 단지 시스템에 복잡성을 추가 할 수 있습니다. –

2

SRP의 목적은 클래스가 너무 많이 수행하는 경우를 식별하는 것이고 더 나은 디자인은 여러 클래스를 갖는 것입니다. 예를 들어, ReportProducer 클래스는 데이터를 어셈블하기 위해 일부 작업을 수행하고 출력 형식을 지정하기 위해 더 많은 작업을 수행합니다. 수집을위한 클래스와 서식 지정을위한 클래스 등 두 가지 클래스가 있어야합니다. 이러한 접근 방식의 이점은 유연성입니다. 단일 수집 클래스와 여러 가지 다양한 형식 클래스를 사용할 수 있습니다.

예제가 매우 합리적이며, 일관된 클래스가 있으며, 모든 메소드가 관련되어 있으므로 클래스 사용자는이 클래스가 Orders를위한 클래스라는 것을 알고 있습니다. 이것은 나에게 하나의 책임처럼 보입니다.

변경 이유는 무엇입니까? 보고서 예에서 완전히 다른 두 가지 종류의 변경 사항이 있습니다. 데이터가 변경된 부분이나 원하는 형식 변경 일 것입니다. 예를 들어, 여러 가지 가능한 이유가 있다고 주장 할 수도 있습니다. 즉, 주문의 "모양"이 바뀔 수 있고, 원하는 인터페이스가 변경 될 수 있습니다 (예 : queryCancelledOrders() 메소드 추가). 변경 될 수 있습니다. 그러나 나는 이것이 당신이 SRP를 위반한다는 징후라고 믿지 않습니다 : 그들은 모두 명령을 조작하기위한 인터페이스를 제시하는 것과 관련이 있습니다.

"변화를위한 단일 이유"를 완전히 그대로 사용한다면 우리는 어떤 수업을 쓸 수 있다고 생각하지 않습니다. 우리는 항상 인터페이스와 구현, 그리고 대개 일부 종속 클래스를 가지고 있습니다. 그 중 하나가 변경 될 수 있으므로 변경을위한 이유는 최소한 두 가지, 아마도 세 가지가있을 수 있습니다.

"이 수업의 책임은 무엇입니까?" "AND"와 같은 단어를 사용하지 않고 문장으로 표현할 수 있습니까? 불량 : 데이터 및 형식 보고서를 수집합니다.

+0

감사합니다. 그렇다면 SaleService 클래스에 대한 좋은 문장은 무엇입니까? – Masoud

1

SRP는 해당 책임이 클래스의 작은 부분 일지라도 클래스가 수정 될 수있는 한 가지 책임의 구현 세부 사항에 대한 변경 사항입니다.

Facade는 그 표면적 반사이므로 SRP를 위반할 수 없습니다. 이는 조작 중 하나의 내부가 변경 될 때마다 변경되지 않습니다. 어떤 작업 중 하나의 이름이 일 때 변경 될 수 있습니다. 이는 약간의 취성을 일으키지 만 끔찍한 것은 아니며, 또는 Facade를 통해 반영하고자하는 작업이 제거되거나 추가 될 때 변경 될 수 있습니다. 그러나 이것은 Facade 노출을 선택합니다. 실제로 입니다.

타사 구성 요소를 코드에서 단일 진입 점을 통해 사용하려는 경우 가장 자주 Facade를 사용합니다. 예를 들어 Anti-Corruption Layer 패턴입니다. 그러나 일반적으로 Facades를 내 코드에 두 번 생각해보십시오. 왜냐하면 여러분은 편리함으로 쉽게 얻을 수 있고 객체 간의 의존성에 대해 실제로 생각할 수 없기 때문입니다.

SaleService이 실제로 귀하의 예에서 Facade인지 여부는 확실하지 않습니다. 서비스는 종종 비즈니스 행동 (예 : 로깅, 인증, 트랜잭션 관리, 비즈니스 호출을 여러 번 조정할 수 있음) 등)