SlideShare ist ein Scribd-Unternehmen logo
1 von 67
Downloaden Sie, um offline zu lesen
Modularisierung - was soll das?
http://christian.schlichtherle.de
Modularisierung - was soll das?
http://christian.schlichtherle.de
Motivation
Quellen / Literatur
Modularity Maturity Model
Strategien zur Modularisierung
Exkurs: SOLID Entwurfsprinzipien
Techniken zur Modularisierung
Das große Bild
Motivation
Trennung API und Implementierungen
Wiederverwendbarkeit von Komponenten
Vereinfachung der Konfiguration
Unterschiedliche Entwicklungszyklen von
Komponenten
Anpassung an verschiedene
Laufzeitumgebungen
Minimierung von Abhängigkeiten
Wiederverwendbarkeit von Komponenten
Idee
Ein Modul ist eine natürliche Einheit für
wiederverwendbare Softwarekomponenten
Module können von anderen Modulen
abhängig sein
Module bündeln Pakete mit Klassen zu
funktionalen Einheiten
Vorteile
Module haben einen größeren Betrachtungs-
gegenstand als Pakete oder gar Klassen
Höheres Abstraktionsniveau erreichbar
Leichtere Verteilung durch Bündelung in EAR/
JAR/WAR-Dateien
Unterschiedliche Entwicklungszyklen von
Komponenten
Idee
Zerlegung großer Anwendungen in
Komponenten mit unabhängigen
Entwicklungszyklen
Vorteile
Verkürzung von Entwicklungszyklen
Verteilung kleinerer Programmeinheiten
Beispiele
Unterschiedliche Entwicklungszyklen von
Komponenten
Idee
Vorteile
Beispiele Apache Maven maven-compiler-plugin 3.3
maven-resources-plugin 2.7
maven-jar-plugin 2.6
maven-surefire-plugin 2.18
maven-core 3.3.1
Trennung API und Implementierungen
Idee
Schnittstellen und Implementierungen werden
in getrennten Modulen untergebracht
Vorteile
Ein API, viele Implementierungen
Getrennte Entwicklungszyklen möglich
Beispiele
Trennung API und Implementierungen
Idee
Vorteile
Beispiele
TrueUpdate
API TrueUpate Installer Core
Implementierungen
TrueUpdate Installer JSR88
TrueUpdate Installer OpenEJB
TrueUpdate Installer Tomcat
TrueUpdate Installer Cargo
TrueCommons
Trennung API und Implementierungen
Idee
Vorteile
Beispiele
TrueUpdate
TrueCommons
API TrueCommons KeyManager Specification
Implementierungen
TrueCommons KeyManager Console
TrueCommons KeyManager Swing
TrueCommons KeyManager Mac OS X
Minimierung von Abhängigkeiten
Beispiele
Idee
Module sollten minimale Abhängigkeiten
haben
Vorteile
Vermeidung von Konflikten
Minimierung der Programmgröße
Minimierung von Abhängigkeiten
Beispiele TrueLicense
TrueLicense JSON
TrueLicense Core
Implementiert u.a. das V2/XML-
Lizenzschlüsselformat
Abhängigkeiten (keine bzw. nur JRE)
Idee
Vorteile
Minimierung von Abhängigkeiten
Beispiele TrueLicense
TrueLicense JSON
Abhängigkeiten
Jackson JSON Processor
TrueLicense Core
Implementiert das V2/JSON-
Lizenzschlüsselformat
TrueLicense Core
Idee
Vorteile
Vereinfachung der Konfiguration
Idee Jedes Modul implementiert genau ein Feature
Module werden als Plugins realisiert
Plugins können zur Laufzeit gefunden und
geladen werden
Features müssen eine definierte Schnittstelle
implementieren
Vorteile
Die Konfiguration des Klassenpfades definiert
die Menge an verfügbaren Features
Keine weitere Konfiguration notwendig
Beispiele
Vereinfachung der Konfiguration
Idee
Vorteile
Beispiele TrueVFS TrueVFS Driver TAR.GZIP
TrueVFS Driver ZIP
TrueVFS Driver FILE
Anpassung an verschiedene
Laufzeitumgebungen
Beispiele
Idee
Eine Komponente und ihre Integration in
verschiedene Laufzeitumgebungen sollten in
getrennten Modulen implementiert werden
Vorteile
Die Komponente ist nicht mehr von einer
konkreten Laufzeitumgebung abhängig
Pro Laufzeitumgebung ein separates Modul Minimierung von Abhängigkeiten
Anpassung an verschiedene
Laufzeitumgebungen
Beispiele TrueUpdate
Basisfunktionalität TrueUpdate Manager Core
Integrationsadapter
TrueUpdate Manager Servlet
TrueUpdate Manager EJB
Idee
Vorteile
Modularity Maturity Model
Module
Modularität
Loose Kopplung
Devolution
Dynamisierung
Zusammenfassung
Ad-Hoc
Ad-Hoc
Kennzeichen
Keine formale Beachtung von Modularität
Sammlung von Klassendateien ohne Struktur
Flacher Klassenpfad
Verwendung von Bibliotheken in JAR-Dateien
Monolithische Anwendung
Uber-JAR
Nutzen
Ad-Hoc
Kennzeichen
Nutzen Einfacher Anfang
Module
Kennzeichen
Formalisierung der Identität von Modulen Metadaten in Artefakten oder Katalogen
Module haben eine Versionsnummer
Modellierung von Abhängigkeiten basierend
auf diesen Identitäten
Bau
Entwicklung
Betrieb
Nutzen
Beispiele
Module
Kennzeichen
Nutzen
Entkoppelt Module von Artefakten EAR/JAR/WAR
Klarere Sicht auf den Modulzusammenbau
Schafft ein Bewusstsein für Versionen
Ermöglicht Modulkataloge
Beispiele
Module
Kennzeichen
Nutzen
Beispiele
RPM
OSGi
Apache Maven
<project>
	
  	
  	
  	
  <dependencies>
	
  	
  	
  	
  	
  	
  	
  	
  <dependency>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <groupId>net.java.trueupdate</groupId>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <artifactId>trueupdate-­‐installer-­‐core</artifactId>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <version>0.8.1-­‐SNAPSHOT</version>
	
  	
  	
  	
  	
  	
  	
  	
  </dependency>
	
  	
  	
  	
  	
  	
  	
  	
  <dependency>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.apache.openejb</groupId>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <artifactId>arquillian-­‐openejb-­‐embedded-­‐4</artifactId>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <version>4.7.1</version>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <scope>test</scope>
	
  	
  	
  	
  	
  	
  	
  	
  </dependency>
	
  	
  	
  	
  	
  	
  	
  	
  <dependency>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <groupId>org.apache.openejb</groupId>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <artifactId>openejb-­‐core</artifactId>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <version>4.7.1</version>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <scope>provided</scope>
	
  	
  	
  	
  	
  	
  	
  	
  </dependency>
	
  	
  	
  	
  </dependencies>
	
  	
  	
  	
  [...]
</project>
Apache Ivy
Module
Kennzeichen
Nutzen
Beispiele
RPM
OSGi
Apache Maven
Apache Ivy
<dependencies>
	
  	
  	
  	
  <dependency	
  org="net.java.trueupdate"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  name="trueupdate-­‐installer-­‐core"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  rev="0.8.1"/>
	
  	
  	
  	
  <dependency	
  org="org.apache.openejb"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  name="arquillian-­‐openejb-­‐embedded-­‐4"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  rev="4.7.1"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  conf="test"/>
	
  	
  	
  	
  <dependency	
  org="org.apache.openejb"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  name="openejb-­‐core"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  rev="4.7.1"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  conf="provided"/>
