2011-09-12 3 views
0

나는 작은 디자인 곤경에 처했습니다. 그것은 실제로 "문제"그 자체가 아니에요, 그것은 내가 깨끗한 해결책을 찾을 수 없다는 것을 저에게 귀찮게합니다 :) 그리고 여러분 중 일부는 좋은 아이디어 나 대안적인 해결책을 가지고 있기를 바랍니다.간단한 속성 시스템

통신 채널 (serial/IP, e.t.c)에 동기화되지 않고 언제든지 도착할 수있는 일부 데이터가 있습니다. 개별 데이터 조각은 작거나 int 또는 float입니다. 그것들은 데이터를 보내는 기계의 어떤 상태와 관련이 있습니다. 단일 데이터 항목이 수신 될 때 또는 다중 데이터 항목이 수신되었을 때 경고를받는 간단한 "속성"시스템을 설계하지 않아도됩니다. 예를 들어, 두 개의 int와 float을 성공적으로 수집 할 때 하나의 경고가 나에게 주어집니다. 제가하고 싶은 것은이 같은 (매크로를 사용 또는 무엇이든)

PROPERTY(DATA1) 
PROPERTY(DATA2, DATA3) 
PROPERTY(DATA4) 

이다, 의사 코드에 지금

DATA1 : float 
DATA2 : int 
DATA3 : int 
DATA4 : double 
DATA5 : short 

:

원격 시스템이 저에게이를 보낼 수 있습니다 말할 수 있습니다 즉, 각 속성은 다양한 양의 데이터 청크를 모니터링하고 모니터링되는 모든 조각이 변경되거나 채워지면 나에게 단일 경고를 보냅니다.

내가 지금 생각한 sigC++를 사용하고있는 것은 훌륭한 콜백 라이브러리입니다. C++은 가변 인수 목록을 실제로 지원하지 않기 때문에 원하는 방식으로 구현할 수 있습니다. 그래서 지금까지 한 것은 하나의 클래스 인 PROPERTY를 갖는 것입니다. PROPERTY는 숫자가 있습니다. 오버로드 된 생성자 중 하나에서 X 개까지의 인수를 지원합니다. 이는 실제로 "동적 인"것은 아닙니다. 더 많은 변수를 모니터링해야하는 경우 인수의 수를 처리 할 수있는 생성자가 있는지 확인해야합니다.

는 어쩌면 그것은 단지 나

답변

1

나는 데이터 청크의 컬렉션을 저장하는 Property 클래스를 써서 오버 디자인 :)하려고. 각 청크는 Boost.Variant 또는 일부 유형의 공용체이거나 데이터 청크 인터페이스를 구현하는 객체에 대한 포인터입니다.

클래스는

Property p; 
p.addInt(xI).addFloat(xF).addShort(xS); 

처럼 또는 등 IntVal 좀더 기본 데이터 변환 래퍼되는 C++ 0X 이니셜리스트가 이용 될 수 있는지

Property p = { IntVal(xI), FloatVal(xF), ShortVal(xS) }; 

같이 초기화 할 수

청크 유형을 Property 컬렉션에 사용 된 변형 유형으로 변경합니다.

+0

헬퍼 클래스를 정의하여 해당 생성 시간을 만들 수 있습니다.이 헬퍼 클래스는 인수를 수집하여 (일부 콜렉션으로)이를 속성으로 전달합니다. 'Property p (PropList(). addInt (xI) .addFloat (xF))'와 비슷합니다. (C++ 03에서는 C++ 11에서 이니셜 라이저 목록이 더 쉽다.) –

+0

니스,이 솔루션은 깨끗한 것 같습니다! 쉽게 작성하고 확장하기 쉽습니다. 감사! – Daniel

0

여기에는 일련의 직렬 통신에 대해 이야기하고 있으므로 직렬 회선의 데이터가 무엇인지 프로그램에 알려주는 메커니즘이 필요합니다. 그렇지 않으면 두 개의 32 비트 정수를 두 개의 문자 또는 8 개의 문자 배열로 구분할 수 있습니까?

이는 기본 메시지 유형에서 서브 클래 싱 된 각 메시지 유형에 대한 클래스를 제안합니다. 귀하의 메시지가 본질적으로 매우 단순하다면 (예 : 정수, 2 개의 정수, 2 중으로 구성) 유니온 또는 유사한 것으로부터 벗어날 수 있지만, 유니온의 어떤 요소를 나타내는지를 나타내는 키가 필요합니다 적용 가능합니다.

수신 메시지를 수집하는 처리기는 복잡하고 복잡한 짐승이 될 수 있습니다. 나는 500+의 순환 적 복잡성을 가진 일부 (나는 그런 짐승을 쓰지 않았다)를 보았다.

관련 문제