문제를 해결하기위한 많은 유효한 접근 방법이 있습니다. Basile Starynkevitch는“제로 관료주의”접근법을 제안하여 간단한 인터페이스를 제공하고 적절한 인터페이스를 사용하여 프로그래머에게 의존합니다. 이 접근 방식이 마음에 들지만 좀 더 eineineering이 있지만 컴파일러가 오류를 잡을 수있는 또 다른 방법을 제시합니다.
장치가 같이에서 할 수있는 다양한 상태를 파악 Uninitialised
,
Started
, Configured
등등. 목록은 유한해야합니다 .¹
각 상태에 대해 struct
해당 상태와 관련된 필요한 추가 정보 (예 : DeviceUninitialised
등)
DeviceStarted
를 보유하십시오.
DeviceStrategy
메소드가 입력 및 출력으로 정의 된 구조를 사용하는 하나의 오브젝트에 모든 처리를 압축하십시오. 따라서 DeviceStarted DeviceStrategy::start (DeviceUninitalised dev)
방법 이있을 수 있습니다 (또는 프로젝트 규칙에 따라 동등한 방법이있을 수 있음).
이 접근법을 사용하면 유효한 프로그램은 메소드 프로토 타입에 의해 시행되는 순서로 일부 메소드를 호출해야합니다.
다양한 상태는 관련이없는 객체이며, 이는 대체 원칙 때문입니다. 이러한 구조가 공통 조상을 공유하도록하는 것이 유용한 경우 방문자 패턴을 사용하여 추상 클래스 인스턴스의 구체적인 유형을 복구 할 수 있습니다.
3. 고유 DeviceStrategy
클래스에 대해 설명했지만 제공하는 기능을 여러 클래스로 분할하려는 경우가 있습니다.
그것들을 요약하기 위해 내가 설명한 디자인의 핵심 사항은 다음과 같습니다.
대체 원칙으로 인해 장치 상태를 나타내는 객체는 고유해야하며 특별한 상속 관계가 없어야합니다.
장치 처리를 장치 자체를 나타내는 개체가 아닌 시작 개체로 묶어 각 장치 또는 장치 상태가 자신 만보고 전략이 모든 장치를보고 그들 사이의 가능한 전환을 표현하도록합니다.
텔넷 클라이언트 구현에 대한 설명을 한 번 보았지만 다시는 찾을 수 없다고 맹세합니다. 매우 유용한 참고 자료였습니다!
¹ :이를 위해 직관을 따르거나 "method₁ ~ method₂ iff"관계에 대한 실제 구현에서 메소드의 등가 클래스를 찾으십시오. 동일한 객체에 사용하는 것이 유효합니다.”— 기기의 모든 처리를 캡슐화하는 큰 객체가 있다고 가정합니다. 상태를 나열하는 두 가지 방법 모두 환상적인 결과를 제공합니다.
discovery
나handshake
?