빠른 개요
해결 방법 3 : "병렬 클래스 계층 구조"소프트웨어 디자인 패턴은 친구입니다.
긴 답변
당신의 디자인은 옳았습니다. 최적화, 일부 클래스 또는 멤버가 제거 될 수 있지만 문제점을 해결하기 위해 적용하는 "병렬 계층 구조"아이디어는 옳습니다.
일반적으로 제어 계층에서 동일한 개념을 여러 번 처리했습니다.
잠시 후, 나는 다른 개발자들과 같은 솔루션을 끝냈습니다. 때때로 "병렬 계층"디자인 패턴 또는 "이중 계층"디자인 패턴이라고도합니다.
(1) 단일 클래스를 단일 계층의 클래스로 분할 한 적이 있습니까?
(2) 단일 클래스를 계층 구조없이 여러 클래스로 분할 한 적이 있습니까?
이러한 이전 솔루션을 별도로 적용한 경우 일부 문제를 해결할 수 있습니다.
그러나이 두 가지 솔루션을 동시에 결합하면 어떨까요?
그것들을 결합하면이 "디자인 패턴"을 얻게됩니다.
이행
이제 "Parallel Class Hierarchy"소프트웨어 디자인 패턴을 사례에 적용 해 보겠습니다.
현재 2 개 이상의 독립적 인 계층 구조가 있으며, 매우 유사하고 유사한 연관성 또는 purpouse, 유사한 특성 또는 메소드를 갖습니다.
중복 된 코드 나 멤버 ( "일관성")를 피하고 싶지만이 클래스의 차이점으로 인해이 클래스를 하나의 클래스로 직접 병합 할 수는 없습니다.
따라서 계층 구조는이 수치와 매우 유사하지만 둘 이상이 있습니다.
................................................
...............+----------------+...............
...............| Common:: |...............
...............| Composite |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
...............+-------+--------+...............
...............| Common:: |...............
...............| Viewee |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Common:: |........| Common:: |..
..| Visual |........| Structural |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 1
아직 인증되지 않은 디자인 패턴, 여러 유사 계층 구조가 단일 계층 구조로 구성되며 각 공유 또는 공통 클래스는 서브 클래 싱으로 확장됩니다.
이미 여러 계층을 처리하고 있기 때문에이 솔루션은 복잡하므로 복잡한 시나리오입니다.
1 루트 클래스
각 계층에는 공유 "루트"클래스가 있습니다.
귀하의 경우 각 계층마다 유사한 속성 및 유사한 메서드를 가질 수있는 독립적 인 "Composite"클래스가 있습니다.
해당 멤버 중 일부는 병합 할 수 있고 일부 멤버는 병합 할 수 없습니다.
따라서 개발자가 할 수있는 일은 기본 루트 클래스를 만들고 각 계층에 대해 동등한 경우를 하위 클래스로 만드는 것입니다.
그림 2에서 각 클래스가 네임 스페이스를 유지하는이 클래스에 대한 다이어그램을 볼 수 있습니다.
지금까지 멤버는 생략되었습니다.
................................................
...............+-------+--------+...............
...............| Common:: |...............
...............| Composite |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Composite |........| Composite |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 2
아시다시피, 각 "복합"클래스는 더 이상 별도의 계층 구조가 아니라 단일 공유 또는 공통 계층 구조로 병합됩니다.
그런 다음 멤버, 같은 멤버를 슈퍼 클래스로, 다른 멤버를 각 기본 클래스로 추가 할 수 있습니다.
이미 알고 있듯이 "가상"또는 "오버로드"메소드는 기본 클래스에 정의되어 있지만 서브 클래스로 대체되었습니다. 그림 3처럼.
................................................
.............+--------------------+.............
.............| Common:: |.............
.............| Composite |.............
.............+--------------------+.............
.............| [+] void AddChild()|.............
.............+---------+----------+.............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Composite |........| Composite |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 3
멤버가없는 클래스가있을 수 있으며 DONT 클래스를 제거하려는 유혹이있을 수 있습니다. 그것들은 "중공 클래스", "연산 클래스"및 다른 이름으로 불립니다.
2 서브 클래스
첫 번째 다이어그램으로 돌아 갑시다. 각 "Composite"클래스에는 각 계층 구조에 "Viewee"하위 클래스가 있습니다.
이 과정은 각 수업마다 반복됩니다. 그림 4보다 "Common :: Viewee"클래스는 "Common :: Composite"에서 유래하지만, 간략화를 위해 다이어그램에서 "Common :: Composite"클래스는 생략되었습니다.
................................................
.............+--------------------+.............
.............| Common:: |.............
.............| Viewee |.............
.............+--------------------+.............
.............| ... |.............
.............+---------+----------+.............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Viewee |........| Viewee |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 4
"Canvas :: Viewee"및 "SVG :: Viewee"는 각각 "Composite"에서 내려 오는 것이 아니라 일반적인 "Common :: Viewee"에서 내려 오는 것입니다.
이제 회원을 추가 할 수 있습니다.
......................................................
.........+------------------------------+.............
.........| Common:: |.............
.........| Viewee |.............
.........+------------------------------+.............
.........| [+] bool Validate() |.............
.........| [+] Rect GetAbsoluteBounds() |.............
.........+-------------+----------------+.............
.......................|..............................
.......................^..............................
....................../.\.............................
.....................+-+-+............................
.......................|..............................
..........+------------+----------------+.............
..........|.............................|.............
..+-------+---------+........+----------+----------+..
..| Canvas:: |........| SVG:: |..
..| Viewee |........| Viewee |..
..+-----------------+........+---------------------+..
..| |........| [+] Viewee Element |..
..+-----------------+........+---------------------+..
..| [+] void Paint()|........| [+] void addChild() |..
..+-----------------+........+---------------------+..
......................................................
Figure 5
3 프로세스 반복
프로세스는 각 클래스에 대해 "Canvas :: Visual"은 "Canvas :: Viewee"에서 하강하지 않고 "Commons :: Visual"에서 buit, "Canvas :: Structural"은 "Canvas :: Viewee"에서 하강하지 않습니다. ", Commons :: Structural"등의 buit.
4 3D 계층 다이어그램
상단 레이어에는 "공통"계층 구조가 있고 하단 레이어에는 각 추가 계층 구조가있는 여러 레이어가 포함 된 3D 다이어그램이 완성됩니다.
이것과 비슷한 원래 독립 클래스 계층 (그림 6) :
.................................................
..+-----------------+.......+-----------------+..
..| Common:: |.......| SVG:: |..
..| Composite |.......| Composite |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Viewee |.......| Viewee |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Visual |.......| Visual |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Rect |.......| Rect |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+-----------------+.......+-----------------+..
.................................................
Figure 6
일부 클래스는 생략하고 전체 "Canvas"계층 구조는 간단하게 생략했습니다.
최종 통합 클래스 계층 구조는 다음과 유사 할 수 있습니다.
.................................................
..+-----------------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Composite |...\+..| Composite |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Viewee |...\+..| Viewee |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Visual |...\+..| Visual |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Rect |...\+..| Rect |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+-----------------+.......+-----------------+..
.................................................
Figure 7
일부 클래스는 생략하고 전체 "Canvas"클래스는 간략하게 생략하지만 "SVG"클래스와 유사합니다.
"공통"클래스는 3D 다이어그램의 단일 계층, 다른 계층의 "SVG"클래스 및 세 번째 계층의 "캔버스"클래스로 표현 될 수 있습니다.
각 계층이 첫 번째 계층과 관련되어 있는지 확인하십시오. 각 계층에는 "공통"계층 구조의 상위 클래스가 있습니다.
코드 구현은 프로그래밍 언어가 지원하는 것에 따라 인터페이스 상속, 클래스 상속 또는 "mixins"를 사용해야 할 수 있습니다.
요약
어떤 프로그래밍 솔루션이든 최적화를 서두르지 마십시오. 최적화는 매우 중요하지만 최적화가 잘못되면 원래 문제보다 더 큰 문제가 될 수 있습니다.
"솔루션 1"또는 "솔루션 2"를 적용하지 않는 것이 좋습니다.
"솔루션 1"에서는 상속이 각 경우에 필요하기 때문에 적용되지 않습니다.
"솔루션 2", "Mixins"가 적용될 수 있지만 클래스와 계층 구조를 디자인 한 후에 적용 할 수 있습니다.
믹스 인은 인터페이스 기반 상속 또는 클래스 기반 다중 상속의 대안입니다.
내가 제안한 솔루션 3은 때때로 "병렬 계층 구조"디자인 패턴 또는 "이중 계층 구조"디자인 패턴이라고합니다.
많은 개발자 / 디자이너는 이에 동의하지 않으며 존재하지 않아야한다고 생각합니다. 그러나 본인과 다른 개발자는 귀하의 질문 중 하나와 같은 문제에 대한 일반적인 솔루션으로 사용했습니다.
또 다른 누락 된 것. 이전 솔루션에서 주된 문제는 "mixins"또는 "interfaces"를 사용하는 것이 아니라 클래스 모델을 세분화하고 나중에 기존 프로그래밍 언어 기능을 사용하는 것이 었습니다.