</dependencies>
Modularität
Kennzeichen
Deklarierung von Verträgen für Module
Fähigkeiten
Anforderungen
Implementierungsdetails sind privat
Zunächst Auflösung von Abhängigkeiten,
dann Modulidentität
Nutzen
Gegenbeispiele
Modularität
Kennzeichen
Nutzen
Feingranulares Erfassen der Auswirkungen
von
Fehlerkorrekturen
Kompatibilitätsbrüchen
auf
Implementierungen
Anwendungen
Bewusstsein für Systemstruktur
Kunden/Anbieter-Unabhängigkeit
Anforderungsbasierte Überprüfung von
Abhängigkeiten
Gegenbeispiele
Modularität
Kennzeichen
Nutzen
Gegenbeispiele
"Junkyard Module"
"Messy Module"
Loose Kopplung
Kennzeichen
Trennung der Schnittstellen von ihren
Implementierungen
indirekte Nutzung von Implementierungen
Keine Factories
Kein `new`
Servicebasierte Zusammenarbeit von
Modulen
Semantische Versionierung von
Abhängigkeiten
Nutzen
Loose Kopplung
Kennzeichen
Nutzen
Unabhängigkeit von Kunden und Anbietern
einer Implementierung
Devolution
Kennzeichen
Delegation des Eigentums von Artefakten an
Repositories mit Unterstützung für Modularität
Repositories können spezielle Unterstützung
anbieten
Zusammenarbeit
Kommentierung
Bewertungen
Foren
Aufsicht
Abnahmen
Lebenszyklen
Nutzen
Devolution
Kennzeichen
Nutzen
Größeres Bewusstsein für vorhandene Module
Geringere Duplikation von Code erhöht Qualität
Bessere Zusammenarbeit auf Basis von
Modulen
Qualitätskontrolle im laufenden Betrieb
Dynamisierung
Kennzeichen
Dynamischer Lebenszyklus von Modulen
Module sind sich des Lebenszyklus bewusst Z.B. gibt es keine globalen Variablen
Unterstützung von Moduloperationen zur
Laufzeit
Hinzufügen
Entfernen
Ersetzen
Nutzen
Dynamisierung
Kennzeichen
Nutzen
Dynamische Aktualisierung von laufenden
Systemen zur ...
Erweiterung von Fähigkeiten
Korrektur von Fehlern
Auflösung von Beschränkungen durch
Verwendung verschiedener Versionen
desselben Moduls
Zusammenfassung
Formale Identität, abgekoppelt von Artefakten
Keine Modularisierung
Formale Verträge für Module, entkoppelt von
deren Identität
Dienste mit semantischer Versionierung,
entkoppelt von ihrer Implementierung
Betrieb von Repositories mit Unterstützung
für Modularität, Zusammenarbeit und
Aufsicht, unabhängig vom Eigentum
Unterstützung von Lebenszyklen ohne
Beeinträchtigung des laufenden Betriebs
Strategien zur Modularisierung
Bis Level 5: Devolution
Bis Level 6: Dynamisierung
Grundsätzlich iterative Vorgehensweise Keinen Level ignorieren
Keinen Level überspringen
Stufenweise Erhöhung des Levels
Bis Level 5: Devolution
Arzneimittel
Apache Ant / Ivy
Gradle
SBT
Apache Maven
Anwendungsgebiete
Kleine Projekte
Große Unternehmensanwendungen
Statische Modularisierung
Gegenanzeigen IOC-Container
Servlet
EJB
Bis Level 6: Dynamisierung
Dynamische Modularisierung
Anwendungsgebiete
IOC-Container
Servlet
EJB
Große Unternehmensanwendungen
Arzneimittel
OSGi
Eclipse Equinox
Apache Felix
Gegenanzeigen Kleine Projekte
Techniken zur Modularisierung
Auflösung von Konflikten
Anwendung von Modularisierungsmustern
Erstellung eines Plugins
Erstellung eines Plugins Tools
TrueCommons Services Konzept
Erleichtert die Implementierung von Plugins
Beispiele
TrueCommons Annotations
Erleichtern den Umgang mit
java.util.ServiceLoader
Beispiele
Apache Maven
Das grundsätzliche Werkzeug für die
Modularisierung
TrueCommons Annotations
Erleichtern den Umgang mit
java.util.ServiceLoader
Generieren Resource-Dateien in META-INF/
services
Beispiele
Implementierung fremder Schnittstellen
Implementierung eigener Schnittstellen
TrueCommons Annotations
Erleichtern den Umgang mit
java.util.ServiceLoader
Beispiele
Implementierung fremder Schnittstellen
package	
  com.company.project;
import	
  java.nio.charset.spi.CharsetProvider;
import	
  net.java.truecommons.services.annotations.ServiceImplementation;
@ServiceImplementation(CharsetProvider.class)
public	
  class	
  Ibm437CharsetProvider	
  extends	
  CharsetProvider	
  {
	
  	
  	
  	
  ...
}
Implementierung eigener Schnittstellen package	
  com.company.project.impl;
import	
  com.company.project.spec.UltimateServiceSpecification;
import	
  net.java.truecommons.services.annotations.ServiceImplementation;
@ServiceImplementation
public	
  class	
  UltimateServiceImplementation
implements	
  UltimateServiceSpecification	
  {
	
  	
  	
  	
  ...
}
package	
  com.company.project.spec;
import	
  net.java.truecommons.services.annotations.ServiceSpecification;
@ServiceSpecification
public	
  interface	
  UltimateServiceSpecification	
  {
	
  	
  	
  	
  ...
}
TrueCommons Services Konzept
Erleichtert die Implementierung von Plugins
Beispiele
Beispiele
TrueVFS Kernel Specification
FsDriverMapFactory.java
FsDriverMapModifier.java
FsDriverMapLocator.java
TrueVFS Driver TAR.GZIP TarGZipDriverMapModifier.java
TrueVFS Driver ZIP ZipDriverMapModifier.java
Der wahlfreie Zugriff auf Archivdateien soll nur
durch Konfiguration des Klassenpfades
ermöglicht werden
Implementierung des Service-Locator-
Entwurfsmusters
TrueVFS Kernel Specification
FsDriverMapFactory.java
package	
  net.java.truevfs.kernel.spec.spi;
import	
  net.java.truecommons.annotations.ServiceImplementation;
import	
  net.java.truecommons.annotations.ServiceSpecification;
import	
  net.java.truecommons.services.LocatableFactory;
import	
  net.java.truevfs.kernel.spec.FsDriver;
import	
  net.java.truevfs.kernel.spec.FsScheme;
import	
  java.util.LinkedHashMap;
import	
  java.util.Map;
@ServiceSpecification
@ServiceImplementation
public	
  class	
  FsDriverMapFactory
extends	
  LocatableFactory<Map<FsScheme,	
  FsDriver>>	
  {
	
  	
  	
  	
  @Override
	
  	
  	
  	
  public	
  Map<FsScheme,	
  FsDriver>	
  get()	
  {	
  return	
  new	
  LinkedHashMap<>(32);	
  }
}
FsDriverMapModifier.java
FsDriverMapLocator.java
TrueVFS Kernel Specification
FsDriverMapFactory.java
FsDriverMapModifier.java
package	
  net.java.truevfs.kernel.spec.spi;
import	
  net.java.truecommons.annotations.ServiceSpecification;
import	
  net.java.truecommons.services.LocatableModifier;
import	
  net.java.truevfs.kernel.spec.FsDriver;
import	
  net.java.truevfs.kernel.spec.FsScheme;
import	
  java.util.Map;
@ServiceSpecification
public	
  abstract	
  class	
  FsDriverMapModifier
extends	
  LocatableModifier<Map<FsScheme,	
  FsDriver>>	
  {	
  }
FsDriverMapLocator.java
TrueVFS Kernel Specification
FsDriverMapFactory.java
FsDriverMapModifier.java
FsDriverMapLocator.java
package	
  net.java.truevfs.kernel.spec.sl;
import	
  net.java.truecommons.services.Container;
import	
  net.java.truecommons.services.ServiceLocator;
import	
  net.java.truevfs.kernel.spec.FsDriver;
import	
  net.java.truevfs.kernel.spec.FsScheme;
import	
  net.java.truevfs.kernel.spec.spi.FsDriverMapFactory;
import	
  net.java.truevfs.kernel.spec.spi.FsDriverMapModifier;
import	
  java.util.Collections;
import	
  java.util.Map;
public	
  final	
  class	
  FsDriverMapLocator
