Was sind die Best Practices für das Auslaufen von veraltetem Code?

9

Ich muss eine veraltete Methode auslaufen lassen. Mir ist das [Obsolete]Attribut bekannt. Verfügt Microsoft über einen empfohlenen Leitfaden für bewährte Verfahren?

Hier ist mein aktueller Plan:

A. Ich möchte keine neue Baugruppe erstellen, da Entwickler ihren Projekten einen neuen Verweis hinzufügen müssten, und ich erwarte von meinem Chef und seinen Mitarbeitern viel Kummer, wenn sie dies tun müssen. Wir pflegen auch nicht mehrere Baugruppenversionen. Wir verwenden nur die neueste Version. Eine Änderung dieser Vorgehensweise würde eine Änderung unseres Bereitstellungsprozesses erfordern, was ein großes Problem darstellt (Menschen müssen lernen, wie man Dinge mit TFS anstelle von FinalBuilder macht, und sie dazu bringen, FinalBuilder aufzugeben).

B. Markieren Sie die alte Methode als veraltet.

C. Da sich die Implementierung ändert (nicht die Methodensignatur), muss ich die Methode umbenennen, anstatt eine Überladung zu erstellen. Um die Benutzer auf die richtige Methode aufmerksam zu machen, möchte ich dem [Obsolete]Attribut eine Nachricht hinzufügen . Dieser Teil stört mich, weil ich nur die Methode von der Verbindungszeichenfolge entkopple. Da ich jedoch keine neue Baugruppe hinzufüge, sehe ich keinen Weg daran vorbei.

Ergebnis:

[Obsolete("Please don't use this anymore because it does not implement IMyDbProvider.  Use XXX instead.")];
        /// <summary>
        /// 
        /// </summary>
        /// <param name="settingName"></param>
        /// <returns></returns>
        public static Dictionary<string, Setting> ReadSettings(string settingName)
        {
            return ReadSettings(settingName, SomeGeneralClass.ConnectionString);
        }

        public Dictionary<string, Setting> ReadSettings2(string settingName)
        {
            return ReadSettings(settingName);// IMyDbProvider.ConnectionString private member added to class.  Probably have to make this an instance method.
        }
P.Brian.Mackey
quelle

Antworten:

5

Microsoft verwendet das Attribut [veraltet], um Entwicklern mitzuteilen, dass die Methode, Eigenschaft oder Klasse veraltet ist und in zukünftigen Versionen möglicherweise geändert (oder überhaupt nicht unterstützt) wird.

Auf diese Weise haben Sie mindestens einen Release-Zyklus, um Benutzer über Ihre API zu informieren, dass ihre Funktion "nicht mehr verfügbar" ist, und um Verweise darauf in zukünftigen Versionen ihrer Software zu entfernen.

Wie lange Sie die ursprüngliche Funktion belassen, liegt ganz bei Ihnen. Wenn Sie Entwickler "stark ermutigen" möchten, Ihre neuen Funktionen gegenüber den alten zu verwenden, benötigen Sie nur einen zusätzlichen Release-Zyklus, um sie zu entfernen. Wenn Sie eine dauerhafte Abwärtskompatibilität wünschen, können Sie diese für immer beibehalten.

Wie Brian betont, müssen Sie möglicherweise überhaupt nichts tun, wenn Sie nur die zugrunde liegende Implementierung, nicht aber die Methodensignatur ändern.

Robert Harvey
quelle
Die Praxis von Microsoft besteht im Allgemeinen darin, eine veraltete Sache in der nächsten Hauptversion zu entfernen. Im Gegensatz dazu entfernt Java niemals veraltete Dinge - es liegt also an Ihnen.
Scott C Wilson
Wir versionieren Assemblys nicht über die Anwendungsebene hinaus (1 Riesenanwendung mit vielen Lösungen). Kombinieren Sie dies mit der Tatsache, dass die Anzahl der Lösungen, die von einer bestimmten Baugruppe abhängen, undefiniert ist. Ich kann keine Anwendung testen, von der ich nichts weiß. Aber wenn ich eine Änderung vornehme, die einen Bruch einer Anwendung verursacht, von der ich nichts weiß ... nun, das ist meine Schuld. Deshalb habe ich die Methode umbenannt. Nach dem, was ich bisher gelesen habe, gibt es keinen besseren Weg, dies zu tun.
P.Brian.Mackey
4

Da sich die Implementierung ändert (nicht die Methodensignatur), muss ich die Methode umbenennen, anstatt eine Überladung zu erstellen.

Ich verstehe nicht Wenn sich die Implementierung ändert, die Signatur jedoch nicht, warum sollten Sie dies jemals tun? Lassen Sie die "alte" Methode die neue und verbesserte Implementierung verwenden. Entwickler, die diese API verwenden, verdrehen die Augen, wenn sie eine Methode mit genau derselben Signatur und Verfallswarnungen für ihre vorhandenen Methodenaufrufe sehen. (Können Sie sich eine Zeit vorstellen, in der dies jemals in einer API passiert ist?)

Wenn Sie nicht sicher sind, ob das Ändern der zugrunde liegenden Implementierung dieser Methode funktioniert, überprüfen Sie das Verhalten mit Komponententests vor und nach dem Ändern der Implementierung.

brian
quelle
Das ist ein schönes Ideal. Das Problem ist, dass wir keine Testgurte haben. Das ist insgesamt ein weiteres Problem, das ich hoffentlich lösen kann. Da es keine Integrationstests gibt, kann ich nicht das tun, was Sie empfehlen. Es gibt zu viele noch nicht definierte Abhängigkeiten, die nicht getestet werden.
P.Brian.Mackey
Der Grund, warum ich das Testen erwähnt habe, ist, dass Sie dies eindeutig tun wollten, damit diejenigen, die Ihre API verwenden, die Tests durchführen und Ihnen helfen, Probleme zwischen den beiden Aufrufen herauszufinden. Ihre beste Option scheint darin zu bestehen, die Entwickler, die Ihren Code verwenden, ins Feuer zu werfen und sie dazu zu bringen, die neue Implementierung zu verwenden, und zu hoffen, dass sie eine gründliche Qualitätssicherung durchführen oder eigene Tests durchführen.
Brian
Ich würde mich ins Feuer werfen. Ich bleibe lieber bei dem Originalcode, den ich gepostet habe. Auf diese Weise ruft mich niemand um 3 Uhr morgens an und fragt sich, warum der Produktionscode kaputt gegangen ist. Verlassen Sie sich dann darauf, dass die Entwickler die Veralterung des Codes beheben, während sie ihre Warnflags reparieren. Wenn sie es zu diesem Zeitpunkt nicht reparieren, ist es ihre Schuld, wenn die Verbindungszeichenfolgen bei ihnen ausfallen, dass sie ihre Warnflags nicht repariert haben ... nicht meine.
P.Brian.Mackey
Wenn Sie neuen Code schreiben, besteht die Gefahr, dass Probleme auftreten. Mit Tests können Sie ohne Angst umgestalten. Angst ist der Geisteskiller. Außerdem verzögern Sie nur das Unvermeidliche. In einigen Iterationen fügen sie ihrem Anruf widerwillig eine "2" hinzu, und Sie erhalten denselben Anruf, wenn er nicht funktioniert.
Brian