Hi,
ich versuche mir gerade ein wenig Schreibarbeit zu ersparen, damit den Code zu verkleinern und am Ende des Tages den Wartungsaufwand zu minimieren.
Also, ich habe eine Maske, auf der man nach Datensätzen suchen kann. Dazu wählt man erst den Typ Datensatz aus (also die tatsächliche Entität/Klasse) und dann die Suchfelder.
Dazu brauchen die Klassen aber ein Interface -> SearchableEntity.
Hier müssen Funktionen zur Verfügung stehen, damit der SuchHandler mit allen Klassen kommunizieren kann. Soweit, so Standard.
Hier mal das Interface:
Eine Methode, wie getEntityStates muss ich überschreiben, weil das ist meiner Meinung nach zu kompliziert, um es der Maschine in generell zu erklären. Aber z.B. die Methoden getPossibleResultFields und getUserResultFields sehen in der Implementierung immer gleich aus:
Es dreht sich immer um, in dem Fall, zwei Konstanten in der Klasse. War für mich einfacher, so konnte ich die Funktionen einfach aus einer anderen Implementierung kopieren und muss immer nur die Konstanten anpassen.
Jetzt begab es sich aber, dass ich im Laufe der Entwicklung schwächen an den Methoden gefunden hatte, also musste ich jetzt jede Implementierung öffnen, um die Methode an zu passen.
Gibt es da keine elegantere Möglichkeit?
Irgendwie glaube ich, dass ich gerade in einer Box sitze und nicht sehe, welche Alternative es gibt.
ich versuche mir gerade ein wenig Schreibarbeit zu ersparen, damit den Code zu verkleinern und am Ende des Tages den Wartungsaufwand zu minimieren.
Also, ich habe eine Maske, auf der man nach Datensätzen suchen kann. Dazu wählt man erst den Typ Datensatz aus (also die tatsächliche Entität/Klasse) und dann die Suchfelder.
Dazu brauchen die Klassen aber ein Interface -> SearchableEntity.
Hier müssen Funktionen zur Verfügung stehen, damit der SuchHandler mit allen Klassen kommunizieren kann. Soweit, so Standard.
Hier mal das Interface:
Java:
public interface SearchableEntityFactoryInterface {
String getEntityDisplayName();
List<SearchableEntity> searchEntity(List<SearchTerm> searchTerms);
List<String> getAvailableSearchFields();
List<SearchResultField> getDefaultResultFields();
List<String> getDefaultResultFieldsString();
List<SearchResultField> getResultFields();
List<SelectItem> getEntityStates();
List<String> getPossibleResultFields();
List<String> getUserResultFields();
void saveRecord(SearchableEntity entity);
void createRecord(SearchableEntity entity);
void saveColumnOrder(List<String> pickedStrings);
SearchableEntity newRecord();
}
Eine Methode, wie getEntityStates muss ich überschreiben, weil das ist meiner Meinung nach zu kompliziert, um es der Maschine in generell zu erklären. Aber z.B. die Methoden getPossibleResultFields und getUserResultFields sehen in der Implementierung immer gleich aus:
Java:
@Override
public List<String> getPossibleResultFields() {
List<String> possibleResultFieldsString = new ArrayList<>();
possibleResultFieldsString = POSSIBLE_RESULT_FIELDS.stream().map(SearchResultField::getDisplayName).collect(Collectors.toList());
return possibleResultFieldsString;
}
@Override
public List<String> getUserResultFields() {
String user = session.getUser().getUserName();
List<String> userResultList = userParameterInterface.getProIpsColumnOrder(user, USER_TABLE_ENTITY_STRING);
if(userResultList != null) {
List<SearchResultField> userSearchResultFields = SearchResultField.getSearchResultFieldListByString(userResultList, POSSIBLE_RESULT_FIELDS);
return userSearchResultFields.stream().map(SearchResultField::getDisplayName).collect(Collectors.toList());
}
return null;
}
Jetzt begab es sich aber, dass ich im Laufe der Entwicklung schwächen an den Methoden gefunden hatte, also musste ich jetzt jede Implementierung öffnen, um die Methode an zu passen.
Gibt es da keine elegantere Möglichkeit?
Irgendwie glaube ich, dass ich gerade in einer Box sitze und nicht sehe, welche Alternative es gibt.