Code auslagern

fireGlurak

Aktives Mitglied
Hallo zusammen,
ich möchte gerne bestimmten Code auslagern, da dies an verschiedensten Stellen benötigt wird.

Es handelt sich hierbei um keine objektspezifische Daten und mir schweben da im Moment 2 Varianten im Kopf herum.
Ich weiß allerdings nicht genau welches besser wäre bzw. welche Frage ich mir dazu stellen sollte? :(

Ich habe dazu mal ganz vereinfachte Besipiele erstellt

Möglichkeit_1: Daten über ein statische Methode einer weiteren Klasse auslagern
Code:
public Class Helper   
    public static Data getData() {
            Data data = new Data();
            return data;
      }
}   

public class ClientA {
      Data data = Helper.getData();
}

public class ClientB {
     Data data = Helper.getData();
}

Möglichkeit_2: Lösen über Interfaces


Code:
public interface IData {
    Data getData();
}

public class InterfaceImpl implements IData{
      @Override
      public Data getData() {
            Data data = new Data();
            return data;
      }
      
public class ClientA {
      IData iData = new InterfaceImpl();
      Data data = iData.getData();
}

public class ClientB {
      IData iData = new InterfaceImpl();
      Data data = iData.getData();
}
}

Über Hilfe bin sehr dankbar :)
 

httpdigest

Top Contributor
Oder einfach über einen Konstruktorparameter im Konstruktor von ClientA und ClientB?
Du musst dich immer fragen: Ist das, was ich da in ClientA und ClientB haben will, eine Abhängigkeit von diesen beiden Klassen? Und: Will ich ClientA und ClientB auch unit-testen und dann eventuell einen Mock von `Data` im Test erzeugen und den ClientA und ClientB Instanzen "reingeben"?
Deswegen: Bitte _niemals_ statische Factory-Methoden direkt in den Nutzern der erzeugten Objekte aufrufen, sondern immer von außen orchestrieren.
 

httpdigest

Top Contributor
Noch kleiner Zusatz: Es macht auch wirklich überhaupt keinen Unterschied, ob du nun innerhalb von ClientA/ClientB schreibst:
Java:
Data data = Helper.getData();
oder:
Java:
IData iData = new InterfaceImpl();
Data data = iData.getData();

Beides ist gleichermaßen schlecht und du gewinnst durch die zweite Variante ja auch nichts. Egal, wieviele Abstraktionsschichten und Delegationen du da hinzufügst: In jedem Fall muss der _Nutzer_ der Abhängig (also ClientA und ClientB) ja über die _ganze konkrete_ Klasse von InterfaceImpl Bescheid wissen und auch selbst erzeugen und somit für sich schon festlegen, welche Instanz von Data er dann durch dieses InterfaceImpl bekommt. Also das Interface bringt hier nichts, weil die abhängige Entität (ClientA bzw. ClientB) effektiv nicht vom Interface abhängt, sondern von der konkreten Implementierung, also von InterfaceImpl und damit auch von dem, was InterfaceImpl.getData() liefert. Interfaces führt man ein, um Flexibilität in Form von Polymorphismus zu erreichen. Dazu darf aber nicht ClientA/ClientB von der konkreten Implementierung abhängen, sondern nur vom Interface (welches man dann von außen reinreicht).

Hier ist das "Dependency Inversion Principle" verletzt:
"High-level modules should not import anything from low-level modules. Both should depend on abstractions (e.g., interfaces)."
"Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions."

weil deine Implementierung (ClientA/ClienetB) eben nicht von Abstraktionen abhängt, sondern von konkreten Implementierung.
 

fireGlurak

Aktives Mitglied
Hallo und danke für die ausführliche Antwort :)
Mit dem Dependency Inversion Principle müsste ich mich evtl. nochmal näher mit beschäftigen :D

Zu meinem Beispiel mit dem Interface muss ich noch eine korrektur vornehmen:
In meiner Anwendung würde das Interface an Client A/B per Injection reinkommen, also von "außen" (dachte zunächst würde keine Rolle spielen, deswegen habe ich das so vereinfacht dargestellt).

