Komponentendiagramm

Inhalt

Ein Komponentendiagramm beginnt immer mit @start-cpd, gefolgt von einem Titel in Anführungszeichen. Ein Komponentendiagramm endet immer mit @end-cpd. Nach dem Start-Tag kann mit dem Schlüsselwort rootPackage das package daklariert werden. Ist der Name des default package RootElement, muss das package nicht explizit angegeben werden. The Grundtsruktur eines Komponentendiagrammes sieht also wie folgt aus:

@start-cpd  "My Title"

@end-cpd

Interface

Interfaces werden mit dem Schlüsselwort interface definiert (z.B. interface Auto). Lange Interface Namen werden in Anfürhrungszeichen geschrieben und als Alias über das Schlüsselwort as angegeben. Zum Beispiel:

interface Long as "Long Interface Name"

Interfaces können Attribute und Methoden haben. Die Syntax von Attributen und Methoden ist analog zu der von Klassendiagrammen.

Komponente

Eine Komponente wird mit dem Schlüsselwort component definiert und erfodert eine eindeutige id. Die id darf keine Leerzeichnen enthalten und soll der CamelCase Konvention folgen (z.B.: component MyComponent.

Lange Komponentennamen werden wieder in Anführungszeichen geschrieben und mit einem alias as angegeben. Zum Beispiel:

component Long as "LongComponentName"

Die Reihenfolge von Elementen innerhalb einer Komponenten-Definition ist vordefiniert und muss eingehalten werden. Zunächst werden Relationen von Interfaces (provided und required interfaces) definiert. Danach folgen ports, parts, connectors, und verschachtelte Elemente. Details zu diesen Elemente werden im Folgenden beschrieben.

Interface-Relationen

Komponenten und Klassen können Interface-Relationen haben. Das Bereitstellen eines Interfaces ist über das Schlüsselwort provide definiert, gefolgt vom Namen der Beziehung und den Namen des Interface, welches bereitgestellt wird:

class MyComponentPortType {
   provide payment IPayment
   }

Das Benötigen eines Interfaces wird mit dem Schlüsselwort require definiert, gefolgt vom Namen der Beziehung und dem Namen des Interfaces, welches benötigt wird:

class MyComponentPortType {
   require bankAccount IBankAccount
   }

Auch bei Interface-Relationen können Langnamen in Anführungszeichen und mit dem Schlüsselwort as angegeben werden:

class MyComponentPortType {
   provide payment as "Payment Provider" IPayment
   }

Ports

Ports werden mit dem Schlüsselwort port innerhalb einer Komponente definiert. Nach dem Schlüsselwort folgt der Name, das Schlüsselwort realizes und der Name der realisierten eigenschaft. Interfaces, Klassen und Komponenten können durch einen Port realisiert werden.

Ports können Sichtbarkeiten haben. Diese werden analog zu der von Methoden angegeben. Um eine konjugierte Eigenschaft zu spezifizieren, wird das Schlüsselwort conjugated oder ~ vor den Namen gesetzt. Conjugated bedeutet, dass provides and requires für diesen Port vertauscht sind. Dieses Konzept wird benötigt, wenn zwei Komponenten über Ports verbunden werden sollen. Beispielsweise kann man einen Port definieren, der ein Interface in einer Komponente realisiert. Der selbe Port kann wiederum in einer anderen Komponente durch conjugated spezifiziert sein, was bedeutet, dass dieser Port nun erforderlich (required) ist.

Parts

Parts werden verwendet um Instanzen von Komponenten innerhalb einer Komponente zu definieren. Sie werden innerhalb von Konnektoren zwischen between Ports verschiedener Komponenten angewendet. Zunächst wird der Name angegeben. Danach folgt eine Simikolon und danach der Type der Komponente (z.B.: partName:componentType):

component Booking
component HotelManagement {
   bookingService : Booking
   }

Konnektoren

Konnektoren (connectors) werden über das Schlüsselwort con definiert, gefolgt vom Namen des Konnektors und den Konnektorenden in runden Klammern. Ein Konnektor-ende ist ein Port innerhalb der selben Komponente oder der Port eines Teils (part) innerhalb der Komponente:

interface IBookings
interface IRoomManagement

component Booking {
   port bookings realizes IBookings
   port roomManagement realizes ~ IRoomManagement
   }

component RoomManagement {
	port roomManagement realizes IRoomManagement
   }

component HotelManagement {
   port bookings realizes IBookings

   bookingService : Booking
   roomService : RoomManagement

   con bookingDelegation (bookings, bookingService.bookings)
   con bookingRoomAssembly (bookingService.roomManagement, roomService.roomManagement)
   }

Verschachtelte Elemente

Verschachtelte Elemente innerhalb einer Komponente konnen Interfaces, Klassen oder Komponenten darstellen.

Klassen

Eine Klasse kann ein spezieller Port in einem Komponentendiagramm sein. Das bedeutet, dass die provides und require Relationen einer Klasse die provides und requires Relationen eines Ports sind. Eine Klasse wird definiert mit dem Schlüsselwort class, gefolgt von einer eindeutigen id. lange Klassennamen werden in Anführungszeichnen geschrieben und mit dem Schlüsselwort as definiert (z.B. class Long as "LongClassName".). Eine Klasse kann Interface Relationen beinhalten, wie zum Beispiel:

interface IBookings
interface IRoomManagement
class BookingServicePortType {
   provide IBookings
   require IRoomManagement
   }
component Bookings {
   port bookingInterface : BookingServicePortType
   }

Kommentare

Kommentare (notes) können für Komponenten, Klassen, und Interfaces angegeben werden. Sie beginnen mit dem Schlüsselwort note, gefolgt vom Kommentar in Anführungszeichen:

component MyComponent {
   note "Some comment"
   component NestedComponent
   }
interface MyInterface note "Some other comment"

Example

@start-cpd "example"
 component CashDeskLine {
   note "models a cash desk line"
   require IBank2 BankOfTrust.Bank
   + port portCashDeskLine realizes CashDesk
   cashDeskInstance : CashDesk
   con connect (portCashDeskLine,cashDeskInstance.portCashDesk)
   component CashDesk {
      require IBank BankOfTrust.Bank
	  + port portCashDesk realizes BankOfTrust.Bank
	  }
   }

component BankOfTrust {
provide IBank Bank
port portBank realizes Bank
interface Bank {
   maxAmount : int
   + handleTransaction (amount : int) : boolean
   }
}
@end-cpd