Inhalt | Abbildung | Source | OO-Designkurs | |||
|< | < | > | >| | Generated by CoCoDiL |
Die Entscheidung welche Klassen in welche Pakete zusammengefasst werden ist nicht trivial. Im folgenden werden einige Aspekte bzw. Regeln zusammengefasst. Man wird allerdings nie alle Regeln gleichzeitig einhalten können.
Oft habe ich eine horizontale Paket Bildung gesehen. Die Persistenzschicht, die Klassen mit dem Business Objekten und die Präsentationsschicht sind in eigenen Paketen. Wenn man die verschiedenen Schichten auf verschiedenen Servern laufen lassen möchte, ist dies auch sinnvoll. Ich sehe den Nachteil dass man meisten auch bei kleinen Änderungen in allen Schichten eingreifen muss. Ist z.B: die Anforderung einer Person das Attribut E-Mail Adresse hinzuzufuegen, wird meistens das Domain Objekt Person geändert, auf der Datenbank in der Tabelle eine entsprechende Spalte eingefuegt, und die E-Mail Adresse an der Oberfläche angezeigt.
Eine vertikale Paket Bildung ordnet die Klassen die fachlich zusammengehören in ein Paket. So wären die Oberflächen Elemente einer Person, die Datenbank Mapping Klassen, und das Domain Objekt im selben Paket. Dies hat die Vorteil dass sich eine Änderung wahrscheinlich nur in einem Paket auswirkt. Der Nachteil ist das diese Paketbildung es erschwert die Oberfläche bzw. die Datenbank auf einem eigenen Server auszulagern; oder vielleicht die Oberfläche bzw. Datenbank auszutauschen.
Eine Kombination von vertikale und horizontale Paketbildung kann zu einer Vielzahl von Paketen führen.
Es gibt Metriken, die die Kohäsion und Kopplung messen, allerdings sind diese Berechnungen entweder kompliziert oder wenig brauchbar.
Schon etwas praktischer sind folgende Kriterien die eine Konstuktionseinheit (Paket) erfüllen soll, aus dem Objektorienterten Konstruktionshandbuch:
OO Konstruktionshandbuch Kapitel 2.1.9: Modularisierung |
Robert C. Martin hat folgende Package Design Regeln veröffentlicht. Man wird allerdings wohl nie alle Prinzipien leichzeitig benutzen können.
The Release Reuse Equivalency Principle (REP)
Füge Klassen die gemeinsam benutzt werden, bzw. gemeinsam freigegeben werden in ein Paket
The Common Closure Principle CCP
Füge Klassen die gemeinsam für eine Sache verantwortlich sind in ein Paket
The Common Reuse Principle CRP
Trenne Klassen die von verschiedenen Klienten benutzt werden, in verschiedene Pakete.
The Acyclic Dependencies Principle ADP
Vermeide unbedingt Zyklen zwischen den Abhängigkeiten von Paketen. Für Java Programmierer hilft hier ein hervorragendes Open-Source Tool * JDepend dies zu vermeiden.
The Stable Dependencies Principle SDP
Wenn Paktet A von Paket B abhängig ist, dann sollte Paket B stabiler gegenüber Änderungen sein als Paket A. Das schon erwähnte Tool * JDepend benutzt Metriken um die Stabilität eines Pakets zu messen.
The Stable Abstractions Principle SAP
Ein Paket bei denen Änderungen aufwendig sind, sollte nicht von einem Paket abhängig sein, bei dem Änderungen sehr einfach möglich sind.
OO The Principles, Practices and Patterns of Agile Software Development |
Inhalt | Abbildung | Source | OO-Designkurs | |||
|< | < | > | >| | Generated by CoCoDiL |