Modularität und Liskovsches Prinzip in komplexen Systemen

Seite 2: Ein Beispiel

Inhaltsverzeichnis

Innerhalb eines modularen Systems muss die Möglichkeit bestehen, Module auszutauschen, die dieselbe Schnittstelle implementieren. Für die Funktion mag es notwendig sein, dass eine bestimmte Implementierung vorhanden ist, aber in Bezug auf die Technik verhalten sich alle Implementierungen gleich. Sie halten sich alle an denselben Vertrag.

Als Beispiel kann eine einfache Anwendung zur Datenanalyse dienen. Dafür stehen verschiedene Algorithmen zur Verfügung, und es bietet sich an, dass sie jeweils in einem eigenen Modul implementiert werden. Alle Datenanalysefunktionen implementieren das Interface IdataAggregator auf unterschiedliche Weise.

public interface IDataAggregator {
public List<IDataItem> get();
public void addDataSource(IDataSource inf);
public void addDataSource(List<IDataSource> infs);
public String getType();
}

Dieses Interface beschreibt die Schnittstelle des Moduls. Die konkreten Implementierungen beziehen sich jeweils auf unterschiedliche Algorithmen.

final public class IdentityDataAggregator implements IDataAggregator {
@Override

public List<IDataItem> get() {
List<IDataItem> itemList = new ArrayList<IDataItem>();

for ( int dataSourceIdx = 0;
dataSourceIdx < this.dataSources.size();
dataSourceIdx++) {
...
}
return itemList;
}
}

Für einen weiteren Algorithmus sind dieselben Methoden zu implementieren.

final public class MergeDataAggregator implements IDataAggregator {
@Override

public List<IDataItem> get() {
List<IDataItem> itemsList = new ArrayList<IDataItem>();

Map<String, Integer>companyRevenueMap =
new HashMap<String,Integer>();

consolidate(companyRevenueMap);
moveToItems(itemsList, companyRevenueMap);

return itemsList;
}
...
}

Jede der beiden Implementierungen lässt sich durch die andere ersetzen, da sie dasselbe InterfaceIDataAggregator implementieren. Im Sinne des Liskovschen Prinzips haben die Implementierungen dieselben Eigenschaften. Jetzt kann man zu Recht sagen, dass es sich hierbei um ganz normale objektorientierte Programmierung handelt.