본문 바로가기

Tools/IBM Rhapsody

(30)
Rhapsody :: Timer 이벤트 사용시 유의할 사항 클래스를 설계할 때, 1초 마다 doSomething() 을 호출하면서, 동시에 외부에서 들어오는 evExternalEvent를 처리하게 하도록 아래와 같이 State Chart Diagram을 설계했었다. 결과적으로는 잘못된 설계이다. evExternalEvent가 1초 보다 빠르게 들어온다면 위와 같은 상황에서는 절대 타이머 이벤트가 발생하지 않을 것이다. 이유는 생성된 코드를 보면 확인할 수 있다. doSomethingElse()가 호출됨과 동시에 타이머를 다시 세팅하고있다. IOxfReactive::TakeEventStatus SomeClass::rootState_processEvent() { IOxfReactive::TakeEventStatus res = eventNotConsumed; if(r..
Rhapsody :; Forward Declaration(전방선언) 방법 전방선언 방법은 해당 클래스 Properties에서 다음에 추가하면 된다. 소스에 추가할때 : CPP_CG >> Class >> ImplementationProlog 헤더에 추가할때 : CPP_CP >> Class >> SpecificationProlog 에 원하는 항목을 추가하면 된다. 참고글 : http://ppiazi.tistory.com/entry/Rhapsody-Wrapping-Code-with-ifdef-endif
Rhapsody :: Class Attribute들의 Accessor/Mutator를 inline 함수로 만들기 가끔 클래스 멤버들(attribute)에 대해 자동으로 생성되는 accessor/mutator들에 대해 inline 함수로 만들고 싶은 경우가 있다. 아래와 같이 설정을 바꿔 주면된다. 1. 해당 클래스를 열어 attributes 속성을 선택하여 Property 창을 연다. 2. Properties 탭을 선택하여 inline으로 검색한다. Attribute >> Inline을 in_header로 선택하고 Code Generation을 수행하면 된다.
Rhapsody :: Bit Field Rhapsody 클래스 에디터로 Bit Field를 표현하는 방법은 아직 없는것 같다.(7.5.1) 하지만 새로운 Type을 생성하여 직접 Bit Field 구조를 만들어 사용할 수가 있다. Type을 하나 만들고, Feature창에서 Declaration에서 Bit Field를 표현하면 된다. struct %s { unsigned int likes_ice_cream : 1; unsigned int plays_golf : 1; unsigned int watched_tv : 1; unsigned int reads_books : 1; }; 이 글은 스프링노트에서 작성되었습니다.
Rhapsody :: Wrapping Code with #ifdef - #endif 컴파일러 특성 또는 필요에 의해 Class, Attribute들을 #ifdef/#endif로 묶거나, #pragma와 같은 지시어로 묶으려면 아래의 Properties 항목을 이용한다. 예를 들어 _DEBUG가 선언되어 있을 경우에만 가용한 코드를 만들기 위해서는 아래와 같이 Properties를 설정한다. SpecificationProlog : #ifdef _DEBUG SpecificationEpilog : #endif ImplementationProlog : #ifdef _DEBUG ImplementationEpilog : #endif Specification은 헤더파일에 Implementation은 소스파일에 적용이 된다. 아래는 클래스 선언시 Byte Align을 1 byte로 하고자 할때 사용한..
Rhapsody :: Class의 Attribute들의 순서변경 Class의 Attribute들의 메모리 위치가 중요할 때가 있다. 이때는 Attribute들의 위치를 개발자가 원하는대로 바꿔야 한다. Rhapsody에서는 아래와 같이 해결한다. Attribute에 오른쪽 마우스 클릭으로 Edit Attributes Order 메뉴를 선택한다. Edit attributes declaration order 윈도우가 뜬다면 Use default order를 해제시키고 원하는 순서대로 정렬한다. 이 글은 스프링노트에서 작성되었습니다.
Rhapsody :: static 배열변수 초기화 Header File class A { protected: static unsigned short m_aCrc16Tab[]; }; Source File unsigned short A::m_aCrc16Tab[] = { 1, 2, 3, 4 }; 위와 같이 초기화를 하려면 Rhapsody에서 다음과 같이 Properties를 설정하면 된다. Filter로 InitializationStyle을 검색하여 ByAssignment로 변경한다. 해당되는 값들은 Initial Value에 넣으면 된다. 또한 기본적으로 Accessor나 Mutator를 생성안함으로 해야한다. 이 글은 스프링노트에서 작성되었습니다.
Rhapsody :: 하나 이상의 동일 인터페이스와 연결되었을 경우 Rhapsody에서 같은 인터페이스(Provided)에 대한 서비스를 여러개의 클래스에서 제공하도록 설계를 했다고 생각해보자. 아래의 그림과 같은 상황을 가정해보자. Producer는 ITestMsgHandler를 Required로 가지고 있으며, 해당 서비스를 제공(Provided)하는 세개의 객체와 연결이 되어 있다. ITestMsgHandler의 인터페이스의 모습은 아래와 같다. Producer에서 evNewMsg 이벤트를 발생시켰을때, 과연 어느 객체가 받아서 처리를 할 것인가? 객체 세개다 처리? 어떠한 처리도 안함? 정답은 Structure Diagram에서 가장 나중에 링크로 연결된 객체가 해당 객체를 수신하여 처리한다. :_) Builder내부의 initRelations 코드를 보면 왜 이..