• Wir präsentieren Dir heute ein Stellenangebot für einen Java Entwickler - m/w/d in Augsburg, München, Stuttgart oder Bamberg. Hier geht es zur Jobanzeige

Meinung zum verwendeten Design Pattern

J

jCoder1984

Aktives Mitglied
Hallo in die Runde.
Ich habe heute keine konkrete Frage, sondern möchte gerne eure Meinung hören. Ich bin dabei ein kleines Programm zu schreiben, was eine CSV Datei mit Sportergebnissen einliest und daraus Objekte baut - zum Beispiel Season, Competition, Match, Team usw.

Hier mal beispielhaft ein paar Zeilen Code :
Competition Object:
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@EqualsAndHashCode
@ToString
@Entity
public class Competition implements IModelObject {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @EqualsAndHashCode.Exclude
    private Integer id;


    @Getter
    private String name;

    @ManyToOne(fetch = FetchType.EAGER)
    @EqualsAndHashCode.Exclude
    private Season season;

    /**
     * constructor
     *
     * @param name   the competition name
     * @param season the season reference
     */
    protected Competition(@NonNull String name, Season season) {
        this.name = name;
        this.season = season;
    }

    public Optional<Season> getSeason() {
        return Optional.ofNullable(season);
    }
}
Hier der Competition Builder ::
public class CommonCompetitionBuilder extends CompetitionBuilder {

    private static final Logger logger = LogManager.getLogger(CommonCompetitionBuilder.class);

    @Override
    public boolean validateData() {
        boolean validationResult = true;

        // check required parameter
        if (name == null || name.isEmpty()) {
            logger.error("the competition name is required and can't be empty or NULL");
            validationResult = false;
        }

        // check optional parameter
        if (season == null) {
            logger.warn("the season object is NULL and will be ignored ");
        }

        return validationResult;
    }
}

Hier die factory:
@Service
public class CommonModelFactoryService extends ModelFactoryService {

    @Autowired
    @Override
    public void init() {
        associationBuilder = new CommonAssociationBuilder();
        seasonBuilder = new CommonSeasonBuilder();
        competitionBuilder = new CommonCompetitionBuilder();
...
    }
}

Einstiegspunkt ist eine weitere Klasse - Importer. Der Importer liest eine CSV Datei und erzeugt daraus ImportedData und reicht diese an die factory weiter :

CSV importer:
public class CSVImporter implements IImporter {

    private static final Logger logger = LogManager.getLogger(CSVImporter.class);
...


    @Autowired
    ModelFactoryService modelFactoryService;

    @NonNull
    private final Path csvFilePath;
    private final String associationName;

    /**
     * @param csvFilePath     - the path to the csv file
     * @param associationName - the association name
     */
    public CSVImporter(Path csvFilePath, String associationName) {
        this.csvFilePath = csvFilePath;
        this.associationName = associationName;
    }

    @Override
    public List<IImportedData> importData() {
        logger.info("import csv file {}", csvFilePath.getFileName());
        ...


Ich hoffe damit ist so in etwas klar was ich vorhabe. Funktional ist alles super.

Aber meine Bedenken :

Wenn ich die Daten können nicht nur aus einer SCV Datei kommen sondern auch aus einer anderen Schnittstelle oder sollen später auch vom User eingegeben wernden können. Die vewendetetn Builder in der Model Factory validieren ja die Daten und ertsellen daraus dann entweder ein "ModelObject" oder eben nicht.

Das funktionert auch schon. Meine Frage ist aber ob dies so in Ordnung ist oder wo es Stellschrauben gibt etwas besser zu machen.

Vielen lieben Dank für die hinweise
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Naja, allzu viel kann man bei den knappen Ausschnitten nicht sagen, aber zu dem was man sieht sag ich mal was. Aber mehr als so "formale" Dinge kann man da nicht beurteilen :)

  • IModelObject
  • CommonModelFactoryService
  • ModelFactoryService
Das sind schon mit die schlimmsten Namen, die ich mir vorstellen kann :)


Was soll CommonCompetitionBuilder machen, baut der eine Spezialisierung von Competition, die der normale CompetitionBuilder nicht bauen kann? Builder in Verbindung mit Vererbung können recht schwierig und umständlich sein, da das ganze zu sehe wäre interessant.

