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