Korrektur eines Rechtschreibfehlers in einem Methodennamen

73

Eine der Methoden, die ich üblicherweise in unserer Codebasis verwende, ist falsch geschrieben (und sie hat mich älter gemacht).

Das irritiert mich wirklich, nicht nur, weil es falsch geschrieben ist, sondern, was noch wichtiger ist, dass ich beim ersten Tippen IMMER den Namen falsch schreibe (und dann muss ich mich daran erinnern, dass "Oh, richtig, es sollte falsch geschrieben sein ...")

Ich ändere ein paar Änderungen an der ursprünglichen Methode. Sollte ich die Gelegenheit nutzen, einfach die Freaking-Methode umzubenennen?

Eins zwei drei
quelle
12
Kannst du es umbenennen? Wenn es von Code verwendet wird, den Sie nicht kontrollieren, müssen Sie die Abwärtskompatibilitätsverletzung begründen.
16
* falsch geschrieben. Und Sie müssen es überall ändern, wo diese Methode aufgerufen wird.
JohnP
2
* falsch geschrieben ... oder vielleicht eine andere Schreibweise?
HorusKol
2
@JohnP Es gab Drei, jetzt ist Eins behoben und Zwei sind immer noch falsch. Passt übrigens ganz gut zu OPs Namen. :)
Desillusioniert
3
Wir dürfen nicht zulassen, dass etwas falsch geschrieben wird!
Magus

Antworten:

136

Sollte ich die Gelegenheit nutzen, einfach die Freaking-Methode umzubenennen?

Absolut.

Wenn Ihr Code jedoch als API freigegeben wurde, sollten Sie die falsch geschriebene Methode im Allgemeinen auch belassen und an die korrekt benannte Methode weiterleiten (markieren Sie sie als veraltet, wenn Ihre Sprache solche Dinge unterstützt).

