Unsere Code - Basis ist alter und neue Programmierer, wie ich, schnell zu tun , es zu lernen , wie es gemacht wird aus Gründen der Einheitlichkeit. Da ich dachte, dass wir irgendwo anfangen müssen, habe ich es auf mich genommen, eine Dateninhaberklasse als solche umzugestalten:
- Setter-Methoden entfernt und alle Felder gemacht
final
(ich nehme "final
ist gut" axiomatisch). Die Setter wurden, wie sich herausstellte, nur im Konstruktor verwendet, so dass dies keine Nebenwirkungen hatte. - Builder-Klasse eingeführt
Die Builder-Klasse war erforderlich, da der Konstruktor (was in erster Linie zur Umgestaltung führte) ungefähr 3 Codezeilen umfasst. Es hat viele Parameter.
Wie es der Zufall wollte, arbeitete ein Teamkollege von mir an einem anderen Modul und benötigte die Setter, da die von ihm benötigten Werte an verschiedenen Stellen im Fluss verfügbar wurden. So sah der Code aus:
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
Ich habe argumentiert, dass er stattdessen den Builder verwenden sollte, da durch das Entfernen von Setzern die Felder unveränderlich bleiben (sie haben mich zuvor über die Unveränderlichkeit beschwert) und auch, weil Builder das Erstellen von Objekten als Transaktion zulassen. Ich habe den folgenden Pseudocode entworfen:
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
Wenn diese Ausnahme ausgelöst bar
wird, sind beschädigte Daten vorhanden, die mit einem Builder vermieden worden wären:
public Bar foo(){
Builder builder=new Builder();
try{
builder.setA(a);
//dangerous stuff;
builder.setB(b);
//more dangerous stuff
builder.setC(c);
return builder.build();
}catch(){}
return null;
}
Meine Teamkollegen erwiderten, dass die fragliche Ausnahme niemals ausgelöst wird, was für diesen speziellen Codebereich fair genug ist, aber ich glaube, dass der Wald für den Baum fehlt.
Der Kompromiss bestand darin, zur alten Lösung zurückzukehren, nämlich einen Konstruktor ohne Parameter zu verwenden und alles mit Setzern nach Bedarf festzulegen. Die Begründung war, dass diese Lösung dem KISS-Prinzip folgt, gegen das meine verstößt.
Ich bin neu in dieser Firma (weniger als 6 Monate) und mir völlig bewusst, dass ich diese verloren habe. Die Fragen, die ich habe, sind:
- Gibt es ein anderes Argument für die Verwendung von Buildern anstelle des "alten Wegs"?
- Lohnt sich die von mir vorgeschlagene Änderung überhaupt?
aber wirklich,
- Haben Sie Tipps, wie Sie solche Argumente besser präsentieren können, wenn Sie sich dafür einsetzen, etwas Neues auszuprobieren?
setA
?