-Verschiedene Versionen eines Programms verwalten

CSHW89

Bekanntes Mitglied
Hallo Leute,

ich habe ein Programm geschrieben, das bei einem Kunden schon erfolgreich arbeitet. Nun kam ein anderer Kunde auf mich zu, und möchte das selbe Programm haben, allerdings mit einigen kleinen Änderungen (hier mal ein Text anders, dort ne zusätzliche Schaltfläche ect...).
Nun frage ich mich, wie ich die beiden (oder später vielleicht auch mehrere) verschiedenen Versionen verwalte. Zur Info, ich benutze Eclipse und Git. Ich kam auf die Idee mit Git zwei (bzw. später mehrere) Branches zu erstellen, die dann für immer gleichzeitig verlaufen. Ich habe allerdings gelesen, dass das keine besonders gute Idee ist, da jede noch so kleine Änderung in alle Branches gemergt werden müssen, was deutlich Zeit kostet, und fehleranfällig ist.
Eine andere Idee wären kleine Precompile-Direktiven wie in C/C++. Allerdings hat Java das ja nicht. Weiß jemand, wie man das umsetzen könnte, oder hat vielleicht andere Ideen zu meinem Problem? Wäre da für jeden kleinen Denkanstoß dankbar.

Vielen Dank schon mal
lg Kevin
 
K

kneitzel

Gast
Also unterschiedliche Texte würde ich rein über abweichende Ressourcedateien handhaben.

Funktionale Unterschiede würde ich an Deiner Stelle immer vermeiden wenn irgendwie möglich. Die Branche sind für einen "private Fix" durchaus ok, aber die sollten dann recht schnell in den Main-Zweig eingehen.

Wenn dies überhaupt nicht anders gehen sollte, wäre es evtl. denkbar, die Unterschiede sehr lokal zu halten. Ggf. kann man sich hier ja eine Implementation überlegen, über die eine Art AddOn eingebunden wird. Das eigentliche Programm ist dann immer gleich nur eben bekommt der Kunde dann noch ein weiteres jar mit der notwendigen Konfigurations-Anpassung. (Auch die Anpassungen an den Ressourcen würde ich ebenso additiv umsetzen)

So würde ich das angehen, wobei ich so einen Fall bisher noch nicht wirklich hatte.
 

Joose

Top Contributor
Es kommt darauf an worin die Unterschiede bestehen und in welchem Umfang! Wenn es nur oberflächige Unterschiede sind dann ist es nicht schwer bzw. kein großes Problem.
Bei Unterschiedlicher Geschäftslogik und/oder Datenmodell wird es schon schwerer.

