TOP

Attachment-Pattern

Das Attachment-Pattern (Attachment-Entwurfsmuster) wurde von mir im Rahmen meiner Master-Thesis entwickelt und fand relativ viel Anklang bei anderen Entwicklern, daher stelle ich es heute der Allgemeinheit vor.

Das Attachment-Entwurfsmuster gehört zu den Strukturmustern und verwendet die Komposition um eine Basisklasse um Eigenschaften und Assoziationen zur Laufzeit zu erweitern. Die folgende Abbildung zeigt das Muster und wird nachfolgend erläutert.

Das Attachment-Pattern (Attachment Entwurfsmuster)

Das Attachment-Pattern (Attachment Entwurfsmuster)

Bestandteile
  • Das AttachableObject kann um Attachment-Objekte erweitert werden und kann selbst über ein ReferenceAttachment-Object referenziert werden.
  • Das Attachment ist abstrakt und muss mindestens ein Attribut beinhalten der die Art des Attachments identifiziert.
  • Das PropertyAttachment wird benutzt um ein AttachableObject um ein Attribut (Property) zu erweitern. Das Attribut value vom Typ T beinhaltet den Wert des Attributes
  • Das ReferenceAttachment wird benutzt um ein AttachableObject um eine Assoziation zu erweitern.
Vorteile
  • Dynamische Erweiterungen zur Laufzeit. Attribute und Assoziationen die zur Designzeit noch nicht bekannt waren, können nachträglich realisiert werden, ohne eine Änderung am Code vornehmen zu müssen.
Nachteile
  • Gefahr des Wildwuchses von Attachments. Dem kann entgegen gewirkt werden durch eine Komponente, welche die erlaubten Attachments verwaltet.
  • Nachträgliche Integration in das Domänenmodell. Attachments sollten spätestens bei einem Major-Release der Software aufgelöst werden und in das Domänenmodell integriert werden. Dies wirkt ebenfalls der Gefahr von Wildwuchs entgegen.
Read More
TOP

XML Schema Assertions

Heute habe ich ein wirklich cooles Feature von XML Schema 1.1 entdeckt von dem ich bisher noch nie was gehört oder gesehen hatte. Bei der Definition von XML-Schemas bin ich schon öfters an einen Punkt gestoßen, an dem man ein Constraint für einen komplexen Datentype gerne in einem Schema unterbringen möchte, XML Schema 1.0 jedoch nicht die sprachlichen Mittel bereitstellt. Ein Beispiel für ein solches Constraint wäre:
Attribut X muss den Wert "Foobar" einnehmen, wenn Attribut Y im Wertebereich >= 20 und <= 50 liegt.

Gelöst wird dies meist entweder in dem man das Constraint in ausführbaren Code gießt oder man zusätzlich mittels einem XSLT/XPath oder Schematron Dokument validiert. Dies hat jedoch den Nachteil, dass man ein zweites Dokument erstellen muss, dass dann auch immer synchron gehalten werden müssen.

Wie ich heute gelernt habe gibt es seit XML Schema 1.1. eine Lösung für dieses Problem, das assert-Tag. Man kann mittels diesem Tags ein Constraint direkt auf einem komplexen Datentyp definieren. Hierzu benutzt man das test-Attribut. Es beinhaltet einen nach Boolean evaluierenden XPath Ausdruck. Nur wenn sowohl das Schema valide ist als auch alle Constraints nach True evaluieren, ist das Dokument valide. Um möglichst nützliche Fehlermeldungen bei einem nach False evaluierten Constraint zu erzeugen kann man z. B. das assert-Tag um das message-Attribut aus dem Xerces-Namespace anreichern.

Folgendes ungetestete Beispiel zeigt ein Schema für oben genanntes Beispiel mit passender Fehlermeldung. Wie man am Beispiel sieht wird die Evaluierung auf Basis des Eltern-Elements realisiert.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:xerces="http://xerces.apache.org">
 <xs:element name="example">
  <xs:complexType>
   <xs:attribute name="X" type="xs:string" />
   <xs:attribute name="Y" type="xs:int" />
   <xs:assert test="@X eq 'Foobar' and @Y >= 20 and @Y <= 50"
     xerces:message="X muss den Wert 'Foobar' einnehmen, wenn ..." />
  </xs:complexType>
 </xs:element>
</xs:schema>
Links
Hinweis

Aktuell befindet sich die Spezifikation zu XML Schema 1.1 noch im Status „Last Call Working Draft“. Es ist also sehr wahrscheinlich, dass die Spezifikation ohne große nennenswerte Änderungen als Standard übernommen wird. Der aktuell Status kann man auf der W3 Seite erfahren.

Read More