그러나 draw () 메소드가 사용자 인터페이스가 무엇인지에 크게 의존하지 않습니까?
실용적인 관점에서 시스템의 일부 코드 Rectangle는 사용자 엔드 요구 사항 인 경우 와 같은 것을 그리는 방법을 알아야합니다 . 그리고 픽셀을 래스터 화하거나 콘솔에 무언가를 표시하는 것과 같은 저수준 작업을 수행하기 위해 어느 시점에서 정리 될 것입니다.
커플 링 관점에서 나에게 질문은 누가 / 무엇이 이런 유형의 정보에 의존해야하며, 어느 정도의 세부 사항 (예를 들어, 추상적인가)에 달려 있는가?
드로잉 / 렌더링 기능 추상화
더 높은 수준의 드로잉 코드가 매우 추상적 인 것에 의존한다면, 추상화는 대상으로 삼고 자하는 모든 플랫폼에서 (구체적인 구현의 대체를 통해) 작동 할 수 있습니다. 고안된 예로서, 매우 추상적 인 일부 IDrawer인터페이스는 플롯 모양과 같은 작업을 수행하기 위해 콘솔과 GUI API 모두에서 구현 될 수 있습니다 (콘솔 구현은 콘솔을 ASCII 아트의 80xN "이미지"처럼 처리 할 수 있습니다). 물론 그것은 당신이 원하는 것은 아니지만 이미지 / 프레임 버퍼처럼 콘솔 출력을 다루는 것이기 때문에 고안된 예입니다. 일반적으로 대부분의 사용자 엔드는 콘솔에서 더 많은 텍스트 기반 상호 작용을 요구합니다.
또 다른 고려 사항은 안정적인 추상화를 설계하는 것이 얼마나 쉬운가 입니다. 타겟팅하는 모든 것이 현대적인 GUI API라면 선, 사각형, 경로, 텍스트, 이런 종류의 것들을 그리는 것과 같은 기본 모양 그리기 기능을 추상화하는 것이 쉬울 수 있기 때문에 (제한된 프리미티브 세트의 간단한 2D 래스터 화) 적은 비용으로 다양한 하위 유형을 통해 쉽게 구현할 수있는 하나의 추상 인터페이스가 있습니다. 그러한 추상화를 효과적으로 설계하고 모든 대상 플랫폼에서 구현할 수 있다면, 모양이나 GUI 제어 또는 그러한 추출.
그러나 Playstation Portable, iPhone, XBox One 및 강력한 게임 PC 사이에서 다양하고 까다로운 세부 사항을 추상화하려고하지만 각 요구 사항에 대해 최첨단 실시간 3D 렌더링 / 음영 처리 기술을 사용해야합니다 . 이 경우 기본 하드웨어 기능과 API가 너무 다양 할 때 렌더링 세부 사항을 추상화하기 위해 하나의 추상 인터페이스를 만들려고 시도하면 엄청난 시간의 설계 및 재 설계가 발생할 것으로 예상됩니다. 디스커버리와 마찬가지로 기본 하드웨어의 전체 고유성과 성능을 활용하지 못하는 최저 공통 분모 솔루션입니다.
안정적인 "쉬운"디자인으로 종속성을 전달
내 분야에서 나는 마지막 시나리오에 있습니다. 우리는 근본적으로 다른 기본 기능과 API를 가진 많은 다른 하드웨어를 목표로 삼고, 하나의 렌더링 / 그리기 추상화를 시도하여 그것들을 모두 결정하는 것은 경계가없는 것입니다 (우리는 게임처럼 효과적으로하는 것이 세계적으로 유명해질 수 있습니다) 업계의 체인저). 그래서 필자의 경우 마지막으로 원하는 것은 유추와 Shape같 Model거나 Particle Emitter그 그림을 최고 수준의 가장 추상적 인 방법으로 표현하더라도 그 자체를 그리는 방법을 알고 있습니다 ...
... 추상화는 제대로 설계하기가 너무 어렵고 설계가 정확하지 않고 모든 것이 그에 의존하기 때문에 가장 비용이 많이 드는 중앙 설계 변경에 따라 모든 것이 파열되고 끊어집니다. 따라서 마지막으로 원하는 것은 시스템의 종속성이 추상 디자인으로 흘러 들어가기에는 너무 어렵습니다.
어려움은 쉽지 않다, 쉽지 않다 쉽지 않다
따라서 우리가하는 일은 의존성이 디자인하기 쉬운 것들을 향해 흐르게하는 것입니다. 다각형 및 재질과 같은 것을 저장하는 데 중점을두고 추상적 인 "모델"을 설계하는 것이 훨씬 쉬우 며 서비스 도면에 효과적으로 대체 할 수있는 추상 "렌더러"를 설계하는 것보다 정확한 설계를 얻는 것 PC에서 PSP와 다른 하드웨어에 대해 균일하게 요청합니다.

따라서 우리는 의존성을 설계하기 어려운 것들과 반대 방향으로 뒤집습니다. 추상 모델이 모두 자신이 의존하는 추상 렌더러 디자인으로 자신을 그리는 방법을 알도록하는 대신 (디자인이 변경되면 구현이 중단되는 대신) 장면에서 모든 추상 객체를 그리는 방법을 알고있는 추상 렌더러가 있습니다 ( 모델, 파티클 이미 터 등), PC와 같은 PC RendererGl, PSP RendererPsp, 휴대 전화 등 의 OpenGL 렌더러 하위 유형을 구현할 수 있습니다 .이 경우 종속성은 안정적인 디자인으로 흘러 가기 쉬우 며, 렌더러에서 장면의 다양한 유형의 엔티티 (모델, 파티클, 텍스처 등)에 이르기까지, 다른 방식은 아닙니다.

