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