Was ist der beste Weg, um gegen eine erwartete Typänderung zu programmieren. Angenommen, ich muss Joda DateTime anstelle von Java Date in Zukunft verwenden. Da Java kein anti-Muster wie typedef fördert, ist dies der beste Weg, um ein einfaches Refactoring in der Zukunft sicherzustellen.
danke.Java-Muster für zukünftigen Typwechsel
Antwort
Sicherlich das "Single-Responsibility-Prinzip" oder etwas in der Nähe und Kapselung sollte dazu beitragen, Abhängigkeit Kriechen zu begrenzen.
Die Wahl der Grundtypen ist jedoch eine architektonische Entscheidung. Wenn Sie String- oder Integertypen ändern würden, würden Sie eine Änderung in Ihrem Code erwarten. Das Datum ist nicht viel anders.
Die Programmierung von Schnittstellen und die richtige Layering ist die beste Abwehrmaßnahme, die ich mir vorstellen kann.
Wenn Sie trennen, was getan wird und wie es gemacht wird, lassen Sie sich die Möglichkeit, Implementierungen zu ändern, ohne die Clients zu beeinflussen, solange die Schnittstelle unverändert ist.
Wenn Sie die Schnittstelle ändern müssen oder wenn Sie ein neues Problem haben, sind alle Wetten deaktiviert. Keine Sprache hat eingebaute Hellsichtigkeit.
Umhüllen Sie den API/Typ in Frage hinter einem wrapper interface, und verwenden Sie es nur durch den Wrapper. Dann müssen Sie nur den Wrapper-Code ändern, um die Implementierung zu wechseln.
Dies wäre die allgemeine Lösung. Allerdings hat Tom recht, wenn er darauf hinweist, dass Date so fundamental ist, dass es eine architektonische Entscheidung sein sollte und nicht oft geändert werden sollte.
Würde der Downvoter eine Erklärung geben? –
Sound zu mir, wie Sie "dynamische Neueinstufung" erreichen wollen,
Ich denke, Sie sollten dies mit der State pattern erreichen können.
Bitte ein Beispiel überprüfen hier: http://cnx.org/content/m17225/latest/
Sie könnten IAdaptable
Mein nehmen versuchen Eclipse dazu ist, dass eine gute Java IDE drastisch den Schmerz einer großen Änderung von Datentypen reduzieren. Sie suchen nach Punkten, an denen Ihr Code die alte Klasse verwendet, ersetzen Sie sie durch die neue Klasse, und beheben Sie die folgenden Kompilierungsfehler, und wiederholen Sie den Vorgang. Wenn Sie mit den Änderungen fertig sind, führen Sie Ihre Einheits-/Regressionstests durch, beheben Sie die Fehler und (berühren Sie Holz!) Sie sind fertig.
OK ... es kann nicht so einfach sein. Insbesondere:
- Reflektierende Abhängigkeiten können schwer zu finden sein.
- Abhängigkeiten in der externen Verdrahtung/Konfigurationsdatei können schwierig zu finden sein.
- Eine groß angelegte Anwendung, die aus Komponenten besteht, die von vielen Leuten geschrieben/verwaltet werden, kann problematisch sein. (Sie können nicht wirklich hacken nur auf jeden elses Code.)
Was ist der beste Weg gegen eine erwartete Typänderung zu programmieren.
Halten Sie Ihr Design so einfach und sauber wie möglich, und halten Sie eine gute Suite von Komponententests.
Dies hilft Ihnen mit alle zukünftige Änderungen, einschließlich unerwarteter (die viel häufiger sind).
stimme zu, aber ich war nicht das generische, sondern spezifisch für "Typ" Änderungen. – bsr
@bsreekanth: die generische Antwort gilt immer noch. Viel mehr als die anderen Antworten, IMO. Für das Beispiel, das Sie geben, würde jede Art von Wrapping oder Layering, die versuchen, die Änderung zu antizipieren, mehr Arbeit erfordern (und mehr Bugs einführen), als einfach die Änderung durchzuführen. –
- 1. Import alle zukünftigen Features
- 2. ExtJS4- Datumsauswahl für Jahr und Monat - alle zukünftigen Daten deaktivieren
- 3. Data Warehouse: Modellierung eines zukünftigen Zeitplans
- 4. Guter Designmechanismus, um Klasseninterna zukünftigen Prädikatfunktionen auszusetzen?
- 5. Berechnen des zukünftigen Zustands bei hypothetischer Aktion
- 6. Kerndaten in zukünftigen App-Versionen verwalten
- 7. Vorhersage von zukünftigen Werten mit polynomieller Regression in R
- 8. Algolia instantsearch.js - Liste der vergangenen und zukünftigen Einträge auf 'heute'
- 9. Berechne den zukünftigen Wert mit Zinseszinsen mit JavaScript
- 10. Wie wird die Ausführung der zukünftigen Sequenz trotz Fehler fortgesetzt?
- 11. Warum ist globaler ExecutionContext kein Standardparameter im zukünftigen Block?
- 12. Wie kann ich im __await__ des zukünftigen Objekts warten?
- 13. Warum bricht das Aufrufen von close() auf einem InitialContext JNDI für alle zukünftigen Lookups (Glassfish)?
- 14. #warning: C-style für Anweisung ist veraltet und wird in einer zukünftigen Version von Swift entfernt
- 15. Erstellen von benutzerdefinierten Bibliotheken permanent für alle zukünftigen Projekte in VS2015
- 16. Wie legen Sie eine Eigenschaft einer UIKit-Klasse oder -Unterklasse für alle zukünftigen Instantianer fest?
- 17. Force Git, um ein Verzeichnis und alle vorhandenen und zukünftigen Dateien innerhalb
- 18. Uhr Skew und Modifikationszeit in zukünftigen Ausgabe in Qt App Gebäude
- 19. ELK Löschen von Indizes, die mit einem zukünftigen Datum erstellt wurden
- 20. Wie setze ich Haltepunkte in zukünftigen gemeinsam genutzten Bibliotheken mit einem Befehlsflag
- 21. Wie kann ich mit meinem Programm die zukünftigen Werte korrekt ausführen?
- 22. Warum lädt nHibernate die Ergebnisse einer zukünftigen Abfrage nicht und ignoriert sie?
- 23. Wie erhalten Sie ein Objekt, das einem zukünftigen Akteur zugeordnet ist?
- 24. Ermitteln der Größe einer zukünftigen Datei, während sich die Daten noch im Speicher befinden
- 25. On * nix gibt es eine Möglichkeit, einen Prozess zu einem zukünftigen Zeitpunkt zu starten?
- 26. Wie kann das boost :: promise-Objekt wiederverwendet werden, nachdem es seinen zukünftigen Wert erhalten hat?
- 27. Wie fügt man allen aktuellen und zukünftigen Elementen das jQuery-Ereignis hinzu?
- 28. Warum dict.pop() in Schleife entfernt Schlüssel aus Diktat in zukünftigen Schleife Iteration erstellt?
- 29. Quellwert 1.5 ist veraltet und wird in einer zukünftigen Version entfernt
- 30. Recurrence Library für Datumsberechnungen für .Net
Die Parametrierung kann Ihnen helfen. Java Generics erleichtert dies. –