validateData darin würde ich persönlich weg lassen. Der Builder kann einfach direkt dafür sorgen, dass nur valide Daten zulässig sind. Der kann zB erzwingen, dass ein Name gesetzt wird, und dabei oder beim Bauen dann eine Exception werfen. Eine extra validate-Methode macht das oft nur umständlicher, vor allem weil man dann immer dran denken muss, die auch zu benutzen.


Was soll CommonModelFactoryService machen? Das, was man dort sieht, ist eigentlich nur Unsinn.

Wenn die Klasse Beans der anderen Typen bereitstellen soll, gibt es dafür bessere Wege (zB Configuration mit @Bean-Methoden), aber eine Autowired Methode ohne Parameter, die Instanzvariablen setzt, ist eher sehr schlechte Praxis.


CSVImporter sieht zumindest komisch aus, da Objekte wohl "per Hand" erzeugt werden sollen, aber Spring gleichzeitig auch noch Felder injecten soll. Sowohl die Fieldinjection als auch die Mischung von Spring und "per Hand" ist nicht wirklich gut, und führt auf lange Sicht potentiell nur zu Problemen.


Java:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@EqualsAndHashCode.Exclude
private Integer id;
Das ist etwas, was man vermeiden sollte – damit gibt es auf Datenbank- und auf Applikationsebenen zwei unterschiedliche Definitionen für "gleich". Im Idealfall verwendet man für Entitäten immer nur die ID für Gleichheit, und ignoriert alle anderen Felder.
 
J

jCoder1984

Aktives Mitglied
Das ist etwas, was man vermeiden sollte – damit gibt es auf Datenbank- und auf Applikationsebenen zwei unterschiedliche Definitionen für "gleich". Im Idealfall verwendet man für Entitäten immer nur die ID für Gleichheit, und ignoriert alle anderen Felder.
Danke für deine Antwort. Ich werde versuchen etwas zu ändern.

Eine Frage habe ich noch :
Bezüglich der Entitäten. Es soll zu Beginn alle Objekte aus der Datenbank gelesen. Der Importer erzeugt dann beim Parsen der CSV Datei neue Objekte sofern sie noch nicht existieren und diese "neuen" Objekte werden dann in der Datenbank gespeichert.
Somit kann ich sicherstellen, dass jedes Objekt nur einmal vorhanden ist.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Bezüglich der Entitäten. Es soll zu Beginn alle Objekte aus der Datenbank gelesen. Der Importer erzeugt dann beim Parsen der CSV Datei neue Objekte sofern sie noch nicht existieren und diese "neuen" Objekte werden dann in der Datenbank gespeichert.
Somit kann ich sicherstellen, dass jedes Objekt nur einmal vorhanden ist.
Ich hab gar keinen Zweifel daran, dass du in deiner Applikation aktuell sicherstellst, dass es keine zwei Teams mit dem gleichen Namen gibt :)

Aber das Grundproblem existiert trotzdem: Für Competition gibt es zwei verschiedene Arten von "Gleichheit", das mag aktuell keine Probleme verursachen, aber das Potentiell für große Probleme ist vorhanden – bei gleichzeitig minimalem Aufwand für eine Änderung.
 
J

jCoder1984

Aktives Mitglied
Okay auch dir vielen lieben Dank für dein Antwort.

