ich derzeit Teil eines Projektes ist, wo es eine Schnittstelle ist wie folgt:Refactoring Beratung: Karten POJOs
public interface RepositoryOperation {
public OperationResult execute(Map<RepOpParam, Object> params);
}
Diese Schnittstelle hat etwa ~ 100 Implementierer.
einen Implementierer zu nennen, man folgend tun muss:
final Map<RepOpParam, Object> opParams = new HashMap<RepOpParam, Object>();
opParams.put(ParamName.NAME1, val1);
opParams.put(ParamName.NAME2, val2);
Jetzt denke ich, dass es mit irgendetwas mit einer <Something, Object>
allgemeinen Erklärung ist offensichtlich etwas falsch.
Momentan bewirkt dies, dass ein Aufrufer von OperationImpl
den Code der Operation tatsächlich lesen muss, um zu wissen, wie die Argument-Map erstellt wird. (und das ist nicht einmal das schlimmste Problem, aber ich möchte nicht alle aufzählen, da sie ziemlich offensichtlich sind)
Nach einiger Diskussion gelang es mir, meine Kollegen davon zu überzeugen, mich etwas Refactoring machen zu lassen.
Es scheint mir, dass die einfachste ‚Lösung‘ wie so die Schnittstelle zu ändern wäre:
public interface RepositoryOperation {
public OperationResult execute(OperationParam param);
}
Nach all den konkreten Operationen ihrer eigene OperationParam wird definieren (erweitern) und die benötigten Argumente sichtbar wären für jeden. (Das ist die ‚normale Art und Weise‘ Dinge wie die IMHO zu tun)
So wie ich es, da die Schnittstelle Implementierer sehen recht zahlreich sind habe ich mehrere Möglichkeiten:
Versuchen Sie, die Schnittstelle und Umschreiben zu ändern Alle Operationen rufen auf, um Objekte anstelle von Maps zu verwenden. Dies scheint am saubersten zu sein, aber ich denke, da die Operationen viel sind, könnte es in der Praxis zu viel Arbeit sein. (~ 2 Wochen mit Tests wahrscheinlich)
eine zusätzliche Methode zur Schnittstelle hinzufügen wie folgt:
public interface RepositoryOperation { public OperationResult execute(Map<String, Object> params); public OperationResult execute(OperationParam params); }
und fixieren Sie die Karte Anrufe, wenn ich über sie kommen während Funktionalität Umsetzung.
Lebe damit (bitte nicht!).
Also meine Frage ist.
Wer sieht einen besseren Ansatz zum "Fixieren" der Karten und wenn Sie das tun würden, würden Sie sie mit Methode 1 oder 2 reparieren oder gar nicht reparieren.
EDIT: Danke für die tollen Antworten. Ich würde sowohl Max 'als auch Riduidels Antworten akzeptieren, wenn ich könnte, aber da ich nicht mehr zu Riduidels neigen kann.
Tolle Lösung, danke sehr sehr. Ich werde dies für ein paar Stunden in meinem Kopf "verweilen" lassen :) – Simeon