In dem Fall wäre es dann schon ein gängiger Weg wenn ich darüber nachdenke, da...

In jedem Fall muss der _Nutzer_ der Abhängig (also ClientA und ClientB) ja über die _ganze konkrete_ Klasse von InterfaceImpl Bescheid wissen und auch selbst erzeugen
...hierbei dann ja nicht mehr zutrifft.
Und...

Oder einfach über einen Konstruktorparameter im Konstruktor von ClientA und ClientB?
...ist damit wohl auch gemeint gewesen!?
 

fireGlurak

Aktives Mitglied
Achso und

Du musst dich immer fragen: Ist das, was ich da in ClientA und ClientB haben will, eine Abhängigkeit von diesen beiden Klassen
Naja also das was ich von getData (hier spielen sich im wesentlichen Serviceaufrufe im Background statt) bekommen möchte ist Abhängig von den Eingangsparametern die ich über getData mitgebe (im Beispiel nicht beachtet).

Will ich ClientA und ClientB auch unit-testen und dann eventuell einen Mock von `Data` im Test erzeugen und den ClientA und ClientB Instanzen "reingeben"?

Ja guter Punkt, ist zwar aktuell noch nicht geplant, kann aber in der Zukunft vill. doche eine Rolle spielen.
 

temi

Top Contributor
Mit dem Dependency Inversion Principle müsste ich mich evtl. nochmal näher mit beschäftigen :D
Der einfachste Fall wäre Konstruktor Injektion:
Java:
public class ClientA {
    private Data data;
 
    public ClientA(Data data) {
        this.data = data;
    }
 

}
Das war's auch schon. Klare Verhältnisse. Die Klasse ClientA sagt, dass sie "Data" als Abhängigkeit benötigt und du übergibst die von außen, beim Erzeugen der Instanz. Damit kannst du zum Testen auch eine Mock-Data-Implementation übergeben (sofern "Data" ein Interface ist).