- 나는 '안정성 / 불안정성'을 밥 아저씨의 구 심성 / 친 화성 결합 측정법과 약간 다른 의미로 사용하고 있는데, 이것은 내가 이해할 수있는 한 변화의 어려움을 더 측정하고 있습니다. 그의 안정성 지표는 유용하지만 "변화가 필요할 확률"에 대해 더 이야기하고 있습니다. "변경 가능성"이 "변경 용이성"에 비례 할 때 (예 : 변경이 필요할 가능성이 가장 높은 것이 불안정하고, Uncle Bob의 메트릭에서 구 심성있는 커플 링을 갖는 경우), 그러한 가능한 변경은 저렴하고 방해가되지 않습니다. 중앙 디자인을 건드리지 않고 구현 만 교체하면됩니다.
코드베이스의 중앙 레벨에서 무언가를 추상화하려고 시도하고 디자인하기가 너무 어렵다면, 벽에 고집스럽게 머리를 두드리고 매월 / 년마다 지속적으로 변경하여 8,000 개의 소스 파일을 업데이트해야하므로 소스 파일을 업데이트해야합니다. 그것에 의존하는 모든 것을 깨뜨리는 나의 가장 큰 제안은 의존성을 뒤집는 것을 고려하는 것입니다. 디자인하기 어려운 것이 디자인하기 쉬운 것에 의존하지 않고 디자인하기 어려운 것에 의존하지 않고 디자인하기 쉬운 모든 것에 의존하는 방식으로 코드를 작성할 수 있는지 확인하십시오. 구현에 대한 것이 아니라 디자인 (특히 인터페이스 디자인)에 대해 이야기하고 있습니다. 때로는 디자인하기 쉽고 구현하기가 어렵습니다. 때로는 디자인하기가 어렵지만 구현하기도 쉽습니다. 의존성은 디자인을 향하여 흐르므로 의존성이 흐르는 방향을 결정하기 위해 무언가를 디자인하는 것이 얼마나 어려운지에만 초점을 두어야합니다.
단일 책임 원칙
나에게 SRP는 일반적으로 (컨텍스트에 따라 다르지만) 그렇게 흥미롭지 않습니다. 의도적으로 명확하고 유지 관리가 가능한 것을 디자인하는 줄타기 균형 조정법이 있지만 Shape객체가 예를 들어 자신을 그리는 방법을 모르면 더 자세한 정보를 노출해야 할 수도 있습니다. 특정 사용 컨텍스트에서 구성하고 구성하는 것보다 모양을 사용하십시오. 거의 모든 것과의 상충 관계가 있으며 특정 상황에서 내 경험에서 그러한 유지 보수의 악몽이 될 수있는 방법을 알 수있는 SRP와 관련이 없습니다.
커플 링 및 시스템에서 종속성이 흐르는 방향과 더 관련이 있습니다. 모든 것이 의존하는 추상 렌더링 인터페이스를 새로운 타겟 API / 하드웨어에 이식하려고 시도하고 효과적으로 작동하도록 디자인을 변경해야한다는 것을 알고 있다면 그것은 시스템을 만드는 방법을 알고있는 시스템의 모든 구현을 교체해야하는 비용이 많이 드는 변경입니다. 그리고 그것은 내가 올바르게 설계하기가 너무 어려운 추상화로 흘러가는 의존성의 보트로드로 변환된다면 스스로를 그리는 방법을 알고있는 것들과 관련하여 가장 실질적인 유지 보수 문제입니다.
개발자 자부심
필자가 경험 한 바에 따르면, 이는 의존성 방향을 설계하기 쉬운 것들로 옮기는 데 가장 큰 장애물이되기 때문에 종종 언급한다. 개발자들이 여기에서 약간의 야심을 갖고 말하기를 매우 쉽습니다. "저는 플랫폼 간 렌더링 추상화를 설계하여 모든 것을 지배 할 것입니다. 다른 개발자들이 몇 달 동안 포팅에 소비 한 것을 해결할 것입니다. "우리가 지원하는 모든 단일 플랫폼에서 마술처럼 작동 할 것입니다. 모든 플랫폼에서 최첨단 렌더링 기술을 사용하고 있습니다. 이미 머리 속에 상상했습니다."어떤 경우에 그들은 그것을 피하고 의존성의 방향을 뒤집어 놓고 막대한 비용과 반복적 인 중앙 설계 변경을 구현에 대한 저렴하고 로컬 반복 변경으로 변환하는 실제 솔루션에 저항합니다. 개발자가 추상적 인 수준으로 디자인하기가 너무 어려울 때 포기하고 전체 전략을 재고해야 할 경우에는 일종의 "백기"본능이 있어야합니다. 그렇지 않으면 많은 슬픔과 고통에 빠지게됩니다. 이러한 야심과 투쟁을 세계를 정복하려는 야심을 인터페이스 디자인 수준으로 가져가는 것보다 설계하기 쉬운 최신 구현 방식으로 전환하는 것이 좋습니다.