Vor kurzem musste ich mich mit dem Thema der Code-Deklaration als veraltet in JavaScript auseinandersetzen. Ich habe das Gefühl, dass diesem Thema weniger Beachtung geschenkt wird, obwohl es in bestimmten Projekten eine Schlüsselrolle spielen kann, insbesondere bei der Arbeit in größeren Teams oder beim Umgang mit externen APIs.
In der JavaScript-Welt kenne ich keine wirklichen Industriestandards für die Deklaration von JavaScript als veraltet. Das kann je nach Team, Bibliothek oder Anbieter unterschiedlich sein.
Deshalb ist es mein Ziel hier, meine Erkenntnisse und Gedanken zu diesem Thema zusammenzufassen, zusammen mit einigen bewährten Praktiken, wenn es darum geht, eine JavaScript-Methode als veraltet zu kennzeichnen.
Was bedeutet "Veraltung" eigentlich?
Zunächst einmal sei klargestellt, dass die Veraltung nur ein Status ist, der auf ein Software-Feature angewendet wird. Sie zeigt an, dass dieses Feature vermieden werden sollte, in der Regel, weil es ersetzt wurde.
Veraltung kann auch bedeuten, dass das Feature in Zukunft entfernt wird. Features werden veraltet – anstatt sofort entfernt zu werden –, um die Abwärtskompatibilität zu gewährleisten und Programmierern, die das Feature verwendet haben, Zeit zu geben, ihren Code an den neuen Standard anzupassen.
Darüber hinaus deutet ein veraltetes Feature darauf hin, dass es von diesem Zeitpunkt an keine weitere Entwicklung mehr geben wird. Es sollte sich nicht anders verhalten als in einer früheren Version (es sei denn, die Dokumentation gibt ausdrücklich etwas anderes an). Im Allgemeinen sollte es also dasselbe sein wie zum Zeitpunkt der Veraltung.
Es kann in der neuesten Version funktionieren oder auch nicht – keine Garantie!
Da es in der JavaScript-Welt jedoch keine wirklichen Industriestandards gibt, die strikt befolgt werden, kann dies je nach Team, Bibliothek oder Anbieter leicht variieren.
Wann Code veraltet deklarieren und wann löschen?
Es ist wichtig zu beachten, dass ein veraltetes Software-Feature oder eine veraltete Methode immer noch Teil der Software ist! Betrachten Sie das Label "veraltet" als reinen Status des Codes. Ob das Software-Feature tatsächlich in Zukunft entfernt wird, hängt von der Entscheidung des jeweiligen Software-Teams ab.
Meiner Meinung nach sollten große Teams oder Projekte, die von externen APIs oder Bibliotheken abhängig sind, zuerst veraltet deklarieren und dann später entfernen (nach angemessener Zeit, wie auch immer Sie das definieren). Geben Sie zumindest mindestens einen Hauptversionssprung an, bevor Sie den veralteten Code tatsächlich entfernen, damit die Benutzer die Möglichkeit haben, sich an die Änderung anzupassen.
Vielleicht möchten Sie sich mit Semantic Versioning befassen, einer einfachen Reihe von Regeln und Anforderungen, die vorgeben, wie Versionsnummern zugewiesen und inkrementiert werden. Bei einer Versionsnummer MAJOR.MINOR.PATCH inkrementieren Sie die MAJOR-Version, wenn Sie inkompatible API-Änderungen vornehmen, die MINOR-Version, wenn Sie Funktionalität auf abwärtskompatible Weise hinzufügen, und die PATCH-Version, wenn Sie abwärtskompatible Fehlerbehebungen vornehmen.
Wenn Ihre Software sich schnell ändert und weiterentwickelt und Sie ein Feature veraltet deklarieren, versuchen Sie, mit Ihrem Projektmanager zu kommunizieren, ob dieses Feature voraussichtlich später wiederbelebt wird. Wenn Sie sich entscheiden, etwas zu veralten anstatt zu löschen, kann es für Sie viel einfacher sein, es rückgängig zu machen, falls Sie es benötigen.
Für kleinere Teams oder Projekte mit internen Methoden und APIs können Sie ruhig zuerst löschen, anstatt zu veralten. Manchmal macht es einfach keinen Sinn, Zeit zu verschwenden, und die Veraltung erhöht nur die Komplexität, nur um Best Practices zu folgen.
Wie kennzeichnet man eine Methode als veraltet
Hier sind fünf bewährte Praktiken, die ich am nützlichsten gefunden habe
- Fügen Sie ein
@deprecatedJSDoc-Flag hinzu. - Erwähnen Sie die Version, in der die Methode veraltet wurde.
- Legen Sie einen Zeitrahmen fest, wann diese Methode gelöscht wird, einschließlich der Version, die sie ersetzen wird. Andernfalls bleibt sie meiner Erfahrung nach für immer 🙂
- Verwenden Sie Kommentare großzügig, um die Implementierung zum Nutzen anderer Entwickler oder Ihres zukünftigen Selbst zu erklären. Dies ist äußerst nützlich, wenn Sie eine Bibliothek schreiben, die andere als Abhängigkeit für ihre Arbeit verwenden.
- Fügen Sie eine Konsolenwarnmeldung hinzu, die darauf hinweist, dass die Funktion veraltet ist.
Hier ist ein praktischeres Beispiel, bei dem ich alle fünf Praktiken anwende
/**
* A magic method that multiples digits.
*
* @deprecated [#1] since version 2.3 [#2].
* [#3] Will be deleted in version 3.0.
* [#4] In case you need similar behavior, implement it on you own,
* preferably in vanilla JavaScript
* or use the multiplyTheSameNumber method instead,
* if the same number needs to be multiplied multiple times, like so:
* multiplyDigits([5, 5, 5]) === multiplyTheSameNumber(5, 3)
*
* @param {array} _digits - digits to multiply
*/
function multiplyDigits(_digits) {
console.warn("Calling a depricated method!"); // [#5]
// ....
}
Um Wiederholungen in den Konsolenwarnungen zu vermeiden oder falls Sie mehrere Methoden veraltet deklarieren und deren Ersetzungen haben, kann es praktischer sein, einen Helfer zu verwenden
/**
* Creating a deprecated / obsolete behavior for methods in a library.
* [Credits]{@link: https://stackoverflow.com/q/21726472/1333836}
*
* @param {function} replacementFunction
* @param {string} oldFnName
* @param {string} newFnName
* @return {function}
*/
const Oboslete = function(replacementFunction, oldFnName, newFnName) {
const wrapper = function() {
console.warn("WARNING! Obsolete function called. Function '" + oldFnName + "' has been deprecated, please use the new '" + newFnName + "' function instead!");
replacementFunction.apply(this, arguments);
}
wrapper.prototype = replacementFunction.prototype;
return wrapper;
}
Zusammenfassung
Ich würde vorschlagen, dass Ihr Team sich einigt und Veraltungspraktiken übernimmt, die für Ihr Projekt oder Ihren Anwendungsfall am sinnvollsten sind, sei es die Übernahme der hier behandelten Praktiken oder anderer.
Beachten Sie, dass es Zeiten gibt, in denen die Löschung sinnvoller ist als die Veraltung. Manchmal lohnt es sich einfach nicht, Aufwand in die Veraltung zu investieren. Wieder einmal liegt es ganz bei Ihnen und dem, was für Ihr Projekt am sinnvollsten ist.
Kennen Sie andere bewährte Praktiken, wenn Sie eine Methode in JavaScript als veraltet kennzeichnen? Lassen Sie es mich in den Kommentaren wissen!
Danksagungen
Die Ideen, die ich hier geteilt habe, wurden von Kommentaren inspiriert, die ich auf Software Engineering Stack Exchange und auf StackOverflow gefunden habe.
Es wäre schön, sicherzustellen, dass die Konsolenwarnung nur einmal ausgegeben wird, wenn die veraltete Funktion mehrmals aufgerufen wird, da sie sonst die Konsole nutzlos überflutet.
Nun, man sollte sich ohnehin nicht auf eine veraltete Funktion verlassen. Daher würde ich sagen, dass die Belästigung durch die Überflutung der Konsole mit Warnungen Sie motivieren kann, das Problem an der Quelle anzugehen. Außerdem können Sie den Filter so einstellen, dass Warnungen ausgeblendet werden, wenn Sie müssen (zumindest in Chrome).
Nützlicher Artikel, aber es wäre vielleicht gut, eine Illustration zu haben, wie man den von Ihnen erstellten Helfer tatsächlich verwendet, da er nicht erklärt wird (ach, und Sie haben sich beim Namen des Helfers vertippt, es sollte Obsolete heißen).
Nur eine Randbemerkung: Wenn die Version 0.x.x ist, ist keine Veraltung erforderlich, da diese Version noch keine stabile API hat, sodass die Methode einfach entfernt werden kann.
Einiges davon hängt davon ab, wer Ihre Benutzer sind.
Wenn Sie eine interne Bibliothek haben, die nur von Ihren eigenen Entwicklern verwendet wird, ist ein kurzer Zyklus normal -> veraltet -> gelöscht in Ordnung. Wenn Sie eine Bibliothek haben, die an vielen Stellen verwendet wird, deklarieren Sie sie als veraltet, so viel Sie wollen, aber löschen Sie sie nicht.
Stattdessen veröffentlichen Sie eine neue Bibliothek mit einem neuen Namen. Die neue Bibliothek erklärt ausdrücklich, dass sie die Funktion X der alten Bibliothek nicht unterstützt und dass die Syntax für die Verwendung von Y und Z geändert wurde.
Die neue Bibliothek sollte auch eine Anleitung zur Code-Migration enthalten.
Die letzte Veröffentlichung der alten Bibliothek gibt Hinweise auf die neue und auf die Inkompatibilitäts-Readme.
Ich wurde damit oft von Apple enttäuscht. Ein altes Programm läuft nicht auf der neuen Version des Betriebssystems, weil Funktionen aus Standardbibliotheken entfernt wurden.
Es kann nützlich sein, wenn eine Bibliothek eine Art optionales Protokollierungsmerkmal hat. Auf einer Ebene protokolliert es nur, ob eine Bibliothek verwendet wurde (im Gegensatz zum bloßen Laden). Auf einer detaillierteren Ebene protokolliert es, welche Funktionen aufgerufen wurden. Dies kann als "schlafende" Funktion installiert werden, wenn die Bibliothek oder ihr übergeordnetes aufrufendes Programm netzwerkfähig ist. Am ersten des Monats sendet sie ein einzelnes UDP-Paket an den Server des Entwicklers: "Möchten Sie Protokolle?" Der Server antwortet entweder mit "Nein, schlaf für X Tage/Monate/Jahre/für immer" oder mit "Ja, protokolliere X % der Aufrufe, die dem Regex {Ausdruck} entsprechen".
Dies gibt Ihnen eine Möglichkeit zu sehen, ob Leute die Bibliothek immer noch verwenden, obwohl sie veraltet ist.
Sollte die Wrapper-Funktion nicht das Ergebnis von
replacementFunction.applyzurückgeben?