implements	
  Container<Map<FsScheme,	
  FsDriver>>	
  {
	
  	
  	
  	
  public	
  static	
  final	
  FsDriverMapLocator	
  SINGLETON	
  =	
  new	
  FsDriverMapLocator();
	
  	
  	
  	
  private	
  final	
  Map<FsScheme,	
  FsDriver>	
  drivers
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  =	
  Collections.unmodifiableMap(
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  new	
  ServiceLocator(FsDriverMapLocator.class)
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .factory(FsDriverMapFactory.class,	
  FsDriverMapModifier.class)
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .get());
	
  	
  	
  	
  private	
  FsDriverMapLocator()	
  {	
  }
	
  	
  	
  	
  @Override
	
  	
  	
  	
  public	
  Map<FsScheme,	
  FsDriver>	
  get()	
  {	
  return	
  drivers;	
  }
}
TrueVFS Driver TAR.GZIP TarGZipDriverMapModifier.java
package	
  net.java.truevfs.driver.tar.gzip;
import	
  net.java.truecommons.annotations.ServiceImplementation;
import	
  net.java.truecommons.shed.ExtensionSet;
import	
  net.java.truevfs.kernel.spec.FsDriver;
import	
  net.java.truevfs.kernel.spec.FsScheme;
import	
  net.java.truevfs.kernel.spec.spi.FsDriverMapModifier;
import	
  java.util.Map;
@ServiceImplementation
public	
  final	
  class	
  TarGZipDriverMapModifier	
  extends	
  FsDriverMapModifier	
  {
	
  	
  	
  	
  @Override
	
  	
  	
  	
  public	
  Map<FsScheme,	
  FsDriver>	
  apply(final	
  Map<FsScheme,	
  FsDriver>	
  map)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  final	
  FsDriver	
  driver	
  =	
  new	
  TarGZipDriver();
	
  	
  	
  	
  	
  	
  	
  	
  for	
  (final	
  String	
  extension	
  :	
  new	
  ExtensionSet("tar.gz|tar.gzip|tgz"))
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  map.put(FsScheme.create(extension),	
  driver);
	
  	
  	
  	
  	
  	
  	
  	
  return	
  map;
	
  	
  	
  	
  }
}
TrueVFS Driver ZIP ZipDriverMapModifier.java
package	
  net.java.truevfs.driver.zip;
import	
  net.java.truecommons.annotations.ServiceImplementation;
import	
  net.java.truevfs.comp.zipdriver.ZipDriver;
import	
  net.java.truevfs.kernel.spec.FsDriver;
import	
  net.java.truevfs.kernel.spec.FsScheme;
import	
  net.java.truevfs.kernel.spec.spi.FsDriverMapModifier;
import	
  java.util.Map;
@ServiceImplementation
public	
  final	
  class	
  ZipDriverMapModifier	
  extends	
  FsDriverMapModifier	
  {
	
  	
  	
  	
  @Override
	
  	
  	
  	
  public	
  Map<FsScheme,	
  FsDriver>	
  apply(final	
  Map<FsScheme,	
  FsDriver>	
  map)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  map.put(FsScheme.create("zip"),	
  new	
  ZipDriver());
	
  	
  	
  	
  	
  	
  	
  	
  return	
  map;
	
  	
  	
  	
  }
}
Anwendung von Modularisierungsmustern Abhängigkeitsmuster Azyklische Abhängigkeiten
Azyklische Abhängigkeiten
Analysetools
Module dürfen keine zyklischen
Abhängigkeiten haben
Das gleiche gilt eigentlich auch für Pakete
Ausgangssituation
Lösungsverfahren
Azyklische Abhängigkeiten
Analysetools
JDepend
JDepend Maven Plugin
Apache Maven
Beispiel
TrueLicense Maven Plugin
TrueLicense Maven Plugin
Module dürfen keine zyklischen
Abhängigkeiten haben
Ausgangssituation
Lösungsverfahren
Azyklische Abhängigkeiten
Analysetools
Module dürfen keine zyklischen
Abhängigkeiten haben
Ausgangssituation
Zyklische Abhängigkeit zwischen Klassen und Modulen (Quelle: [JAA])
Lösungsverfahren
Azyklische Abhängigkeiten
Analysetools
Module dürfen keine zyklischen
Abhängigkeiten haben
Ausgangssituation
Lösungsverfahren
Eskalation
Auflösung durch Eskalation (Quelle: [JAA])
De-Eskalation
Rückrufschnittstelle
Azyklische Abhängigkeiten
Analysetools
Module dürfen keine zyklischen
Abhängigkeiten haben
Ausgangssituation
Lösungsverfahren
Eskalation
De-Eskalation
Auflösung durch De-Eskalation (Quelle: [JAA])
Rückrufschnittstelle
Azyklische Abhängigkeiten
Analysetools
Module dürfen keine zyklischen
Abhängigkeiten haben
Ausgangssituation
Lösungsverfahren
Eskalation
De-Eskalation
Rückrufschnittstelle
Auflösung durch Rückrufschnittstelle (Quelle: [JAA])
Auflösung von Konflikten
Ausgangssituation
Ein Abhängigkeitsgraph kann
Versionskonflikte enthalten
Lösungsverfahren
Statische Modularisierung
Dynamische Modularisierung
Ausgangssituation
Ein Abhängigkeitsgraph kann
Versionskonflikte enthalten
Lösungsverfahren
Statische Modularisierung
<project>
	
  	
  	
  	
  <dependencyManagement>
	
  	
  	
  	
  	
  	
  	
  	
  <dependencies>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <dependency>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <groupId>commons-­‐collections</groupId>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <artifactId>commons-­‐collections</artifactId>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <version>3.2.1</version>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </dependency>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  […]
	
  	
  	
  	
  	
  	
  	
  	
  </dependencies>
	
  	
  	
  	
  </dependencyManagement>
	
  	
  	
  	
  […]
