세 가지 기본 단계를 포함하는 많은 코드를 작성합니다.
- 어딘가에서 데이터를 가져옵니다.
- 그 데이터를 변환하십시오.
- 그 데이터를 어딘가에 두십시오.
나는 일반적으로 각각의 디자인 패턴에서 영감을 얻은 세 가지 유형의 클래스를 사용합니다.
- 공장-일부 리소스에서 개체를 작성합니다.
- 중재자-공장을 사용하고 변형을 수행 한 다음 지휘관을 사용하십시오.
- 지휘관-그 데이터를 다른 곳에 두십시오.
제 수업은 매우 작은 경향이 있습니다. 종종 데이터를 가져오고, 데이터를 변환하고, 일하고, 데이터를 저장하는 등 단일 (공용) 방법이 있습니다. 이것은 클래스의 확산으로 이어지지 만 일반적으로 잘 작동합니다.
테스트를 할 때 어려움을 겪는 곳은 결국 밀접하게 결합 된 테스트입니다. 예를 들어;
- 공장-디스크에서 파일을 읽습니다.
- 사령관-파일을 디스크에 씁니다.
다른 하나 없이는 테스트 할 수 없습니다. 디스크 읽기 / 쓰기를 수행하기 위해 추가 '테스트'코드를 작성할 수는 있지만 반복하고 있습니다.
.Net을 살펴보면 File 클래스는 다른 접근 방식을 취하며 공장과 사령관의 책임을 결합합니다. 한 곳에서 Create, Delete, Exists 및 Read를위한 기능이 있습니다.
.Net의 예를 따르고 특히 외부 리소스를 다룰 때 클래스를 결합해야합니까? 여전히 결합 된 코드이지만 더 의도적입니다. 테스트가 아닌 원래 구현에서 발생합니다.
여기에서 단일 책임 원칙을 다소 과도하게 적용한 문제가 있습니까? 읽고 쓰는 별도의 클래스가 있습니다. 시스템 디스크와 같은 특정 리소스를 처리하는 결합 된 클래스를 가질 수있을 때.
Looking at .Net, the File class takes a different approach, it combines the responsibilities (of my) factory and commander together. It has functions for Create, Delete, Exists, and Read all in one place.
- "책임"을 "해야 할 일"과 혼동하고 있습니다. 책임은 "관심 영역"과 비슷합니다. File 클래스의 책임은 파일 작업을 수행하는 것입니다.
File
C #에서 라이브러리 의 중요한 점 은 File
클래스가 파사드 일 수 있다는 것입니다. 모든 파일 작업을 단일 위치-클래스에 넣지 만 내부에서 비슷한 읽기 / 쓰기 클래스를 사용할 수 있습니다. 실제로 파일 처리를위한 더 복잡한 논리가 포함되어 있습니다. 이러한 클래스 ( File
)는 실제로 SRP를 준수합니다. 실제로 파일 시스템을 사용하는 프로세스는 다른 계층 뒤에서 추상화 될 것입니다. 그렇지 않다고 말할 수 있습니다. :)