패턴은 최상의 솔루션을 만들거나 좋은 솔루션을 만드는 데 도움이 될 수있는 곳에서만 사용해야합니다 (동의합니까?).
디자인 패턴을 구현 세부 사항으로 엄격하게 본다. 공개 API 및 프로그램을 해당 문서에 문서화하면 일반적으로 디자인 패턴이있는 위치는 중요하지 않습니다. 즉, "여기에는 다리 패턴이 있으며 그 위에 방문자를 구현할 것입니다." 대신, "이 클래스는 다양한 운영 체제에서 다른 구현을 가지므로 브리지 패턴을 사용하여 구현됩니다". 그런 다음이를 사용할 때는 브리지 패턴이 아닌 공개 API를 보므로 브리지로 구현되는 데 무관심합니다.
느슨하게 결합 된 유연한 디자인을 만드는 데 실제로 얼마나 많은 노력을 기울여야합니까?
간단한 규칙 세트를 따르면 느슨한 결합을 달성 할 수 있습니다. 이것을 존중한다면, 코드를 작성할 때 코드가 느슨하게 결합 될 것입니다 (즉, 노력은 이미 개발 프로세스의 일부입니다).
규칙 중 (전체 목록이 아님) :
- 클래스가 수행 할 작업이 아닌 클라이언트 코드 (클래스 사용 방법)를 생각 (또는 작성)하여 인터페이스를 정의합니다 (예 : 구현이 아닌 인터페이스를 요구)
- "말하지 말아라"
- 이미 작성된 부품으로 객체 생성
- 사용할 실제 객체 (구성원에 대한 팩토리, 매개 변수의 팩토리에 대한 매개 변수 등)를 생성자에 전달하십시오.
- DRY (두 곳에서 같은 순서로 두 줄이 나타나는 경우 별도의 함수 등으로 추출)
- 객체 생성이 더 복잡한 작업 인 경우, 중간 파트 생성을 팩토리 메소드 / 클래스 (생성자 본문이 아닌)로 구현하십시오.
- YAGNI (이전이 아니라 필요에 따라 생성)
이러한 규칙은 언어, 개발 방법론, 팀 (예 : TDD), 시간 예산 제약 등에 따라 다르게 적용됩니다.
예를 들어, Java에서는 인터페이스를 정의 interface
하고 클라이언트 코드를 작성 하는 것이 좋습니다 (그런 다음 구현 클래스로 인터페이스를 인스턴스화하십시오).
반면 C ++에서는 인터페이스가 없으므로 인터페이스를 추상 기본 클래스로만 작성할 수 있습니다. C ++에서는 강력한 요구 사항이있을 때만 상속을 사용하므로 불필요한 가상 함수의 오버 헤드를 피할 수 있으므로 인터페이스를 별도로 정의하지 않고 클래스 헤더 만 정의하면됩니다.
디자인 패턴에 반대하는 사람들은 이러한 패턴을 사용하는 데 드는 비용이 종종 이점보다 중요하다고 말합니다.
나는 그들이 잘못하고 있다고 생각합니다. 느슨하게 결합 된 (및 DRY) 코드를 작성하는 경우 디자인 패턴을 코드에 통합하면 추가 노력이 최소화됩니다. 그렇지 않으면 디자인 패턴을 구현하기 위해 코드를 수정해야합니다.
디자인 패턴을 구현하기 위해 많은 변경을해야하는 경우 문제는 디자인 패턴 이 아니라 코드 기반이 모 놀리 식이며 밀접하게 결합 된 것입니다. 이것은 디자인 패턴 문제가 아니라 나쁜 / 최적의 디자인 문제입니다.
내가 알고 싶은 것은 추가 수준의 추상화와 디자인을 실제로 만드는 데 얼마나 많은 노력을 기울여야하는지, 내 응용 프로그램이 느슨한 커플 링, 인터페이스에 대한 프로그래밍과 같은 OO 원칙을 따를 수 있도록하는 것입니다. 그것? 이것에 얼마나 많은 노력을 기울여야합니까?
귀하의 질문은 느슨한 결합의 유일한 이점은 설계 패턴을 쉽게 구현할 수 있다는 것입니다. 그렇지 않습니다.
느슨한 커플 링의 장점은 다음과 같습니다.
- 리팩토링 및 재 설계 유연성
- 덜 낭비되는 노력
- 테스트 가능성
- 코드 재사용 가능성 증가
- 디자인 단순성
- 디버거에서 보낸 시간이 줄어 듭니다
... 지금 내 마음에 오지 않는 다른 몇 사람.