</project>
Dynamische Modularisierung
Lösungsverfahren
Statische Modularisierung
Dynamische Modularisierung
Das große Bild
Quelle: [JAA]
Exkurs: SOLID Entwurfsprinzipien
Single responsibility principle
Open/closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
Quellen / Literatur
[JAA]
[SMB]
[CC]
[LC]
/Modularisierung - was soll das.../Modularity Maturity Model
Vorgestellt von Graham Charters (IBM) auf dem OSGi Community Event 2011.
http://de.slideshare.net/mfrancis/ibm-sponsorship-keynote-towards-a-modularity-maturity-model-graham-
charters
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi...
Ausführlich erklärt in Anhang A von Kirk Knoernschilds Buch.
http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache
Maven
„Apache Maven is a software project management and comprehension tool.“
https://maven.apache.org
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache
Maven/maven-resources-plugin
https://maven.apache.org/plugins/maven-resources-plugin/
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache
Maven/maven-compiler-plugin
https://maven.apache.org/plugins/maven-compiler-plugin/
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache
Maven/maven-surefire-plugin
http://maven.apache.org/surefire/maven-surefire-plugin/
/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache
Maven/maven-jar-plugin
https://maven.apache.org/plugins/maven-jar-plugin/
/Modularisierung - was soll das.../Motivation/Trennung API und Implementieru.../Beispiele/
TrueUpdate
Ein Framework zur (halb-)automatischen Aktualisierung von installierten Enterprise-
Java-Anwendungen.
https://trueupdate.java.net
/Modularisierung - was soll das.../Motivation/Trennung API und Implementieru.../Beispiele/
TrueCommons
Eine Sammlung wiederverwendbarer Softwarekomponenten, analog zu den Apache
Commons.
https://truecommons.java.net
/Modularisierung - was soll das.../Motivation/Minimierung von Abhängigkeiten/Beispiele/
TrueLicense/TrueLicense JSON/Abhängigkeiten/Jackson JSON Processor
Benötigt ca. 1,5 MB Speicherplatz für die JAR-Dateien.
/Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS
TrueVFS ist ein virtuelles Dateisystem für Archivdateien (ZIP, TAR, etc).
https://truevfs.java.net
/Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS/
TrueVFS Driver FILE
Ermöglicht den wahlfreien Zugriff auf das Plattformdateisystem.
https://truevfs.java.net/truevfs-driver/truevfs-driver-file/index.html
/Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS/
TrueVFS Driver TAR.GZIP
Ermöglicht den wahlfreien Zugriff auf TAR.GZIP-Dateien.
https://truevfs.java.net/truevfs-driver/truevfs-driver-tar-gzip/index.html
/Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS/
TrueVFS Driver ZIP
Ermöglicht den wahlfreien Zugriff auf ZIP-Dateien.
https://truevfs.java.net/truevfs-driver/truevfs-driver-zip/index.html
/Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/
TrueUpdate
Ein Framework zur (halb-)automatischen Aktualisierung von installierten Enterprise-
Java-Anwendungen.
https://trueupdate.java.net
/Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/
TrueUpdate/Basisfunktionalität/TrueUpdate Manager Core
Kommuniziert mit einer Zielanwendung in demselben Container und einem
Repository auf einem separaten Server und führt ggf. Updates der Zielanwendung
durch.
/Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/
TrueUpdate/Integrationsadapter/TrueUpdate Manager EJB
Integriert den TrueUpdate Manager in einen EJB-Container.
/Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/
TrueUpdate/Integrationsadapter/TrueUpdate Manager Servlet
Integriert den TrueUpdate Manager in einen Servlet-Container.
/Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/Apache Maven
„Apache Maven is a software project management and comprehension tool.“
https://maven.apache.org
/Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/Apache Ivy
"Apache Ivy™ is a popular dependency manager focusing on flexibility and
simplicity.“
http://ant.apache.org/ivy/
/Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/RPM
"The RPM Package Manager (RPM) is a powerful command line driven package
management system capable of installing, uninstalling, verifying, querying, and
updating computer software packages."
http://www.rpm.org
/Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/OSGi
"OSGi™ - The Dynamic Module System for Java™."
http://www.osgi.org/Main/HomePage
/Modularisierung - was soll das.../Modularity Maturity Model/Modularität/Gegenbeispiele/"Junkyard
Module"
http://www.ruhrnachrichten.de/storage/pic/mdhl/artikelbilder/lokales/rn/bolo/bochum/3871428_1_0514bo-
Schrottplatz_dam5.jpg?version=1387194298
/Modularisierung - was soll das.../Modularity Maturity Model/Modularität/Gegenbeispiele/"Messy
Module"
http://de.wikipedia.org/wiki/Messie-Syndrom
/Modularisierung - was soll das.../Modularity Maturity Model/Loose Kopplung/Kennzeichen/
Semantische Versionierung von ...
http://semver.org
/Modularisierung - was soll das.../Modularity Maturity Model/Dynamisierung/Kennzeichen/
Dynamischer Lebenszyklus von M...
OSGi: BundleActivator-Schnittstelle: https://osgi.org/javadoc/r4v43/core/org/osgi/
framework/BundleActivator.html .
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Arzneimittel/Apache Maven
„Apache Maven is a software project management and comprehension tool.“
https://maven.apache.org
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Arzneimittel/Apache Ant / Ivy
"Apache Ivy™ is a popular dependency manager focusing on flexibility and
simplicity.“
http://ant.apache.org/ivy/
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Arzneimittel/Gradle
From command line to IDE to continuous integration, only one Enterprise build
automation system to rule them all.
https://gradle.org
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Arzneimittel/SBT
sbt is a build tool for Scala, Java, and more.
http://www.scala-sbt.org/index.html
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Anwendungsgebiete
Gemäß Arzneimittelgesetz Paragraph 11: Packungsbeilage.
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/
Gegenanzeigen
Gemäß Arzneimittelgesetz Paragraph 11: Packungsbeilage.
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/
Arzneimittel/OSGi
Open Services Gateway initiative
http://www.osgi.org/Main/HomePage
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/
Arzneimittel/OSGi/Eclipse Equinox
https://eclipse.org/equinox/
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/
Arzneimittel/OSGi/Apache Felix
http://felix.apache.org
/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/
Anwendungsgebiete
Gemäß Arzneimittelgesetz Paragraph 11: Packungsbeilage.
/Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/
Apache Maven
„Apache Maven is a software project management and comprehension tool.“
https://maven.apache.org
/Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/
TrueCommons Annotations
https://truecommons.java.net/apidocs/net/java/truecommons/annotations/package-summary.html
/Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/
TrueCommons Services
https://truecommons.java.net/apidocs/net/java/truecommons/services/package-summary.html
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von
Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/Apache Maven
„Apache Maven is a software project management and comprehension tool.“
https://maven.apache.org
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von
Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/JDepend
http://clarkware.com/software/JDepend.html
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von
Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/JDepend Maven
Plugin
http://mojo.codehaus.org/jdepend-maven-plugin/
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von
Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/Beispiel/
TrueLicense Maven Plugin
https://truelicense.java.net/truelicense-maven-plugin/dependencies.html
/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von
Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/Beispiel/
TrueLicense Maven Plugin
https://truelicense.java.net/truelicense-maven-plugin/jdepend-report.html
/Modularisierung - was soll das.../Das große Bild/Quelle: [JAA]
Quelle: [JAA]: Figure 6.4: Granularity and architecture all the way down
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Single responsibility principl...
http://en.wikipedia.org/wiki/Single_responsibility_principle
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Open/closed principle
http://en.wikipedia.org/wiki/Open/closed_principle
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Liskov substitution principle
http://en.wikipedia.org/wiki/Liskov_substitution_principle
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Interface segregation principl...
http://en.wikipedia.org/wiki/Interface_segregation_principle
/Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Dependency inversion
principle
http://en.wikipedia.org/wiki/Dependency_inversion_principle
/Modularisierung - was soll das.../Quellen / Literatur/[SMB]
Ulf Fildebrandt: Software modular bauen: Architektur von langlebigen
Softwaresystemen - Grundlagen und Anwendung mit OSGi und Java
(dpunkt.verlag)
http://www.amazon.de/Software-modular-bauen-Architektur-Softwaresystemen-ebook/dp/B00AIBE0YI
/Modularisierung - was soll das.../Quellen / Literatur/[JAA]
Kirk Knoernschild: Java Application Architecture: Modularity Patterns with
Examples Using OSGI (Prentice Hall)
http://www.amazon.de/Java-Application-Architecture-Modularity-Patterns-ebook/dp/B007KOGS5U
/Modularisierung - was soll das.../Quellen / Literatur/[LC]
http://www.amazon.de/Working-Effectively-Legacy-Robert-Martin-ebook/dp/B005OYHF0A
/Modularisierung - was soll das.../Quellen / Literatur/[CC]
Robert C. Martin: Clean Code: A Handbook of Agile Software Craftsmanship
(Prentice Hall)
http://ecx.images-amazon.com/images/I/51d1qVhmAmL.jpg

Weitere ähnliche Inhalte

Ähnlich wie Modularisierung - was soll das?

Apps for the Enterprise - Ein einheitliches Modulsystem für verteilte Unterne...
Apps for the Enterprise - Ein einheitliches Modulsystem für verteilte Unterne...Apps for the Enterprise - Ein einheitliches Modulsystem für verteilte Unterne...
Apps for the Enterprise - Ein einheitliches Modulsystem für verteilte Unterne...Andreas Weidinger
 
Automatischer Build mit Maven
Automatischer Build mit MavenAutomatischer Build mit Maven
Automatischer Build mit MavenStefan Scheidt
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtOPITZ CONSULTING Deutschland
 
Was ist eigentlich eine Unit?
Was ist eigentlich eine Unit?Was ist eigentlich eine Unit?
Was ist eigentlich eine Unit?Hendrik Lösch
 
Model Driven Development mit Eclipse
Model Driven Development mit EclipseModel Driven Development mit Eclipse
Model Driven Development mit EclipseAndreas Schreiber
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heutePhilipp Burgmer
 
Introduction to JEE
Introduction to JEEIntroduction to JEE
Introduction to JEEguestc44b7b
 
Morphia, Spring Data & Co
Morphia, Spring Data & CoMorphia, Spring Data & Co
Morphia, Spring Data & CoTobias Trelle
 
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungAndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungEduard Hildebrandt
 
