Rhapsody에서 같은 인터페이스(Provided)에 대한 서비스를 여러개의 클래스에서 제공하도록 설계를 했다고 생각해보자. 아래의 그림과 같은 상황을 가정해보자.
Producer는 ITestMsgHandler를 Required로 가지고 있으며, 해당 서비스를 제공(Provided)하는 세개의 객체와 연결이 되어 있다.
ITestMsgHandler의 인터페이스의 모습은 아래와 같다.
Producer에서 evNewMsg 이벤트를 발생시켰을때, 과연 어느 객체가 받아서 처리를 할 것인가?
객체 세개다 처리? 어떠한 처리도 안함?
정답은 Structure Diagram에서 가장 나중에 링크로 연결된 객체가 해당 객체를 수신하여 처리한다. :_)
Builder내부의 initRelations 코드를 보면 왜 이런 현상이 일어나는지 알수가 있다.
- void Builder::initRelations() {
{
itsProducer.get_port_0()->setItsITestMgsHandler(itsConsumer2.get_port_0()->getItsITestMgsHandler());
}
{
itsProducer.get_port_0()->setItsITestMgsHandler(itsConsumer1.get_port_0()->getItsITestMgsHandler());
}
{
itsProducer.get_port_0()->setItsITestMgsHandler(itsConsumer0.get_port_0()->getItsITestMgsHandler());
}
}
보다시피, 링크로 연결된 순서대로 setItsITestMsgHandler 함수를 호출하여 연결하고 있는 것을 볼수가 있다. 순차적으로 연결을 수행하니 가장 나중에 연결된 객체와 연결되는 것은 당연지사~!
위와 같은 상황에서 코드 제너레이션을 하면 Warning이 뜨는데 바로 이런것에 대한 경고를 사용자에게 알려주고 있다.
- Warning: Port connected to more than one end that provides the same interface.
in Package: Default
in Class: Builder
Object: itsProducer
Port: port_0
Checker Done
0 Error(s), 1 Warning(s)
이 글은 스프링노트에서 작성되었습니다.