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 :
[CODE lang="java" title="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);
}
}[/CODE]
[CODE lang="java" title="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;
}
}[/CODE]
[CODE lang="java" title="Hier die factory"]@Service
public class CommonModelFactoryService extends ModelFactoryService {
@Autowired
@Override
public void init() {
associationBuilder = new CommonAssociationBuilder();
seasonBuilder = new CommonSeasonBuilder();
competitionBuilder = new CommonCompetitionBuilder();
...
}
}
[/CODE]
Einstiegspunkt ist eine weitere Klasse - Importer. Der Importer liest eine CSV Datei und erzeugt daraus ImportedData und reicht diese an die factory weiter :
[CODE lang="java" title="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());
...[/CODE]
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
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 :
[CODE lang="java" title="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);
}
}[/CODE]
[CODE lang="java" title="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;
}
}[/CODE]
[CODE lang="java" title="Hier die factory"]@Service
public class CommonModelFactoryService extends ModelFactoryService {
@Autowired
@Override
public void init() {
associationBuilder = new CommonAssociationBuilder();
seasonBuilder = new CommonSeasonBuilder();
competitionBuilder = new CommonCompetitionBuilder();
...
}
}
[/CODE]
Einstiegspunkt ist eine weitere Klasse - Importer. Der Importer liest eine CSV Datei und erzeugt daraus ImportedData und reicht diese an die factory weiter :
[CODE lang="java" title="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());
...[/CODE]
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