Aber wie würde man es denn besser machen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F.S.WhiTeY Designfrage bzw. Meinung zur Umsetzung Allgemeine Java-Themen 39
J Eure Meinung: Threads verwenden, oder nicht? Allgemeine Java-Themen 6
thetagman Programmidee: VirtualCorkboard - Evaluation, Nutzen & Meinung Allgemeine Java-Themen 12
Eldorado Meinung zu einem abgewandelten MVC-Pattern Allgemeine Java-Themen 2
S Meinung zu Programmidee gesucht Allgemeine Java-Themen 9
J Eure Meinung - Das JMF (Java Media Framework) Allgemeine Java-Themen 3
K Design: Klassen in Pakete aufteilen - Eure Meinung Allgemeine Java-Themen 8
L Softwarepatente - Eure Meinung Allgemeine Java-Themen 4
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
S ArrayList Design Allgemeine Java-Themen 4
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
C WindowBuilder Design funktioniert nicht Allgemeine Java-Themen 0
M Diverse Design-Fragen Allgemeine Java-Themen 6
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
T OOP Fehler im Design Allgemeine Java-Themen 9
perlenfischer1984 Welches Design Pattern ist geegneit. Allgemeine Java-Themen 7
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
R Parameter Adapter - Design Allgemeine Java-Themen 1
D Bezüglich Design meines Codes Allgemeine Java-Themen 1
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
S Java Design Frage Allgemeine Java-Themen 10
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
M OOP Design Frage Allgemeine Java-Themen 2
J Domain Driven Design - Modellierungsfrage Allgemeine Java-Themen 3
F Welches Design Pattern? Allgemeine Java-Themen 3
H MVC Design Allgemeine Java-Themen 9
J Swing Eigenes Button-design Allgemeine Java-Themen 2
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
Z Design um boolsche ausdrücke zu speichern & auszuwerten Allgemeine Java-Themen 3
A Sinnvolles Software Design bei Eigenschaftsänderungen von Objekten Allgemeine Java-Themen 7
C Gutes Code Design (3 Schichten Modell) Allgemeine Java-Themen 19
D Design Stations-Gitter Allgemeine Java-Themen 4
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
D [Drag&Drop] Design-Pattern-Frage Allgemeine Java-Themen 4
G Design Patterns für Programm Allgemeine Java-Themen 3
I Wie populär ist Design by Contract in Java und was haltet ihr davon? Allgemeine Java-Themen 5
Landei Design-Problem Formel-Parser Allgemeine Java-Themen 10
J Aktionen im State-Design-Modell Allgemeine Java-Themen 3
S Design Oberfläche Allgemeine Java-Themen 2
L Design-Frage: Platzierung der Save-Methode Allgemeine Java-Themen 3
G Domain Driven Design Model Allgemeine Java-Themen 14
G konkretes Domain Driven Design Aggregate Allgemeine Java-Themen 2
jmar83 welches design pattern? frage an die oo-experten unter euch... Allgemeine Java-Themen 3
G Accordion Design Pattern Frage Allgemeine Java-Themen 2
hdi Hilfe beim Design (Stichwort OO, Pattern, ...) Allgemeine Java-Themen 11
B Design Problem Allgemeine Java-Themen 8
faulelotte Verständnisproblem Domain Driven Design Allgemeine Java-Themen 3
S Frage zum Design der Datenstruktur Allgemeine Java-Themen 10
D design gesucht - Angabe von zu ersetzenden substrings Allgemeine Java-Themen 2
D Design ohne Getter und Setter Allgemeine Java-Themen 8
D Design: on-the-fly-Parsing + Datenstrukturen Allgemeine Java-Themen 5
N Welches design pattern? Allgemeine Java-Themen 8
D design client server Allgemeine Java-Themen 10
T Design-Frage Allgemeine Java-Themen 14
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
S JToolBar Design Allgemeine Java-Themen 3
M Bildersyncronisierung - Design Patterns? Allgemeine Java-Themen 2
T Design - Exception in Thread Allgemeine Java-Themen 3
G Composite, Design Pattern, printTree Allgemeine Java-Themen 42
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
M Frage zum Design :: allgemein Allgemeine Java-Themen 6
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
U Frage zu DB Design Allgemeine Java-Themen 3
K Design / Implementierung Allgemeine Java-Themen 5
N Checkstyle - Design for Extension Allgemeine Java-Themen 4
F Design Pattern zur Realisierung von Mehrfachvererbung? Allgemeine Java-Themen 8
E Was ist ein gutes Design fuer meine Programm? Allgemeine Java-Themen 3
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
P Apple Design Allgemeine Java-Themen 5
S design frage Allgemeine Java-Themen 10
T Design-Tipp gesucht Allgemeine Java-Themen 2
M Design von Java Klassen Allgemeine Java-Themen 2
G java design von klassen und projekten Allgemeine Java-Themen 6
S Programmierstil / design Allgemeine Java-Themen 9
S Exception design Allgemeine Java-Themen 2
m@nu Exception-Design Allgemeine Java-Themen 4
R Design-Frage Allgemeine Java-Themen 9
N Hilfe beim Design Allgemeine Java-Themen 13
D Design Pattern: Singleton Allgemeine Java-Themen 4
Torres Design-Problem mit Jakarta Struts Allgemeine Java-Themen 2
A Anwendungs-Design (Plugin-Architektur) Allgemeine Java-Themen 4

Ähnliche Java Themen

Anzeige

Neue Themen


Oben