Zend Framework 2 - Best Practices
Zend Framework 2 - Best PracticesZend Framework 2 - Best Practices
Zend Framework 2 - Best PracticesRalf Eggert
 
Software Architecture Design Patterns der COMLINE Cloud Service Platform - CSP
Software Architecture Design Patterns der COMLINE Cloud Service Platform - CSPSoftware Architecture Design Patterns der COMLINE Cloud Service Platform - CSP
Software Architecture Design Patterns der COMLINE Cloud Service Platform - CSPChristian Guenther
 
Leistungsvergleich Präsentationsoberflächen für digitale Sammlungen 2013
Leistungsvergleich Präsentationsoberflächen für digitale Sammlungen 2013Leistungsvergleich Präsentationsoberflächen für digitale Sammlungen 2013
Leistungsvergleich Präsentationsoberflächen für digitale Sammlungen 2013goobi_org
 
Refactoring Rails Applications
Refactoring Rails ApplicationsRefactoring Rails Applications
Refactoring Rails ApplicationsJonathan Weiss
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagHendrik Lösch
 
Metaprogrammierung und Reflection
Metaprogrammierung und ReflectionMetaprogrammierung und Reflection
Metaprogrammierung und ReflectionStefan Marr
 
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...Marc Müller
 

Ähnlich wie Modularisierung - was soll das? (20)

Apps for the Enterprise - Ein einheitliches Modulsystem für verteilte Unterne...
Apps for the Enterprise - Ein einheitliches Modulsystem für verteilte Unterne...Apps for the Enterprise - Ein einheitliches Modulsystem für verteilte Unterne...
Apps for the Enterprise - Ein einheitliches Modulsystem für verteilte Unterne...
 
CDI
CDICDI
CDI
 
Automatischer Build mit Maven
Automatischer Build mit MavenAutomatischer Build mit Maven
Automatischer Build mit Maven
 
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan ScheidtAutomatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
Automatischer Build mit Maven - OPITZ CONSULTING - Stefan Scheidt
 
Was ist eigentlich eine Unit?
Was ist eigentlich eine Unit?Was ist eigentlich eine Unit?
Was ist eigentlich eine Unit?
 
Model Driven Development mit Eclipse
Model Driven Development mit EclipseModel Driven Development mit Eclipse
Model Driven Development mit Eclipse
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heute
 
OSGi: Grundlagen und Konzepte
OSGi: Grundlagen und KonzepteOSGi: Grundlagen und Konzepte
OSGi: Grundlagen und Konzepte
 
Introduction to JEE
Introduction to JEEIntroduction to JEE
Introduction to JEE
 
Morphia, Spring Data & Co
Morphia, Spring Data & CoMorphia, Spring Data & Co
Morphia, Spring Data & Co
 
Schnelleinstieg in Angular
Schnelleinstieg in AngularSchnelleinstieg in Angular
Schnelleinstieg in Angular
 
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungAndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
 
MVVM mit WPF
MVVM mit WPFMVVM mit WPF
MVVM mit WPF
 
Zend Framework 2 - Best Practices
Zend Framework 2 - Best PracticesZend Framework 2 - Best Practices
Zend Framework 2 - Best Practices
 
Software Architecture Design Patterns der COMLINE Cloud Service Platform - CSP
Software Architecture Design Patterns der COMLINE Cloud Service Platform - CSPSoftware Architecture Design Patterns der COMLINE Cloud Service Platform - CSP
Software Architecture Design Patterns der COMLINE Cloud Service Platform - CSP
 
Leistungsvergleich Präsentationsoberflächen für digitale Sammlungen 2013
Leistungsvergleich Präsentationsoberflächen für digitale Sammlungen 2013Leistungsvergleich Präsentationsoberflächen für digitale Sammlungen 2013
Leistungsvergleich Präsentationsoberflächen für digitale Sammlungen 2013
 
Refactoring Rails Applications
Refactoring Rails ApplicationsRefactoring Rails Applications
Refactoring Rails Applications
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF Rundumschlag
 
Metaprogrammierung und Reflection
Metaprogrammierung und ReflectionMetaprogrammierung und Reflection
Metaprogrammierung und Reflection
 
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
 

