가이드라인: 클래스 구현
조작을 구현하려면 다음을 수행하십시오.
- 알고리즘을 선택하십시오.
- 알고리즘에 적합한 데이터 구조를 선택하십시오.
- 필요에 따라 새 클래스 및 조작을 정의하십시오.
- 조작을 코딩하십시오.
알고리즘 선택
많은 조작이 조작 및 해당 스펙에서
바로 구현할 수 있을 정도로 간단합니다.
비단순 알고리즘은 주로 다음의 두 가지 경우에 필요합니다. 스펙이 제공된
복잡한 알고리즘을 구현하기 위해서 그리고 단순하지만 비능률적인 알고리즘이
정의 역할을 하는 조작을 최적화하기 위한 경우입니다.
알고리즘에 적합한 데이터 구조 선택
알고리즘 선택이 작업하는 데이터 구조 선택과 관련됩니다. 여러 구현
데이터 구조는 컨테이너 클래스(예: arrays, lists, queues, stacks, sets, bags 및
앞서 나열된 사항들의 변형)입니다. 대부분의 객체 지향 언어 및
프로그래밍 환경이 이러한 종류의 재사용 가능 컴포넌트가 있는 클래스 라이브러리를
제공합니다.
필요한 대로 새 클래스 및 조작 정의
예를 들어, 새 클래스에 중간 결과를 보유할 수도 있고 클래스에 새로운
하위 레벨 조작을 추가하여 복잡한 조작을 분리할 수도 있습니다. 이러한 조작은 종종 클래스에 대해 private합니다. 즉, 클래스 자체 이외에는 가시적이지
않습니다.
조작 코드화
인터페이스 명령문으로 시작하는 조작의 코드를 작성하십시오. 적용 가능한
프로그래밍 가이드라인에 따르십시오.
객체의 상태는 특별한 표현 없이 해당 속성 값에
대한 참조로 구현될 수 있습니다. 이러한 객체의
상태 전이가 속성값 변경시 내재적이며 다양한 작동은 조건부 상태를 통해
프로그래밍됩니다. 이 솔루션은
일반적으로 더 많은 상태가 추가되거나 작동 변경으로 인해 변경하기가
어려운 복잡한 구조를 초래하므로 복잡한 작동에는 충분하지 않습니다.
설계 요소(또는 해당 구성물) 동작이 상태에 의존적인 경우,
일반적으로 설계 요소의 모델 요소 동작에 대해 설명하는 하나
이상의 상태 차트 다이어그램이 있습니다. 이러한 상태 차트
다이어그램이 구현 중 중요한 입력으로 사용됩니다.
상태 차트 다이어그램에 표시되는 상태 시스템은 객체 상태를
명확하게 하며 전이 및 필수 동작을 분명하게 묘사합니다. 상태
시스템은 다음과 같이 여러 방법으로 구현될 수도 있습니다.
- 단순 상태 시스템의 경우, 가능한 상태를 나열하는 속성을
정의하고 해당 속성을 사용하여 수신 메시지의 동작을
선택합니다(예: Java 또는 C++의 switch 명령문). 이 솔루션은
복잡한 상태 시스템에서 그다지 잘 기준화되지 않으며 형편없는 런타임
성능을 초래할 수 있습니다. 이 메소드의 예는 [DOUG98], 제 4 장,
4.4.3을 참조하십시오.
- 보다 복잡한 상태 시스템에 대해 상태 패턴이 사용될 수 있습니다. 상태 패턴의
설명은 [GAM94]를 참조하십시오. [DOUG98],
제 6 장, 6.2.3, 상태 패턴도 이 접근법에 대해 설명합니다.
- 테이블 주도 접근법이 변경 용이가 기준인 매우 복잡한 상태 시스템에 대해
제대로 작동합니다. 이 방법에서는 각 항목이 입력을 후속
상태 및 연관 전이 조치로 맵핑하는 테이블에 각 상태별
항목이 있습니다. 이 메소드의 예는 [DOUG98],
제 6 장, 6.2.3, 상태 테이블 패턴을 참조하십시오.
동시 부속상태가 있는 상태 시스템의 경우 상태 관리를 활성 객체에 위임하여(각 동시
부속상태에 하나씩) 구현될 수도 있습니다. 동시 부속상태가 독립 계산을 표시하면서도
상호 작용이 가능하기 때문입니다. 각 하위 상태는 아래 설명된 기술 중 하나를 사용하여 관리될 수도
있습니다.
기존 클래스를 재활용하여 클래스 또는 클래스 일부를
구현할 수 있는 경우, 상속 대신 위임을 사용하십시오.
위임은 클래스가 기타 클래스의 도움으로 구현됨을
의미합니다. 클래스가 변수를 사용하여 기타 클래스의 객체를 참조합니다. 조작이
호출되면 실제 실행에 대해 참조된 재활용 클래스의 객체에서 조작을
호출합니다. 따라서 기타
클래스로 책임을 위임합니다.
단방향 연관이 포인터, 객체 참조를 포함하는 속성으로서
구현됩니다. 다양성이 one이면
단순 포인터로서 구현됩니다. 다양성이 many라면
이는 포인터 세트입니다. many 종료를
주문하는 경우 세트 대신 목록을 사용할 수 있습니다.
양방향 연관은 단방향 연관의 기술을 사용하여 양방향의 속성으로
구현됩니다.
규정된 연관은 규정 객체의 찾아보기 테이블(예: Smalltalk Dictionary 클래스)로
구현됩니다. 찾아보기 테이블의 선택자 값이
규정자이며 대상 값은 기타 클래스의 객체입니다.
규정자 값이 순서대로 액세스되어야 하는 경우, 규정자는 정렬된 배열 또는 트리로
배열될 수 있습니다. 이 경우에 액세스 시간이 로그 N에 비례합니다.
여기서, N은 규정자 값의 수입니다.
규정자가 압축된 한정 세트에서 나온 경우, 규정자 값이
정수 범위에 맵핑될 수 있으며 연관은 배열로서 효율적으로 구현될 수
있습니다. 이 방법은 연관 구성이 느슨하지 않고 조밀한 경우
보다 효과적이므로 구성이 조밀한 한정 세트에 적합합니다.
대부분의 객체 지향 언어 및 프로그래밍 환경이 다른 종류의 연관을
구현하는 재사용 가능한 컴포넌트가 있는 클래스 라이브러리를 제공합니다.
다음 세 가지 방법 중 하나로 속성을 구현하십시오. 내장 원시 유형을 사용하거나 기존
클래스를 사용 또는 새 클래스를 정의하십시오. 새 클래스를 정의하는 것이 보다 탄력적이지만 불필요한 간접적 조치가 생깁니다. 예를 들어, 직원의
사회 보장 번호가 문자열 유형의 속성 또는 새 클래스로서 구현되어야
합니다.

속성의 대체적 구현.
다음 예가 표시하는 대로 속성 그룹이 새 클래스로 결합되는 경우일 수도
있습니다. 두 가지 구현 모두가 올바릅니다.

라인의 속성이 포인트 클래스의 연관으로 구현됩니다.
|