Generell sollte es kein Problem sein wenn dein Programm eine passende Trennung zwischen den Schichten aufweist (https://de.wikipedia.org/wiki/Schichtenarchitektur).
Hierbei kommunizieren die Schichten nur mit der jeweils darunterliegenden Schicht und auch nur über Interfaces. Dadurch kannst du zum Beispiel die Präsentationsschicht (Oberfläche/UI) einfach austauschen gegen eine andere ohne Code der darunterliegenden Schichten anzupassen.

Soll hingegen statt auf einer MySQL Datenbank in Files oder einer Oracle Datenbank gespeichert werden dann muss man eben die Datenzugriffsschicht austauschen. Sind nur Berechnungen anders dann kann man die Geschäftslogik austauschen.

Sind Änderungen in allen Schichten vorzunehmen dann wäre es wahrscheinlich besser die Projekte zu duplizieren. Wenn beide Varianten laufen kann man schauen welche Gemeinsamkeiten man rausziehen kann in eigene Basisprojekte. Diese können dann eben auch als Grundlagen für die Applikation für Kunde C dienen.
 

CSHW89

Bekanntes Mitglied
Danke schonmal für die Antworten.

Eine gewisse Trennung der Schichten besitze ich. Allerdings finde ich das MVC-Modell etwas zu ideallisiert. Meine Daten sind vom View und Control getrennt. Da sehe ich keine Probleme. View und Control zu trennen sehe ich allerdings immer etwas kritischer. Ich mein, ein Main-Control besitze ich, dass dafür zuständig ist, zwischen den Views zu navigieren. Die "Logik" der Views managen die Views aber selbst. (Ich will aber jetzt hier keine Grundsatzdiskussion führen, nur zeigen, wies bei mir aussieht).

Das mit den Interfaces ist natürlich ein probates Mittel. Ich sehe da allerdings die Gefahr der Codeduplizierung. Mal ein kleines anschauliches Beispiel: Ich hab ein recht unfangreiches View, in der Mitte ist eine Tabelle mit Produkten, jedes Produkt hat nun drei verschiedene Preise zu verschiedenen Zeiten (z.b. Wochenende ein anderer Preis oder so was). Nun will aber Kunde B meines Programms nur ein immer gleichen Preis für jedes Produkt. Intern belasse ich es nun bei drei Preisen, zeige aber immer nur einen an, und wenn dieser geändert wird, ändern sich intern alle drei. Problem mit wenig Aufwand gelöst.
Dafür könnte ich jetzt also hingehen, und das unfangreiche View kopieren und dort die beiden Spalten einfach entfernen. Jetzt hab ich allerdings zwei fast identische Views. Selbst wenn ich das Control vom View trennen würde, müsste ich View und Control duplizieren. Und beim View: selbst wenn ich die Tabelle alleine kopieren würde, wäre es noch einiges an doppeltem Code. Spätere Änderungen an der Tabelle müssten doppelt und dreifach ausgeführt werden.

Gibt es keine bessere Möglichkeit in Git, zwei fast identische Branches (oder was weiß ich) laufen zu lassen, oder gibt es Pre-Compiler-Direktiven in Java per Plugins in Eclipse?
 

thecain

Top Contributor
Was haben Interfaces mit Codeduplizierung zu tun? Nur wenn die Interfaces nicht passend definiert sind, kann das passieren. (Oder man etwas zu generisch machen will)

Ansonsten musst du dir die Frage stellen, willst du ein Standardprodukt anbieten oder spezielle Lösungen. Bei letzerem wirst du nicht drum rum kommen pro Kunde speziellen Code zu verwendet. Bei ersterem müssen Kunden damit leben, dass die Software vielleicht Features bietet, die sie im moment nicht verwenden.
 

CSHW89

Bekanntes Mitglied
Bei dem speziellen Beispiel von oben sieht die Tabelle fast identisch aus (nur zwei Spalten fehlen). Egal wie man das Interface definiert, das Aussehen und das Verwalten der anderen Spalten muss man immer duplizieren. Gut das könnte man vielleicht irgendwie ohne hinkriegen, aber nicht sehr intuitiv. Vielleicht mit sowas wie einem Standardaussehen/verhalten und einem "Änderungs" bzw. "Abweichungs"-Interface oder so.
 
K

kneitzel

Gast
Also diese Problematik kann man doch durch eine Generalisierung des Datenmodells und der Views / Controller erreichen. Statt 3 Preisen hat man dann eine dynamische Anzahl an Preisen mit ggf. weiteren Eigenschaften (Wann ist welcher Preis gültig). Und die Zugriffe darauf verändern sich dann halt auch, weil ein Zeitpunkt angegeben werden muss. Das Beispiel würde ich also als ein einfaches Feature in der Software sehen.

Komplizierter sind abweichende Logiken, bei der es keine Generalisierung gibt, die alle Fälle abdecken. Aber auch da gibt es durch OO Techniken keinen doppelten Code. (Den Punkt kann ich eh nicht ganz verstehen. Für die Eliminierung von doppeltem Code gibt es ja eben diverse Refactorings.)
 

Dompteur

Top Contributor
Ich würde keinesfalls den Source-Code auseinander laufen lassen.

Mein Ansatz wäre eine Brutto-Version, die alle Varianten beinhaltet und über Konfigurationsparameter auf die einzelnen Kunden angepasst wird.
Die Konfigurationsparameter sind entweder Ja/Nein-Schalter, Aufzählungen oder einzustellende Werte.
Dabei würde ich versuchen fachliche Begriffe zu finden, die diese Parameter beschreiben.
Alles, was dann noch an Unterschieden übrig bleibt, würde ich über einen allgemeinen Parameter steuern. Also quasi einen Parameter, der für jeden unterstützten Kunden einen Wert hat.

Bei der Realisierung der Unterschiede gibt es verschiedene Varianten.
Bei der Oberfläche kann man eine Brutto-Maske erstellen und alle in dieser Varianten nicht benötigten Felder verstecken. Ein passender Layouter müsste dann die Maske so rendern, dass Lücken geschlossen werden. Hier hängt es davon ab, ob man einen User-Interface-Editor benutzt oder die Maske im Code dynamisch erstellt.
Funktionale Unterschiede kann man durch verschiedene abgeleitete Klassen (-> Instantiierung über Factories) oder das Delegator-Pattern realisieren.
Kleine Unterschiede können aber auch etwas schlampig durch ein einfaches IF-THEN-ELSE Konstrukt realisiert werden. Wenn es dann immer mehr IF's gibt, kann man später immer noch Refaktoring einsetzen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Verschiedene Versionen eines Interfaces Allgemeine Java-Themen 12
C Verschiedene Versionen mit Datenbanken Allgemeine Java-Themen 3
J Verschiedene Runtime Versionen gleichzeitig? Allgemeine Java-Themen 12
H verschiedene Java Versionen Allgemeine Java-Themen 3
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
M verschiedene Dokumente auslesen Allgemeine Java-Themen 1
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
K Verschiedene Sprachen Allgemeine Java-Themen 1
M Verschiedene Pilzartenerkennung Allgemeine Java-Themen 0
I Verschiedene Arrays auslesen Allgemeine Java-Themen 6
nrg Verschiedene JREs im Browser konfigurieren Allgemeine Java-Themen 6
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
G DesignPattern Verschiedene Services Allgemeine Java-Themen 4
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
M massenhaft verschiedene Date-Pattern Allgemeine Java-Themen 3
R Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts Allgemeine Java-Themen 5
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
faetzminator verschiedene Beans, verschiedene Felder "koppeln" Allgemeine Java-Themen 3
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
M verschiedene Methonden innerhalb des gleichen Threads Allgemeine Java-Themen 7
N verschiedene Klasse laden (Designfrage) Allgemeine Java-Themen 2
S Package in verschiedene Projekten einbinden? Allgemeine Java-Themen 3
D Verschiedene Datein aus einer Zip Datei ins Programm laden Allgemeine Java-Themen 4
D Verschiedene Persistenz Strategien Allgemeine Java-Themen 7
S Konstruktoren, verschiedene Klassen, Methoden. Allgemeine Java-Themen 3
M Verschiedene Modi bei AbstractTableModel Allgemeine Java-Themen 10
J Verschiedene Klassen, verschiedene Ströme? Allgemeine Java-Themen 6
V 1 Methode für viele verschiedene Klassen? Allgemeine Java-Themen 9
J Verschiedene Starteinstellungen Allgemeine Java-Themen 7
J Programm für verschiedene Betriebssystem vertreiben? Allgemeine Java-Themen 10
M 2 verschiedene LookAndFeels in einem Fenster möglich? Allgemeine Java-Themen 6
D Gehts praktischer? Thema:Verschiedene Instanzen einer Klasse Allgemeine Java-Themen 3
C Verschiedene JDKs Allgemeine Java-Themen 6
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5
C verschiedene Klassenarten Allgemeine Java-Themen 3
G Verschiedene Auflösungen Allgemeine Java-Themen 6
A Textfeld soll verschiedene Datumseingaben akzeptieren Allgemeine Java-Themen 5
T ändern neue Java Versionen was an der Programmiersprache? Allgemeine Java-Themen 15
S Probleme mit unterschiedlichen Java-Versionen (Mac OS X 10.11) Allgemeine Java-Themen 0
P Mehrere Java Versionen auf dem Rechner Allgemeine Java-Themen 3
F Webstart zwei Java Versionen / aktivieren bzw deaktivieren Allgemeine Java-Themen 2
J Jars in unterschiedlichen Versionen Allgemeine Java-Themen 14
Shoox Java-Versionen Allgemeine Java-Themen 5
M Unterschiedliche Java-Versionen Allgemeine Java-Themen 5
R Testen von Applets - versch. Browser und Java Versionen? Allgemeine Java-Themen 4
G jar und Java-Versionen Allgemeine Java-Themen 4
G JDBC Programm und niedrige Java-Versionen Allgemeine Java-Themen 14
M Java Versionen über Skript aktivieren/deaktivieren? Allgemeine Java-Themen 2
ARadauer Java Versionen Übersicht Allgemeine Java-Themen 2
T JDBC: Unterschiede in Interfaces zwischen 2 Java-Versionen. Allgemeine Java-Themen 6
C Auswahl einer Version, bei mehreren installierten Versionen Allgemeine Java-Themen 3
T Installierte JRE Versionen Allgemeine Java-Themen 4
B Mehrere Versionen auf einem Rechner Allgemeine Java-Themen 2
M Erweiterungen in späteren Java-Versionen Allgemeine Java-Themen 26
S Probleme mit Java Versionen und Commapi Allgemeine Java-Themen 2
F Mehrere Versionen von Java auf einem W2K Desktop Allgemeine Java-Themen 3
U Transparent Buttons - unterschiedliche Java-Versionen Allgemeine Java-Themen 8
D Die Versionen Standard, Enterprise und Micro Allgemeine Java-Themen 3
D Windows-Versionen und Befehlsinterpreter Allgemeine Java-Themen 5
O regulärer Ausdruck zum durchsuchen eines Strings verwenden Allgemeine Java-Themen 2
T Rotationswinkel eines Bildes bestimmen Allgemeine Java-Themen 4
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
M Array Rang eines Elements Allgemeine Java-Themen 4
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
H Auslesen eines (LDAP-)Attributs in Active Directory Allgemeine Java-Themen 2
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
H Textposition eines gedrehten Textes verschieben Allgemeine Java-Themen 8
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
E Ersetzen eines Bildes in der Kopfzeile eines Word-Docx-Dokuments mit Apache POI XWPF Allgemeine Java-Themen 0
N Fahrtrichtung eines selbstfahrenden Auto ändern Allgemeine Java-Themen 3
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
kodela Breite eines erweiterten Monitors feststellen Allgemeine Java-Themen 5
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
Zrebna Alternative Darstellung eines Codesnippets Allgemeine Java-Themen 33
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
bueseb84 Wget mit Wildcards - oder wie lädt man bei JFrog die letzte Version eines Artifacts herunter Allgemeine Java-Themen 3
N Erkennen eines Programs Allgemeine Java-Themen 2
N Pausieren eines Programmes Allgemeine Java-Themen 4
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
N Eigenschaften eines Buttons per Setter verändern Allgemeine Java-Themen 5
S Ausfuehrung eines Programms aufzeichnen..? Allgemeine Java-Themen 4
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben