컴포지션간에 연관성이 복잡해지는 클래스 다이어그램을 간단히 작성하고 싶습니다.

다음과 같은 클래스 다이어그램을 작성하고 싶습니다.
  • 드론 시스템 하나는 리모컨과 드론을 여러 컴포지션으로 가지고 있습니다.
  • 리모컨과 무인 항공기는 일대일 관계에 있습니다

  • 1을 표현하기 위해 다음과 같이 클래스 다이어그램을 작성합니다.



    2를 표현하기 위해 다음과 같이 클래스 다이어그램을 작성합니다.



    이 두 가지를 맞추면 다음과 같은 클래스 다이어그램이 됩니다.



    그러나 이러한 글을 쓰면 리모컨이나 드론과 같은 부품의 종류가 늘어날 때 복잡하게 관련이 엉망이 됩니다. 어떻게 작성하면 간단해질까요?

    일반화와 OCL을 이용한 해법 예



    「일반화와 관련을 조합해 클래스도를 쓸 때, 서브 클래스의 인스턴스의 종류나 개수의 제약을 정의하고 싶다」 에서 소개한 것처럼, 일반화와 관련을 조합한 클래스도를 작성해, 거기에 OCL을 추가하는 것으로 해결해 보는 것을 생각합니다.

    우선 리모컨과 드론의 슈퍼 클래스를 생각합니다만, 예를 들면 「페어링 기기」라고도 명명해 봅시다.



    페어링 기기끼리가 1대 1의 자신에게의 관련을 가진다고 해서, 드론 시스템이 페어링 기기를 복수 가지는, 라고 하면 좋을 것 같습니다.



    이제 OCL을 정의해 보겠습니다.
    context ペアリング機器 inv:
      self.oclAsType(リモコン) implies self.ペアリング.oclAsType(ドローン)
      and self.oclAsType(ドローン) implies self.ペアリング.oclAsType(リモコン)
    

    이것이 의미하는 곳을 일본어로 쓰면 다음과 같습니다.
  • 다음 조건 중 어느 것도 성립한다.
  • 페어링 장비가 리모컨 클래스이면 페어링 장비의 페어링 대상 클래스는 무인 항공기입니다
  • 페어링 장비가 무인 항공기 클래스이면 페어링 장비의 페어링 대상 클래스는 리모컨입니다.


  • 즉, 페어링의 연관 중 하나가 리모컨이고 다른 하나가 드론임을 보장합니다.

    덧붙여 페어링 기기가 리모컨 클래스가 아니었을 경우, self.oclAsType(リモコン) 는 거짓이 되므로, self.oclAsType(リモコン) implies self.ペアリング.oclAsType(ドローン) 는 전제 조건을 만족하지 않고 참이 되는 것에 주의해 주세요. ("A라면 B"라는 명제가 있을 때, A가 거짓이었을 때에는 B가 참이든 거짓이라도 "A라면 B"는 참이 된다)

    좋은 웹페이지 즐겨찾기