Modularisierung - was soll das?

  • 1. Modularisierung - was soll das? http://christian.schlichtherle.de
  • 2. Modularisierung - was soll das? http://christian.schlichtherle.de Motivation Quellen / Literatur Modularity Maturity Model Strategien zur Modularisierung Exkurs: SOLID Entwurfsprinzipien Techniken zur Modularisierung Das große Bild
  • 3. Motivation Trennung API und Implementierungen Wiederverwendbarkeit von Komponenten Vereinfachung der Konfiguration Unterschiedliche Entwicklungszyklen von Komponenten Anpassung an verschiedene Laufzeitumgebungen Minimierung von Abhängigkeiten
  • 4. Wiederverwendbarkeit von Komponenten Idee Ein Modul ist eine natürliche Einheit für wiederverwendbare Softwarekomponenten Module können von anderen Modulen abhängig sein Module bündeln Pakete mit Klassen zu funktionalen Einheiten Vorteile Module haben einen größeren Betrachtungs- gegenstand als Pakete oder gar Klassen Höheres Abstraktionsniveau erreichbar Leichtere Verteilung durch Bündelung in EAR/ JAR/WAR-Dateien
  • 5. Unterschiedliche Entwicklungszyklen von Komponenten Idee Zerlegung großer Anwendungen in Komponenten mit unabhängigen Entwicklungszyklen Vorteile Verkürzung von Entwicklungszyklen Verteilung kleinerer Programmeinheiten Beispiele
  • 6. Unterschiedliche Entwicklungszyklen von Komponenten Idee Vorteile Beispiele Apache Maven maven-compiler-plugin 3.3 maven-resources-plugin 2.7 maven-jar-plugin 2.6 maven-surefire-plugin 2.18 maven-core 3.3.1
  • 7. Trennung API und Implementierungen Idee Schnittstellen und Implementierungen werden in getrennten Modulen untergebracht Vorteile Ein API, viele Implementierungen Getrennte Entwicklungszyklen möglich Beispiele
  • 8. Trennung API und Implementierungen Idee Vorteile Beispiele TrueUpdate API TrueUpate Installer Core Implementierungen TrueUpdate Installer JSR88 TrueUpdate Installer OpenEJB TrueUpdate Installer Tomcat TrueUpdate Installer Cargo TrueCommons
  • 9. Trennung API und Implementierungen Idee Vorteile Beispiele TrueUpdate TrueCommons API TrueCommons KeyManager Specification Implementierungen TrueCommons KeyManager Console TrueCommons KeyManager Swing TrueCommons KeyManager Mac OS X
  • 10. Minimierung von Abhängigkeiten Beispiele Idee Module sollten minimale Abhängigkeiten haben Vorteile Vermeidung von Konflikten Minimierung der Programmgröße
  • 11. Minimierung von Abhängigkeiten Beispiele TrueLicense TrueLicense JSON TrueLicense Core Implementiert u.a. das V2/XML- Lizenzschlüsselformat Abhängigkeiten (keine bzw. nur JRE) Idee Vorteile
  • 12. Minimierung von Abhängigkeiten Beispiele TrueLicense TrueLicense JSON Abhängigkeiten Jackson JSON Processor TrueLicense Core Implementiert das V2/JSON- Lizenzschlüsselformat TrueLicense Core Idee Vorteile
  • 13. Vereinfachung der Konfiguration Idee Jedes Modul implementiert genau ein Feature Module werden als Plugins realisiert Plugins können zur Laufzeit gefunden und geladen werden Features müssen eine definierte Schnittstelle implementieren Vorteile Die Konfiguration des Klassenpfades definiert die Menge an verfügbaren Features Keine weitere Konfiguration notwendig Beispiele
  • 14. Vereinfachung der Konfiguration Idee Vorteile Beispiele TrueVFS TrueVFS Driver TAR.GZIP TrueVFS Driver ZIP TrueVFS Driver FILE
  • 15. Anpassung an verschiedene Laufzeitumgebungen Beispiele Idee Eine Komponente und ihre Integration in verschiedene Laufzeitumgebungen sollten in getrennten Modulen implementiert werden Vorteile Die Komponente ist nicht mehr von einer konkreten Laufzeitumgebung abhängig Pro Laufzeitumgebung ein separates Modul Minimierung von Abhängigkeiten
  • 16. Anpassung an verschiedene Laufzeitumgebungen Beispiele TrueUpdate Basisfunktionalität TrueUpdate Manager Core Integrationsadapter TrueUpdate Manager Servlet TrueUpdate Manager EJB Idee Vorteile
  • 17. Modularity Maturity Model Module Modularität Loose Kopplung Devolution Dynamisierung Zusammenfassung Ad-Hoc
  • 18. Ad-Hoc Kennzeichen Keine formale Beachtung von Modularität Sammlung von Klassendateien ohne Struktur Flacher Klassenpfad Verwendung von Bibliotheken in JAR-Dateien Monolithische Anwendung Uber-JAR Nutzen
  • 20. Module Kennzeichen Formalisierung der Identität von Modulen Metadaten in Artefakten oder Katalogen Module haben eine Versionsnummer Modellierung von Abhängigkeiten basierend auf diesen Identitäten Bau Entwicklung Betrieb Nutzen Beispiele
  • 21. Module Kennzeichen Nutzen Entkoppelt Module von Artefakten EAR/JAR/WAR Klarere Sicht auf den Modulzusammenbau Schafft ein Bewusstsein für Versionen Ermöglicht Modulkataloge Beispiele
  • 22. Module Kennzeichen Nutzen Beispiele RPM OSGi Apache Maven <project>        <dependencies>                <dependency>                        <groupId>net.java.trueupdate</groupId>                        <artifactId>trueupdate-­‐installer-­‐core</artifactId>                        <version>0.8.1-­‐SNAPSHOT</version>                </dependency>                <dependency>                        <groupId>org.apache.openejb</groupId>                        <artifactId>arquillian-­‐openejb-­‐embedded-­‐4</artifactId>                        <version>4.7.1</version>                        <scope>test</scope>                </dependency>                <dependency>                        <groupId>org.apache.openejb</groupId>                        <artifactId>openejb-­‐core</artifactId>                        <version>4.7.1</version>                        <scope>provided</scope>                </dependency>        </dependencies>        [...] </project> Apache Ivy
  • 23. Module Kennzeichen Nutzen Beispiele RPM OSGi Apache Maven Apache Ivy <dependencies>        <dependency  org="net.java.trueupdate"                                name="trueupdate-­‐installer-­‐core"                                rev="0.8.1"/>        <dependency  org="org.apache.openejb"                                  name="arquillian-­‐openejb-­‐embedded-­‐4"                                rev="4.7.1"                                conf="test"/>        <dependency  org="org.apache.openejb"                                name="openejb-­‐core"                                rev="4.7.1"                                conf="provided"/> </dependencies>
  • 24. Modularität Kennzeichen Deklarierung von Verträgen für Module Fähigkeiten Anforderungen Implementierungsdetails sind privat Zunächst Auflösung von Abhängigkeiten, dann Modulidentität Nutzen Gegenbeispiele
  • 25. Modularität Kennzeichen Nutzen Feingranulares Erfassen der Auswirkungen von Fehlerkorrekturen Kompatibilitätsbrüchen auf Implementierungen Anwendungen Bewusstsein für Systemstruktur Kunden/Anbieter-Unabhängigkeit Anforderungsbasierte Überprüfung von Abhängigkeiten Gegenbeispiele
  • 27. Loose Kopplung Kennzeichen Trennung der Schnittstellen von ihren Implementierungen indirekte Nutzung von Implementierungen Keine Factories Kein `new` Servicebasierte Zusammenarbeit von Modulen Semantische Versionierung von Abhängigkeiten Nutzen
  • 28. Loose Kopplung Kennzeichen Nutzen Unabhängigkeit von Kunden und Anbietern einer Implementierung
  • 29. Devolution Kennzeichen Delegation des Eigentums von Artefakten an Repositories mit Unterstützung für Modularität Repositories können spezielle Unterstützung anbieten Zusammenarbeit Kommentierung Bewertungen Foren Aufsicht Abnahmen Lebenszyklen Nutzen
  • 30. Devolution Kennzeichen Nutzen Größeres Bewusstsein für vorhandene Module Geringere Duplikation von Code erhöht Qualität Bessere Zusammenarbeit auf Basis von Modulen Qualitätskontrolle im laufenden Betrieb
  • 31. Dynamisierung Kennzeichen Dynamischer Lebenszyklus von Modulen Module sind sich des Lebenszyklus bewusst Z.B. gibt es keine globalen Variablen Unterstützung von Moduloperationen zur Laufzeit Hinzufügen Entfernen Ersetzen Nutzen
  • 32. Dynamisierung Kennzeichen Nutzen Dynamische Aktualisierung von laufenden Systemen zur ... Erweiterung von Fähigkeiten Korrektur von Fehlern Auflösung von Beschränkungen durch Verwendung verschiedener Versionen desselben Moduls
  • 33. Zusammenfassung Formale Identität, abgekoppelt von Artefakten Keine Modularisierung Formale Verträge für Module, entkoppelt von deren Identität Dienste mit semantischer Versionierung, entkoppelt von ihrer Implementierung Betrieb von Repositories mit Unterstützung für Modularität, Zusammenarbeit und Aufsicht, unabhängig vom Eigentum Unterstützung von Lebenszyklen ohne Beeinträchtigung des laufenden Betriebs
  • 34. Strategien zur Modularisierung Bis Level 5: Devolution Bis Level 6: Dynamisierung Grundsätzlich iterative Vorgehensweise Keinen Level ignorieren Keinen Level überspringen Stufenweise Erhöhung des Levels
  • 35. Bis Level 5: Devolution Arzneimittel Apache Ant / Ivy Gradle SBT Apache Maven Anwendungsgebiete Kleine Projekte Große Unternehmensanwendungen Statische Modularisierung Gegenanzeigen IOC-Container Servlet EJB
  • 36. Bis Level 6: Dynamisierung Dynamische Modularisierung Anwendungsgebiete IOC-Container Servlet EJB Große Unternehmensanwendungen Arzneimittel OSGi Eclipse Equinox Apache Felix Gegenanzeigen Kleine Projekte
  • 37. Techniken zur Modularisierung Auflösung von Konflikten Anwendung von Modularisierungsmustern Erstellung eines Plugins
  • 38. Erstellung eines Plugins Tools TrueCommons Services Konzept Erleichtert die Implementierung von Plugins Beispiele TrueCommons Annotations Erleichtern den Umgang mit java.util.ServiceLoader Beispiele Apache Maven Das grundsätzliche Werkzeug für die Modularisierung
  • 39. TrueCommons Annotations Erleichtern den Umgang mit java.util.ServiceLoader Generieren Resource-Dateien in META-INF/ services Beispiele Implementierung fremder Schnittstellen Implementierung eigener Schnittstellen
  • 40. TrueCommons Annotations Erleichtern den Umgang mit java.util.ServiceLoader Beispiele Implementierung fremder Schnittstellen package  com.company.project; import  java.nio.charset.spi.CharsetProvider; import  net.java.truecommons.services.annotations.ServiceImplementation; @ServiceImplementation(CharsetProvider.class) public  class  Ibm437CharsetProvider  extends  CharsetProvider  {        ... } Implementierung eigener Schnittstellen package  com.company.project.impl; import  com.company.project.spec.UltimateServiceSpecification; import  net.java.truecommons.services.annotations.ServiceImplementation; @ServiceImplementation public  class  UltimateServiceImplementation implements  UltimateServiceSpecification  {        ... } package  com.company.project.spec; import  net.java.truecommons.services.annotations.ServiceSpecification; @ServiceSpecification public  interface  UltimateServiceSpecification  {        ... }
  • 41. TrueCommons Services Konzept Erleichtert die Implementierung von Plugins Beispiele
  • 42. Beispiele TrueVFS Kernel Specification FsDriverMapFactory.java FsDriverMapModifier.java FsDriverMapLocator.java TrueVFS Driver TAR.GZIP TarGZipDriverMapModifier.java TrueVFS Driver ZIP ZipDriverMapModifier.java Der wahlfreie Zugriff auf Archivdateien soll nur durch Konfiguration des Klassenpfades ermöglicht werden Implementierung des Service-Locator- Entwurfsmusters
  • 43. TrueVFS Kernel Specification FsDriverMapFactory.java package  net.java.truevfs.kernel.spec.spi; import  net.java.truecommons.annotations.ServiceImplementation; import  net.java.truecommons.annotations.ServiceSpecification; import  net.java.truecommons.services.LocatableFactory; import  net.java.truevfs.kernel.spec.FsDriver; import  net.java.truevfs.kernel.spec.FsScheme; import  java.util.LinkedHashMap; import  java.util.Map; @ServiceSpecification @ServiceImplementation public  class  FsDriverMapFactory extends  LocatableFactory<Map<FsScheme,  FsDriver>>  {        @Override        public  Map<FsScheme,  FsDriver>  get()  {  return  new  LinkedHashMap<>(32);  } } FsDriverMapModifier.java FsDriverMapLocator.java
  • 44. TrueVFS Kernel Specification FsDriverMapFactory.java FsDriverMapModifier.java package  net.java.truevfs.kernel.spec.spi; import  net.java.truecommons.annotations.ServiceSpecification; import  net.java.truecommons.services.LocatableModifier; import  net.java.truevfs.kernel.spec.FsDriver; import  net.java.truevfs.kernel.spec.FsScheme; import  java.util.Map; @ServiceSpecification public  abstract  class  FsDriverMapModifier extends  LocatableModifier<Map<FsScheme,  FsDriver>>  {  } FsDriverMapLocator.java
  • 45. TrueVFS Kernel Specification FsDriverMapFactory.java FsDriverMapModifier.java FsDriverMapLocator.java package  net.java.truevfs.kernel.spec.sl; import  net.java.truecommons.services.Container; import  net.java.truecommons.services.ServiceLocator; import  net.java.truevfs.kernel.spec.FsDriver; import  net.java.truevfs.kernel.spec.FsScheme; import  net.java.truevfs.kernel.spec.spi.FsDriverMapFactory; import  net.java.truevfs.kernel.spec.spi.FsDriverMapModifier; import  java.util.Collections; import  java.util.Map; public  final  class  FsDriverMapLocator implements  Container<Map<FsScheme,  FsDriver>>  {        public  static  final  FsDriverMapLocator  SINGLETON  =  new  FsDriverMapLocator();        private  final  Map<FsScheme,  FsDriver>  drivers                        =  Collections.unmodifiableMap(                        new  ServiceLocator(FsDriverMapLocator.class)                                        .factory(FsDriverMapFactory.class,  FsDriverMapModifier.class)                                        .get());        private  FsDriverMapLocator()  {  }        @Override        public  Map<FsScheme,  FsDriver>  get()  {  return  drivers;  } }
  • 46. TrueVFS Driver TAR.GZIP TarGZipDriverMapModifier.java package  net.java.truevfs.driver.tar.gzip; import  net.java.truecommons.annotations.ServiceImplementation; import  net.java.truecommons.shed.ExtensionSet; import  net.java.truevfs.kernel.spec.FsDriver; import  net.java.truevfs.kernel.spec.FsScheme; import  net.java.truevfs.kernel.spec.spi.FsDriverMapModifier; import  java.util.Map; @ServiceImplementation public  final  class  TarGZipDriverMapModifier  extends  FsDriverMapModifier  {        @Override        public  Map<FsScheme,  FsDriver>  apply(final  Map<FsScheme,  FsDriver>  map)  {                final  FsDriver  driver  =  new  TarGZipDriver();                for  (final  String  extension  :  new  ExtensionSet("tar.gz|tar.gzip|tgz"))                        map.put(FsScheme.create(extension),  driver);                return  map;        } }
  • 47. TrueVFS Driver ZIP ZipDriverMapModifier.java package  net.java.truevfs.driver.zip; import  net.java.truecommons.annotations.ServiceImplementation; import  net.java.truevfs.comp.zipdriver.ZipDriver; import  net.java.truevfs.kernel.spec.FsDriver; import  net.java.truevfs.kernel.spec.FsScheme; import  net.java.truevfs.kernel.spec.spi.FsDriverMapModifier; import  java.util.Map; @ServiceImplementation public  final  class  ZipDriverMapModifier  extends  FsDriverMapModifier  {        @Override        public  Map<FsScheme,  FsDriver>  apply(final  Map<FsScheme,  FsDriver>  map)  {                map.put(FsScheme.create("zip"),  new  ZipDriver());                return  map;        } }
  • 48. Anwendung von Modularisierungsmustern Abhängigkeitsmuster Azyklische Abhängigkeiten
  • 49. Azyklische Abhängigkeiten Analysetools Module dürfen keine zyklischen Abhängigkeiten haben Das gleiche gilt eigentlich auch für Pakete Ausgangssituation Lösungsverfahren
  • 50. Azyklische Abhängigkeiten Analysetools JDepend JDepend Maven Plugin Apache Maven Beispiel TrueLicense Maven Plugin TrueLicense Maven Plugin Module dürfen keine zyklischen Abhängigkeiten haben Ausgangssituation Lösungsverfahren
  • 51. Azyklische Abhängigkeiten Analysetools Module dürfen keine zyklischen Abhängigkeiten haben Ausgangssituation Zyklische Abhängigkeit zwischen Klassen und Modulen (Quelle: [JAA]) Lösungsverfahren
  • 52. Azyklische Abhängigkeiten Analysetools Module dürfen keine zyklischen Abhängigkeiten haben Ausgangssituation Lösungsverfahren Eskalation Auflösung durch Eskalation (Quelle: [JAA]) De-Eskalation Rückrufschnittstelle
  • 53. Azyklische Abhängigkeiten Analysetools Module dürfen keine zyklischen Abhängigkeiten haben Ausgangssituation Lösungsverfahren Eskalation De-Eskalation Auflösung durch De-Eskalation (Quelle: [JAA]) Rückrufschnittstelle
  • 54. Azyklische Abhängigkeiten Analysetools Module dürfen keine zyklischen Abhängigkeiten haben Ausgangssituation Lösungsverfahren Eskalation De-Eskalation Rückrufschnittstelle Auflösung durch Rückrufschnittstelle (Quelle: [JAA])
  • 55. Auflösung von Konflikten Ausgangssituation Ein Abhängigkeitsgraph kann Versionskonflikte enthalten Lösungsverfahren Statische Modularisierung Dynamische Modularisierung
  • 57. Lösungsverfahren Statische Modularisierung <project>        <dependencyManagement>                <dependencies>                        <dependency>                                <groupId>commons-­‐collections</groupId>                                <artifactId>commons-­‐collections</artifactId>                                <version>3.2.1</version>                        </dependency>                        […]                </dependencies>        </dependencyManagement>        […] </project> Dynamische Modularisierung
  • 60. Exkurs: SOLID Entwurfsprinzipien Single responsibility principle Open/closed principle Liskov substitution principle Interface segregation principle Dependency inversion principle
  • 62. /Modularisierung - was soll das.../Modularity Maturity Model Vorgestellt von Graham Charters (IBM) auf dem OSGi Community Event 2011. http://de.slideshare.net/mfrancis/ibm-sponsorship-keynote-towards-a-modularity-maturity-model-graham- charters /Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi... Ausführlich erklärt in Anhang A von Kirk Knoernschilds Buch. http://en.wikipedia.org/wiki/SOLID_(object-oriented_design) /Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven „Apache Maven is a software project management and comprehension tool.“ https://maven.apache.org /Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven/maven-resources-plugin https://maven.apache.org/plugins/maven-resources-plugin/ /Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven/maven-compiler-plugin https://maven.apache.org/plugins/maven-compiler-plugin/ /Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven/maven-surefire-plugin http://maven.apache.org/surefire/maven-surefire-plugin/ /Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven/maven-jar-plugin https://maven.apache.org/plugins/maven-jar-plugin/ /Modularisierung - was soll das.../Motivation/Trennung API und Implementieru.../Beispiele/ TrueUpdate Ein Framework zur (halb-)automatischen Aktualisierung von installierten Enterprise- Java-Anwendungen. https://trueupdate.java.net /Modularisierung - was soll das.../Motivation/Trennung API und Implementieru.../Beispiele/ TrueCommons Eine Sammlung wiederverwendbarer Softwarekomponenten, analog zu den Apache Commons. https://truecommons.java.net /Modularisierung - was soll das.../Motivation/Minimierung von Abhängigkeiten/Beispiele/ TrueLicense/TrueLicense JSON/Abhängigkeiten/Jackson JSON Processor Benötigt ca. 1,5 MB Speicherplatz für die JAR-Dateien.
  • 63. /Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS TrueVFS ist ein virtuelles Dateisystem für Archivdateien (ZIP, TAR, etc). https://truevfs.java.net /Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS/ TrueVFS Driver FILE Ermöglicht den wahlfreien Zugriff auf das Plattformdateisystem. https://truevfs.java.net/truevfs-driver/truevfs-driver-file/index.html /Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS/ TrueVFS Driver TAR.GZIP Ermöglicht den wahlfreien Zugriff auf TAR.GZIP-Dateien. https://truevfs.java.net/truevfs-driver/truevfs-driver-tar-gzip/index.html /Modularisierung - was soll das.../Motivation/Vereinfachung der Konfiguratio.../Beispiele/TrueVFS/ TrueVFS Driver ZIP Ermöglicht den wahlfreien Zugriff auf ZIP-Dateien. https://truevfs.java.net/truevfs-driver/truevfs-driver-zip/index.html /Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/ TrueUpdate Ein Framework zur (halb-)automatischen Aktualisierung von installierten Enterprise- Java-Anwendungen. https://trueupdate.java.net /Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/ TrueUpdate/Basisfunktionalität/TrueUpdate Manager Core Kommuniziert mit einer Zielanwendung in demselben Container und einem Repository auf einem separaten Server und führt ggf. Updates der Zielanwendung durch. /Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/ TrueUpdate/Integrationsadapter/TrueUpdate Manager EJB Integriert den TrueUpdate Manager in einen EJB-Container. /Modularisierung - was soll das.../Motivation/Anpassung an verschiedene Lauf.../Beispiele/ TrueUpdate/Integrationsadapter/TrueUpdate Manager Servlet Integriert den TrueUpdate Manager in einen Servlet-Container. /Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/Apache Maven „Apache Maven is a software project management and comprehension tool.“ https://maven.apache.org
  • 64. /Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/Apache Ivy "Apache Ivy™ is a popular dependency manager focusing on flexibility and simplicity.“ http://ant.apache.org/ivy/ /Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/RPM "The RPM Package Manager (RPM) is a powerful command line driven package management system capable of installing, uninstalling, verifying, querying, and updating computer software packages." http://www.rpm.org /Modularisierung - was soll das.../Modularity Maturity Model/Module/Beispiele/OSGi "OSGi™ - The Dynamic Module System for Java™." http://www.osgi.org/Main/HomePage /Modularisierung - was soll das.../Modularity Maturity Model/Modularität/Gegenbeispiele/"Junkyard Module" http://www.ruhrnachrichten.de/storage/pic/mdhl/artikelbilder/lokales/rn/bolo/bochum/3871428_1_0514bo- Schrottplatz_dam5.jpg?version=1387194298 /Modularisierung - was soll das.../Modularity Maturity Model/Modularität/Gegenbeispiele/"Messy Module" http://de.wikipedia.org/wiki/Messie-Syndrom /Modularisierung - was soll das.../Modularity Maturity Model/Loose Kopplung/Kennzeichen/ Semantische Versionierung von ... http://semver.org /Modularisierung - was soll das.../Modularity Maturity Model/Dynamisierung/Kennzeichen/ Dynamischer Lebenszyklus von M... OSGi: BundleActivator-Schnittstelle: https://osgi.org/javadoc/r4v43/core/org/osgi/ framework/BundleActivator.html . /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/ Arzneimittel/Apache Maven „Apache Maven is a software project management and comprehension tool.“ https://maven.apache.org /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/ Arzneimittel/Apache Ant / Ivy "Apache Ivy™ is a popular dependency manager focusing on flexibility and simplicity.“ http://ant.apache.org/ivy/
  • 65. /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/ Arzneimittel/Gradle From command line to IDE to continuous integration, only one Enterprise build automation system to rule them all. https://gradle.org /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/ Arzneimittel/SBT sbt is a build tool for Scala, Java, and more. http://www.scala-sbt.org/index.html /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/ Anwendungsgebiete Gemäß Arzneimittelgesetz Paragraph 11: Packungsbeilage. /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 5: Devolution/ Gegenanzeigen Gemäß Arzneimittelgesetz Paragraph 11: Packungsbeilage. /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/ Arzneimittel/OSGi Open Services Gateway initiative http://www.osgi.org/Main/HomePage /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/ Arzneimittel/OSGi/Eclipse Equinox https://eclipse.org/equinox/ /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/ Arzneimittel/OSGi/Apache Felix http://felix.apache.org /Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/ Anwendungsgebiete Gemäß Arzneimittelgesetz Paragraph 11: Packungsbeilage. /Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/ Apache Maven „Apache Maven is a software project management and comprehension tool.“ https://maven.apache.org /Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/ TrueCommons Annotations https://truecommons.java.net/apidocs/net/java/truecommons/annotations/package-summary.html
  • 66. /Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/ TrueCommons Services https://truecommons.java.net/apidocs/net/java/truecommons/services/package-summary.html /Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/Apache Maven „Apache Maven is a software project management and comprehension tool.“ https://maven.apache.org /Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/JDepend http://clarkware.com/software/JDepend.html /Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/JDepend Maven Plugin http://mojo.codehaus.org/jdepend-maven-plugin/ /Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/Beispiel/ TrueLicense Maven Plugin https://truelicense.java.net/truelicense-maven-plugin/dependencies.html /Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/Beispiel/ TrueLicense Maven Plugin https://truelicense.java.net/truelicense-maven-plugin/jdepend-report.html /Modularisierung - was soll das.../Das große Bild/Quelle: [JAA] Quelle: [JAA]: Figure 6.4: Granularity and architecture all the way down /Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Single responsibility principl... http://en.wikipedia.org/wiki/Single_responsibility_principle /Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Open/closed principle http://en.wikipedia.org/wiki/Open/closed_principle /Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Liskov substitution principle http://en.wikipedia.org/wiki/Liskov_substitution_principle /Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Interface segregation principl... http://en.wikipedia.org/wiki/Interface_segregation_principle
  • 67. /Modularisierung - was soll das.../Exkurs: SOLID Entwurfsprinzipi.../Dependency inversion principle http://en.wikipedia.org/wiki/Dependency_inversion_principle /Modularisierung - was soll das.../Quellen / Literatur/[SMB] Ulf Fildebrandt: Software modular bauen: Architektur von langlebigen Softwaresystemen - Grundlagen und Anwendung mit OSGi und Java (dpunkt.verlag) http://www.amazon.de/Software-modular-bauen-Architektur-Softwaresystemen-ebook/dp/B00AIBE0YI /Modularisierung - was soll das.../Quellen / Literatur/[JAA] Kirk Knoernschild: Java Application Architecture: Modularity Patterns with Examples Using OSGI (Prentice Hall) http://www.amazon.de/Java-Application-Architecture-Modularity-Patterns-ebook/dp/B007KOGS5U /Modularisierung - was soll das.../Quellen / Literatur/[LC] http://www.amazon.de/Working-Effectively-Legacy-Robert-Martin-ebook/dp/B005OYHF0A /Modularisierung - was soll das.../Quellen / Literatur/[CC] Robert C. Martin: Clean Code: A Handbook of Agile Software Craftsmanship (Prentice Hall) http://ecx.images-amazon.com/images/I/51d1qVhmAmL.jpg