Wenn Sie Ihren Code betrachten, sind diese beiden Blöcke sehr ähnlich. Ich wette, dass sie in einen einzigen Block umgestaltet werden können.
Obwohl das nicht wie eine Antwort klingt, ist es. Ich denke im Allgemeinen, wenn Sie den Wunsch verspüren, Zahnspangen wie diese zu verwenden, haben Sie es mit einer Situation zu tun, die besser gehandhabt werden könnte, indem eine andere Methode ausgespart wird oder Stücke zusammen umgeformt werden.
Im Allgemeinen sowieso.
Spezifische Antwort - nein, sobald ich gut in OO und Begrenzung, wie viel Arbeit ich in einer einzigen Einheit, habe ich nie gedacht, dass sie eine gute Idee sein könnten.
Edit: Mit Code, der ähnlich ist, muss es ziemlich leicht refactorable sein. Ich werde einen Refactor versuchen. Tut mir leid, wenn ich die Syntax falsch verstehe, ich tue wirklich nicht C# und Java hat keine Schließungen.
output = transform(FooSource, TransformA);
output = transform(BarSource, TransformB); // I know output is overwritten, but
// it is in the askers' example as well
transform(var itmSource, var transform) {
var output=source.GetRawOutput(); // Sorry, you never said where source came from.
var items = itmSource.GetItems();
output=transform.TransformOutput(output, p =>
{
GetContent(p, items.GetNext()); // GetContent may need to be passed in
// you didn't say where those calls came from.
// See comments below
});
}
return output;
}
refactors wie diese nicht viel Schreibarbeit ersparen, aber sie zeigen einige große Muster auf - wie die Beziehung zwischen FooSource und Transforma (und möglicherweise der getContent Anruf) - gibt es eine gute Chance, dass sie sollte in einem einzigen Objekt gespeichert werden und dieses Objekt sollte übergeben werden, oder etwas ähnliches. (Es ist schwer von diesem Fragment zu unterscheiden, erfordert oft Refactoring eine viel breitere Sicht auf den Code als Sie gaben)
Beachten Sie, dass sie auch zwingen, über GetFooContent und GetBarContent nachzudenken. Ich wette, dass Sie ein Bier trinken, dass diese so ähnlich sind, dass sie entweder in einen einzigen Methodenaufruf mit einer Variablen oder zwei oder in eine Methode in zwei Geschwisterklassen integriert werden können.
Aufgrund der Art, wie diese Art von Beziehung immer auftaucht und verbessert IMMER anderen Code in Ihren Klassen, glaube ich, dass diese Art von Refactors absolut obligatorisch sind, diese Art von Refactoring mehr als alles lehrte mich echte OO.
Danke für die Antwort, Bill. Zufällig stellt der "echte" Code eine größere Herausforderung für das Refactoring dar als mein Beispielcode. Es könnte mit ziemlicher Sicherheit weiter berücksichtigt werden, aber ich bin nicht davon überzeugt, dass es den Kosten-Nutzen-Test besteht. –
Ich habe meinen Beispielcode aktualisiert, um ihn der Struktur des echten Codes näher zu bringen. –
Sie können Code, der refactoring benötigt, fast immer durch Schielen identifizieren, bis Sie die Buchstaben nicht mehr lesen können und schauen, ob Sie wiederholt visuelle Muster sehen. Ich wünschte, ich wäre besser in C# -Syntax, könnte jemand das für Sie in eine einzige Methode umgestalten, die zweimal aufgerufen wird? –