Ok, ich versuche hier nicht, einen Flammenkrieg zu starten, und ich weiß, dass der Streit zwischen statischen und dynamischen Sprachen viele Male, einschließlich hier, ausgehebelt wurde. 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.Refactoring mit dynamisch typisierter Sprache
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 ich baue 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. So I:
- fügen Sie die neuen Parameter an die Methode
- den Code der Methode umschreiben die neuen Parameter verwenden
- Änderung der Client-Code, den ich im Sinn hatte, um die neuen Parameter zu übergeben und verwenden 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?
Aus der Spitze von meinem Kopf, nicht sehr gut Rubin zu kennen, kann ich von zwei dummen Antworten denkt:
- 100% Deckung-Code. Ich teste die gesamte App und jedes Mal, wenn es bricht, sehe ich, ob es diese Methode ist und es beheben
- 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 als
solchen Code hattec = Customer.new
es wäre in der Lage sein, es herauszufinden, aber was, wenn es
c= SomeFunctionThatProbablyReturnsACustomerButMightReturnOtherThings()
So wie würden Sie Ruby-Experten nehmen in diesem Fall?
Ich bin ziemlich sicher, dass Refactoring bestehende Verträge nicht brechen sollte ... – CurtainDog
@CurtainDog was ist mit dem Umbenennen einer privaten Funktion in einer Bibliothek? – Toskan
ein anderes gutes Beispiel ist Ruby und Python. Darf ich Sie freundlich daran erinnern, dass weder Ruby noch Python bei dem, was Sie gerade gesagt haben, bei der Veröffentlichung neuer Versionen bleiben? – Toskan