"Data" kannst du natürlich durch eine beliebigen anderen Typen ersetzen, z. B. einen DataService, der sich irgendwo die Daten her holt.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Code in Methode auslagern möglich? Allgemeine Java-Themen 9
Zrebna Tipps für Organisation von Code-Reviews nach einem Pull Request. Allgemeine Java-Themen 5
M Unsicher, ob das Code richtig ist Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
schemil053 Methoden Code-Verbesserung Allgemeine Java-Themen 2
D Webarchive (war): Code verschleiern Allgemeine Java-Themen 7
D Compiler-Fehler child process exited with code 1 Allgemeine Java-Themen 1
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
berserkerdq2 Versteht jemand, was diese beiden Zahlen bei dem IJVM Code zu bedeuten haben? Allgemeine Java-Themen 10
OnDemand Releaseversion Tag in Code Allgemeine Java-Themen 5
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
A code wird nicht ausgeführt Allgemeine Java-Themen 3
B Bitte um Code Erklärung Allgemeine Java-Themen 5
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
N Regulären Ausdruck in normalen Java-Code umwandeln Allgemeine Java-Themen 12
OnDemand Clean Code oder Allgemeine Java-Themen 5
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
J Simple Date Format Alternativen bitte um Code Allgemeine Java-Themen 14
AGW in Java-Code plötzlich ein paar Wörter in Rot Allgemeine Java-Themen 2
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
H Precompilierten code ansehen Allgemeine Java-Themen 3
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
L Ausgabe von in Echtzeit ausgeführten Code Allgemeine Java-Themen 9
Drachenbauer Wie kann ich die menge an code reduzieren? Allgemeine Java-Themen 28
Thallius Warum ist dieser Code OS abhängig? Allgemeine Java-Themen 10
S Code Erklärung Allgemeine Java-Themen 21
B Pausem im Code Allgemeine Java-Themen 2
T Java-Quiz Code Fehler Allgemeine Java-Themen 10
L Eclipse Java Code ausführen Allgemeine Java-Themen 18
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
F Code in Klassen bringen Allgemeine Java-Themen 4
S Gibt es eigentlich Java Source Code Interpreter..? Allgemeine Java-Themen 13
J JUnit - Auslassen von Code Allgemeine Java-Themen 25
F Klassen Spaghetti Code Vermeidung Allgemeine Java-Themen 16
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
J Code Page characters darstellen Allgemeine Java-Themen 12
J wie sollte man sinnvoll seinen Code aufteilen Allgemeine Java-Themen 6
I Python Code in Java Code Allgemeine Java-Themen 9
M Java (GUI) Code verdoppeln oder anzeige mehrmals anzeigen? Allgemeine Java-Themen 8
N Wie öffne ich einen runtergeladadenen Code in IntelliJ Allgemeine Java-Themen 3
R Fehler im Code Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 3
O Standard library nativer C code Allgemeine Java-Themen 1
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
S Java Editor Bekomme bei der Code-Vervollständigung die Zeichen ​ Allgemeine Java-Themen 3
N Morse Code decoder Allgemeine Java-Themen 9
O Erste Schritte Benzinverbrauch Code Hilfe Allgemeine Java-Themen 3
S Eclipse exit code 805306369 Allgemeine Java-Themen 1
Pataraca Vererbung Code einbinden Allgemeine Java-Themen 3
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
S Code 'innerhalb' des synchronen Bereichs einer BlockingQueue ausfuehren..? Allgemeine Java-Themen 7
F Verständlichkeitsproblem bei Java Code?! Allgemeine Java-Themen 2
G Eclipse Eclipse: Unreachable code Allgemeine Java-Themen 16
P Java Android Code in IOS compilieren? Allgemeine Java-Themen 9
C Code vereinfachen Allgemeine Java-Themen 2
T Hilfe bei Code Allgemeine Java-Themen 3
R Java-Code für folgene Aufgabe? Allgemeine Java-Themen 8
Prafy Best Practice Code Refaktorisierung Allgemeine Java-Themen 7
WetWer Was bedeutet/macht ein Exit-Code Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
perlenfischer1984 HTML Code decodieren Allgemeine Java-Themen 2
C ASCII-Code in Java Allgemeine Java-Themen 1
J Java-Code in DLL packen Allgemeine Java-Themen 5
J LWJGL 3 Error Code 1282 Allgemeine Java-Themen 4
0 Code startet nicht (Keine Warnung/Fehlermeldung) Allgemeine Java-Themen 4
A Frage zu meinem Code Allgemeine Java-Themen 2
B Code generierung Velocity Templates Telosys Allgemeine Java-Themen 1
E Fehlermeldung vor dem Programm code Allgemeine Java-Themen 1
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
Fischkralle Ausführen von fremden Code Allgemeine Java-Themen 14
wolfgang63 Code snipped Software Allgemeine Java-Themen 1
L Eclipse Editieren des Code templates für Override methods Allgemeine Java-Themen 2
J Java code "plugin" fähig machen Allgemeine Java-Themen 4
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
Thallius Wie verstecke ich meinen private Key am besten im Code? Allgemeine Java-Themen 10
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
N HTTP response code: 403 Allgemeine Java-Themen 3
D Code bitte mit 19 stelligen Zahlen kompatibel machen Allgemeine Java-Themen 5
D Java Compiler code referencen Allgemeine Java-Themen 0
B Fehler im Java-Code Allgemeine Java-Themen 4
A PHP-Code zu Java-Code Allgemeine Java-Themen 5
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
X Was macht folgender Code!? Allgemeine Java-Themen 6
K Code zu einem Projekt entschluesseln Allgemeine Java-Themen 15
H Java Leistungssteigerung durch Code Anpassung Allgemeine Java-Themen 5
Fab1 Best Practice Vorgehensweise bestehenden Code/Programm verschönern Allgemeine Java-Themen 4
M Code optimieren Allgemeine Java-Themen 7
A jEditorPane Html Datei öffnen (code) Allgemeine Java-Themen 3
S EAN-Code Tabelle für CD's Allgemeine Java-Themen 2
T Code durch eigenes Frame pausieren (ähnlich JDialog) Allgemeine Java-Themen 4
J Erzeugung von Java-Code Allgemeine Java-Themen 2
A Source code analyze Allgemeine Java-Themen 8

Ähnliche Java Themen


Oben