Refactoring mit dynamisch typisierter Sprache

9

Okay, ich versuche hier nicht, einen Flammenkrieg zu beginnen, und ich weiß, dass der Streit zwischen statischen und dynamischen Sprachen schon viele Male ausgehebelt wurde, auch hier. Aber ich habe eine sehr praktische Frage, die hoffentlich jemand hier beleuchten kann. Sorry für die Länge, aber das ist keine einfache Frage mit wahrscheinlich keine einfache Antwort.

Ruby, PHP und Javascript sind heutzutage ziemlich populäre Sprachen, und sie haben eine Menge Leute, die sie verteidigen und argumentieren, dass die dynamische Eingabe den Entwickler nicht zurückhält. Ich bin neu in diesen Sprachen und möchte sie für größere Projekte verwenden, aber hier ist ein grundlegendes Refactoring-Szenario, das die ganze Zeit bei der Arbeit auftaucht (work == C #), und ich frage mich, wie der Ansatz aussehen würde Ruby - Ich habe Ruby gewählt, weil es OO ist.

Ok, ich benutze Ruby und erstelle ein Kundenobjekt. Es hat Methoden zum Laden / Speichern / Löschen von der Datenbank. Es ist gut und die Leute benutzen es. Ich füge mehr Methoden für andere Dinge hinzu und die Leute benutzen es mehr. Ich füge eine Methode zur Berechnung der Bestellhistorie basierend auf einigen Parametern hinzu. Mittlerweile wird diese Klasse im gesamten System verwendet. Dann entscheide ich eines Tages, die Parameter der GetOrderHistory-Methode zu ändern. Also ich:

  • fügen Sie der Methode
  • die neuen Parameter hinzu
  • Schreiben Sie den Code der Methode neu, um die neuen Parameter zu verwenden
  • ändere den Client-Code, den ich im Hinterkopf hatte, um die neuen Parameter zu übergeben und benutze diese modifizierte Methode

Aber was nun? Ich habe dutzende / hunderte / whoknows, wie viele andere Stellen im System geändert werden müssen. Wie würde ich in einer dynamischen OO-Sprache wie Ruby oder Javascript vorgehen?

In meinem Kopf, ohne Ruby sehr gut zu kennen, kann ich mir zwei dumme Antworten vorstellen:

  1. 100% Codeabdeckung. Ich teste die gesamte App und jedes Mal, wenn sie bricht, sehe ich, ob es diese Methode ist und behebe sie.
  2. Suchen und Ersetzen. Ich benutze die Textsuche, um nach dieser Methode zu suchen. Aber ich könnte andere Objekte mit denselben Methodennamen haben.

Also gibt es eine gute Antwort darauf? Es scheint, dass die IDE es schwer haben würde. Wenn ich Code wie

hätte %Vor%

es wäre in der Lage, es herauszufinden, aber was ist, wenn es

ist %Vor%

Was würden Sie in diesem Fall von Ruby-Experten erwarten?

    
LoveMeSomeCode 12.08.2010, 13:33
quelle

2 Antworten

3

Eines der starken Argumente, die Sie hören werden, ist, dass Sie Tests vorher schreiben sollten. Dies würde Ihnen theoretisch genau zeigen, wo sich die App ändern muss, falls sich etwas anderes ändert.

Aber das ist nur die Spitze des Eisbergs. Ruby ist mit bestimmten Richtlinien konzipiert, wie kurze, ausdrucksstarke Funktionen, Aufteilung der Verantwortlichkeiten in Modulen, Nichtwiederholung des Codes (DRY), das Prinzip der geringsten Überraschung, etc .; plus eine Reihe von empfohlenen Praktiken, wie Testen zuerst, Übergabe von Parametern als Hash-Optionen, mit kluger Metaprogrammierung, etc. Ich bin sicher, dass andere dynamische Sprachen dies auch tun.

Wenn c kein Kunde ist, dann würde ich zumindest erwarten, zu handeln . IDEs könnten nach Duck-Typisierung suchen, was flexibler ist, als nach einer Instanz einer bestimmten Klasse zu suchen.

Einige IDEs (zumindest Rubymine) schauen sich auch Konventionen an. Beispielsweise geht Rubymine in Rails-Anwendungen in die Schemadatei und fügt die Modelleigenschaften in der Datenbank als Methoden hinzu. Es erkennt auch die Assoziationen (has_many, gehört_to, etc.) und fügt dynamisch die entsprechenden Methoden hinzu, die Rails unter der Haube generiert.

Das reduziert die Notwendigkeit eines Refactorings erheblich, zumindest auf ein Minimum. Aber sicherlich löst es nicht . Und ich denke nicht, dass es gelöst werden kann.

    
Chubas 12.08.2010, 15:31
quelle
1

Dies wird wahrscheinlich nicht die beste Antwort auf Ihre Frage sein, aber ich neige dazu, Methoden zu entwerfen, um einen Hash zu akzeptieren, um zukünftige Änderungen abzudecken.

Beispiel:

%Vor%

Ich denke, viele fortgeschrittene Ruby-Leute würden versuchen, eine Art Metaprogrammierungsmuster zu implementieren.

Andere Optionen können das Überfahren der Methode in einer Unterklasse zum Ausführen der gewünschten Funktionalität umfassen.

Oder, wie wäre es mit ...

%Vor%     
Brian 12.08.2010 14:16
quelle

Tags und Links