Telastyn
quelle
33
Die Idee, sich der korrekt benannten Methode zuzuwenden, ist einfach und genial. Interessanter Link zur Theorie der kaputten Fenster.
dev_feed
2
Wenn dies Teil einer öffentlichen API ist, handelt es sich möglicherweise nicht um eine abwärtskompatible Änderung (abhängig von der Sprache). Dies ist nicht so unwahrscheinlich, wie es sich anhört. Wenn ich von einer vorhandenen API mit einem falsch geschriebenen Namen erben müsste, würde ich das definitiv beheben.
Voo
10
@voo - wie? In welcher Sprache wäre das Hinzufügen einer neuen Methode (und das Ändern der Implementierung einer Methode, um dasselbe Verhalten zu erzielen) nicht abwärtskompatibel?
Telastyn
3
@Telastyn Es kann manchmal schwierig sein, Methoden hinzuzufügen, um Webdienste auszudrücken. Einige Clients zögern beispielsweise, WSDLs zu ändern, und lehnen es plötzlich ab, mit dem Server zu sprechen. Das ist ein Implementierungsproblem im Client, aber wenn der Client ein wichtiges Problem ist, das Sie nicht verärgern möchten, kann dies sehr gut verhindern, dass Sie Ihre Benutzeroberfläche ändern.
Jwenting
17
@Telastyn Befindet sich der Name der falsch geschriebenen Methode auf einer Schnittstelle (wie im in Delphi / Java / C # verwendeten Schnittstellentyp), führt das Hinzufügen einer korrekt geschriebenen Version des Namens wahrscheinlich dazu, dass alle vorhandenen Implementierungen dieser Schnittstelle nicht mehr funktionieren.
Desillusioniert
52

Es gibt Fälle, in denen Sie solche Refactorings vermeiden sollten:

  1. Wenn die Methode in einer öffentlichen Schnittstelle verwendet wird. Ein kanonisches Beispiel ist die falsche Schreibweise von Referrern in HTTP- Referrern , wobei die falsche Schreibweise beibehalten wird, da eine Änderung der Schreibweise jetzt zu viele Auswirkungen hätte.

  2. Wenn die Codebasis nicht durch Tests abgedeckt ist. Jegliches Refactoring sollte mit getestetem Code durchgeführt werden, um Regressionstests durchführen zu können. Das Refactoring der Codebasis, die nicht getestet wird, ist besonders riskant. Wenn Sie viel Zeit haben, fügen Sie zunächst Tests hinzu. Wenn Sie unter Zeitdruck arbeiten, ist es nicht das Beste, das Risiko einzugehen, dass subtile Fehler auftreten, wenn Sie pünktlich versenden möchten.

  3. Wenn die Methode auf ungewöhnliche Weise verwendet werden könnte , ist es praktisch unmöglich, ihre Verwendung zu finden (durch Strg + F oder durch ein automatisiertes Refactoring-Tool). In C # kann beispielsweise eine Methode über Reflection aufgerufen werden, wodurch das Dialogfeld "Umbenennen" von Visual Studio ineffektiv wird. In JavaScript ist die Funktion inside ebenfalls eval()schwer zu finden. In PHP können variable Variablen Probleme verursachen.

  4. Wenn die Größe des Projekts sehr groß ist und die Methode von anderen Teams verwendet werden könnte. Dies ähnelt dem ersten Punkt, dh die Schnittstelle, die Sie anderen Teams zur Verfügung stellen, kann als öffentliche Schnittstelle betrachtet werden.

  5. Wenn Sie sich mit einem lebenswichtigen Projekt beschäftigen. Es besteht die Möglichkeit, dass die Rechtschreibfehler nicht zu wichtig sind, um ein paar Monate Papierkram zu rechtfertigen, um den Namen der Methode zu ändern und sicherzustellen, dass kein Patient die zehnfache zulässige Bestrahlung erhält, oder dass ein Shuttle die Geschwindigkeit falsch berechnet.

In allen anderen Situationen können Sie die Methode umbenennen.

Arseni Mourzenko
quelle
1
+1 für den Kommentar zu Reflection, es hat mich mehr als einmal gebissen.
DaveShaw
33
Wenn Ihr lebenskritisches Projekt so zerbrechlich ist, dass durch das kleinste Umgestalten wahrscheinlich jemand getötet wird, ist es so zerbrechlich, dass niemand seinem Leben trauen sollte. Wie können Sie sicher sein, dass Ihre neue Funktion oder die optimierte Benutzeroberfläche keine lebensbedrohlichen Fehler verursacht hat, wenn Sie eine Methode nicht einmal umbenennen können?
user2357112
2
Wenn ein geänderter Methodenname mehrere zusätzliche Monate an Papierkram verursacht (anstatt beispielsweise für alle anderen Dinge, die sich zur gleichen Zeit ändern, hauptsächlich Papierkram zu erledigen), ist das Verhältnis von Programmierung zu Papierkram verzerrt Es ist unmöglich, eine wesentliche Verbesserung zu erzielen, ohne das System zu ändern.
user2357112
8
@ user2357112: Ich habe nie gesagt, dass das geringste Refactoring wahrscheinlich jemanden töten wird. Es geht nicht darum, jemanden zu töten, sondern darum, alles zu ermöglichen, um das verbleibende 0,001% -Risiko eines Fehlers zu mindern. Dies erfordert eine formelle Professur. Dies erfordert mehrere Testebenen. Dies erfordert Formalismus. Das verbietet "Ich möchte diese Methode schnell umbenennen, hoffentlich würde es funktionieren!" Verhalten. Lebenskritische Projekte verwenden Techniken, die für jede Geschäftsanwendung als reine Zeit- und Geldverschwendung gelten. Deshalb sind sie so zuverlässig (und teuer).
Arseni Mourzenko
5
@ user2357112: MainMa hat darauf hingewiesen, dass es sich nicht um gelegentliche Geschäftsanwendungen handelt. Es geht um eine spezielle Art von Software, die ausgiebig getestet / verifiziert wird. Was ist, wenn die Methode irgendwo durch Reflektion aufgerufen wird? Was ist, wenn ein Pre- / Post-Compiler etwas damit anfängt? Was ist mit der Dokumentation? Was ist mit anderen Teams, die es verwenden? Verwenden sie Reflexion? Was ist, wenn ... Das wirkliche Leben kann manchmal recht komplex sein. Und manchmal ist es besser, einen Methodennamen unangetastet zu lassen, als auf kugelsichere Weise zu überprüfen, ob Konsequenzen vorliegen.
dagnelies
30

Ich habe das vor ein paar Monaten gemacht (aus verschiedenen Gründen). Die Schritte, die ich unternahm (die Sprache war Perl):

  1. Benennen Sie die Methode um. Verwechseln Sie den alten Namen mit dem neuen Namen (dies sollte keinen Code beschädigen, da die Methode mit beiden Namen aufgerufen werden kann).
  2. Informieren Sie den Rest der Entwickler über die Namensänderung und den Grund und fordern Sie sie auf, ab sofort den neuen Namen zu verwenden.
  3. Durchsuchen Sie die Codebasis nach dem alten Namen, und beheben Sie alle Vorkommen.
  4. Protokollieren Sie alle Verwendungen des alten Namens (die Verwendung des alten Namens sollte zu diesem Zeitpunkt noch funktionieren). Beheben Sie diese Fälle.
  5. Warten Sie (während 4.), bis keine Einträge mehr im Protokoll erscheinen.
  6. Unterbrechen Sie den Alias. Erstellen Sie eine Methode unter Verwendung des alten Namens, die eine schwerwiegende Ausnahme mit einer Meldung zur Namensänderung auslöst.
  7. Entfernen Sie nach einiger Zeit die Methode mit dem alten Namen.

    Natürlich wird Ihr Kilometerstand variieren.

Abigail
quelle
Eine Verbesserung: Verlassen Sie sich nicht auf grep, um Benutzer mit dem alten Namen zu finden. Melden Sie sich auch im Forwarder an.
Ben Voigt
@BenVoigt Ist das nicht was # 4 macht?
Bob
6

Eine gute Möglichkeit, vorhandenen Code nicht zu beschädigen, ist die Verkettung des neuen Methodennamens mit dem alten in einem solchen wie

private void MyNewMethodName()
{
    TheOldMethodName();
}

und markieren Sie dann die alte Methode als veraltet (wenn Ihre Sprache dies unterstützt). Auf diese Weise funktioniert der vorhandene Code weiterhin und Sie können nach und nach alle alten Rechtschreibfehler aus Ihrer Codebasis entfernen. Eventuell können Sie sogar den Methodentext in die neue Methode kopieren / einfügen und die alte löschen.

/ Bearbeiten Wie ivo im Kommentar sagte: Noch besser wäre es, den Code von TheOldMethodNamein die zu verschieben MyNewMethodNameund die neue Methode von der alten aufzurufen. Dies hätte auch den Vorteil, den Entwicklern zu helfen, sich zu orientieren, wo der Code hingehört.

Rémi
quelle
2
Ich stimme Ihrer Methode zu. Ich würde dasselbe tun. Es ist die vernünftigste, klarste und sicherste Methode zum Refactoring. Was auch eine gute Möglichkeit sein könnte, ist, den Code von der alten Methode in die neue Methode zu verschieben und die neue Methode für die alte Methode zu verwenden. Wenn die Codebasis ein paar Iterationen in der Timeline enthält, müssen Sie nur die alte veraltete Methode entfernen.
Ivo Limmen
1
@IvoLimmen Das ist ein wirklich guter Vorschlag. Auf diese Weise können sich die Benutzer mit der neuen Methode noch besser zurechtfinden. Dadurch würde eine Warnung aus dem veralteten Aufruf der alten Methode in der neuen Methode entfernt. Ich werde dies zu meiner Antwort hinzufügen.
Rémi
1

Methode umbenennen:

  • Tun Sie es durch Refactoring, damit Sie mehr Arbeit haben, als Sie wollen
  • Wenn Ihre IDE die automatische Vervollständigung unterstützt, verwenden Sie diese, wenn Sie auf diese Methode verweisen

Das sind zwei Optionen, für die Sie sich entscheiden könnten. Ich bevorzuge die automatische Vervollständigung (z. B. Eclipse IDE) und muss den Methodennamen nicht ausgeben. Umbenennung anstreben; Stellen Sie nur sicher, dass Sie herausfinden, wie diese Methode aufgerufen wird, und ändern Sie die direkten Verweise an den einzelnen Stellen. Refactoring wird Ihr Freund dafür sein, aber seien Sie vorsichtig, wenn Sie dies tun.

Matschig
quelle
0

Ich würde generell ja empfehlen, es umzubenennen.

In anderen Antworten sind gute Gründe aufgeführt, warum Sie die Methode möglicherweise nicht umbenennen möchten. Wenn Sie sich in einer solchen Situation befinden, können Sie eine neue Methode mit dem richtigen Namen und der richtigen Implementierung erstellen und die alte Methode ändern, um die neue Methode aufzurufen . Markieren Sie dann die alte als veraltet, wenn Ihre Sprache dies unterstützt.

Brian
quelle