67
Modularisierung - was soll das? http://christian.schlichtherle.de

Modularisierung - was soll das?

Embed Size (px)

Citation preview

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

MotivationTrennung 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

IdeeZerlegung großer Anwendungen in Komponenten mit unabhängigen Entwicklungszyklen

VorteileVerkü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

VorteileEin API, viele Implementierungen

Getrennte Entwicklungszyklen möglich

Beispiele

Trennung API und Implementierungen

Idee

Vorteile

BeispieleTrueUpdate

API TrueUpate Installer Core

ImplementierungenTrueUpdate 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

VorteileVermeidung 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 TrueLicenseTrueLicense JSON

AbhängigkeitenJackson 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

Anpassung an verschiedene Laufzeitumgebungen

Beispiele

IdeeEine 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

IntegrationsadapterTrueUpdate Manager Servlet

TrueUpdate Manager EJB

Idee

Vorteile

Modularity Maturity Model

Module

Modularität

Loose Kopplung

Devolution

Dynamisierung

Zusammenfassung

Ad-Hoc

Ad-HocKennzeichen

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-HocKennzeichen

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

NutzenEntkoppelt 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 ModuleFä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

vonFehlerkorrekturen

Kompatibilitätsbrüchen

aufImplementierungen

Anwendungen

Bewusstsein für Systemstruktur

Kunden/Anbieter-Unabhängigkeit

Anforderungsbasierte Überprüfung von Abhängigkeiten

Gegenbeispiele

Loose KopplungKennzeichen

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

DevolutionKennzeichen

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

AufsichtAbnahmen

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

DynamisierungKennzeichen

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: DevolutionArzneimittel

Apache Ant / Ivy

Gradle

SBT

Apache Maven

AnwendungsgebieteKleine Projekte

Große Unternehmensanwendungen

Statische Modularisierung

Gegenanzeigen IOC-ContainerServlet

EJB

Bis Level 6: Dynamisierung

Dynamische Modularisierung

AnwendungsgebieteIOC-Container

Servlet

EJB

Große Unternehmensanwendungen

Arzneimittel

OSGiEclipse 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

BeispieleImplementierung 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;

@ServiceImplementationpublic  class  UltimateServiceImplementationimplements  UltimateServiceSpecification  {        ...}

package  com.company.project.spec;

import  net.java.truecommons.services.annotations.ServiceSpecification;

@ServiceSpecificationpublic  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@ServiceImplementationpublic  class  FsDriverMapFactoryextends  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;

@ServiceSpecificationpublic  abstract  class  FsDriverMapModifierextends  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  FsDriverMapLocatorimplements  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;

@ServiceImplementationpublic  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;

@ServiceImplementationpublic  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ängigkeitenAnalysetools

Module dürfen keine zyklischen Abhängigkeiten haben Das gleiche gilt eigentlich auch für Pakete

Ausgangssituation

Lösungsverfahren

Azyklische AbhängigkeitenAnalysetools

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ösungsverfahrenStatische Modularisierung

Dynamische Modularisierung

Ausgangssituation Ein Abhängigkeitsgraph kann Versionskonflikte enthalten

LösungsverfahrenStatische 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]

/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-pluginhttps://maven.apache.org/plugins/maven-resources-plugin/

/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven/maven-compiler-pluginhttps://maven.apache.org/plugins/maven-compiler-plugin/

/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven/maven-surefire-pluginhttp://maven.apache.org/surefire/maven-surefire-plugin/

/Modularisierung - was soll das.../Motivation/Unterschiedliche Entwicklungsz.../Beispiele/Apache Maven/maven-jar-pluginhttps://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 initiativehttp://www.osgi.org/Main/HomePage

/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/Arzneimittel/OSGi/Eclipse Equinoxhttps://eclipse.org/equinox/

/Modularisierung - was soll das.../Strategien zur Modularisierung/Bis Level 6: Dynamisierung/Arzneimittel/OSGi/Apache Felixhttp://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 Annotationshttps://truecommons.java.net/apidocs/net/java/truecommons/annotations/package-summary.html

/Modularisierung - was soll das.../Techniken zur Modularisierung/Erstellung eines Plugins/Tools/TrueCommons Serviceshttps://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/JDependhttp://clarkware.com/software/JDepend.html

/Modularisierung - was soll das.../Techniken zur Modularisierung/Anwendung von Modularisierungs.../Abhängigkeitsmuster/Azyklische Abhängigkeiten/Analysetools/JDepend Maven Pluginhttp://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 Pluginhttps://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 Pluginhttps://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 principlehttp://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