Quali sono le migliori pratiche per eliminare gradualmente il codice obsoleto?


9

Ho la necessità di eliminare gradualmente un metodo obsoleto. Sono a conoscenza [Obsolete]dell'attributo. Microsoft ha una guida di best practice consigliata per farlo?

Ecco il mio piano attuale:

R. Non voglio creare un nuovo assembly perché gli sviluppatori dovrebbero aggiungere un nuovo riferimento ai loro progetti e mi aspetto di ricevere molto dolore dal mio capo e dai miei colleghi se devono farlo. Inoltre non gestiamo più versioni di assiemi. Usiamo solo l'ultima versione. Cambiare questa pratica richiederebbe di cambiare il nostro processo di distribuzione che è un grosso problema (bisogna insegnare alle persone come fare le cose con TFS invece di FinalBuilder e convincere loro a rinunciare a FinalBuilder)

B. Contrassegna il vecchio metodo come obsoleto.

C. Poiché l'implementazione sta cambiando (non la firma del metodo), devo rinominare il metodo anziché creare un sovraccarico. Quindi, per rendere gli utenti consapevoli del metodo corretto, ho intenzione di aggiungere un messaggio [Obsolete]all'attributo. Questa parte mi disturba, perché l'unica modifica che sto facendo è il disaccoppiamento del metodo dalla stringa di connessione. Ma, poiché non sto aggiungendo un nuovo assembly, non vedo alcun modo per aggirare questo.

Risultato:

[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.
        }

Risposte:


5

Microsoft utilizza l'attributo [obsoleto] per dire agli sviluppatori che il metodo, la proprietà o classe è deprecato, e possono essere modificate (o non supportati affatto) nelle versioni future.

Questo ti dà almeno un ciclo di rilascio per informare gli utenti della tua API che la loro funzionalità "sta scomparendo" e per rimuovere riferimenti ad essa nelle versioni future del loro software.

Per quanto tempo lasci la funzionalità originale dipende interamente da te. Se si desidera "incoraggiare fortemente" gli sviluppatori a utilizzare le nuove funzionalità rispetto a quelle precedenti, è necessario solo un ciclo di rilascio aggiuntivo per rimuoverlo. Se hai intenzione di avere una retrocompatibilità permanente, puoi lasciarla per sempre.

Come sottolinea Brian, se stai solo modificando l'implementazione sottostante, ma non la firma del metodo, potresti non dover fare nulla di tutto ciò.


La pratica di Microsoft è generalmente quella di rimuovere una cosa obsoleta nella prossima versione principale. Al contrario, Java non rimuove mai le cose deprecate, quindi dipende da te.
Scott C Wilson,

Non assembliamo versioni oltre il livello di applicazione (1 applicazione gigante con molte soluzioni). Combinalo con il fatto che il numero di soluzioni che dipendono da un determinato assieme non è definito. Non riesco a testare un'applicazione che non conosco. Ma, se apporto una modifica che provoca la rottura di un'applicazione che non conosco ... beh, è ​​colpa mia. Questo è il motivo per cui ho rinominato il metodo. Quindi, da quello che ho letto finora non c'è modo migliore di procedere.
P.Brian.Mackey,

4

Poiché l'implementazione sta cambiando (non la firma del metodo), ho bisogno di rinominare il metodo anziché creare un sovraccarico.

Non capisco. Se l'implementazione sta cambiando ma la firma non lo è, perché mai dovresti farlo? Consenti al metodo "vecchio" di utilizzare l'implementazione nuova e migliorata. Tutti gli sviluppatori che utilizzano questa API attireranno la loro attenzione quando vedranno un metodo con la stessa identica firma creata e avvisi di deprecazione sulle loro chiamate di metodo esistenti. (Riesci a pensare a un momento in cui è mai successo in un'API?)

Se non si è sicuri che la modifica dell'implementazione sottostante di questo metodo funzionerà, verificare il comportamento con unit test prima e dopo aver modificato l'implementazione.


È un bell'ideale. Il problema è che non abbiamo cablaggi di prova in atto. Questo è un altro problema che spero di essere risolto. Quindi, poiché non esiste un test di integrazione, non posso fare ciò che mi consigliate. Esistono troppe dipendenze ancora indefinite che non verranno testate.
P.Brian.Mackey,

Il motivo per cui ho citato i test è perché volevi chiaramente farlo in modo che quelli che consumavano la tua API facessero i test e ti aiutassero a capire eventuali problemi tra le 2 chiamate. La tua migliore opzione sembra essere quella di gettare gli sviluppatori usando il tuo codice nel fuoco e farli usare la nuova implementazione e sperare che eseguano un controllo di qualità approfondito o che abbiano test propri.
Brian

Mi getterei nel fuoco. Preferirei attenermi al codice originale che ho pubblicato. In questo modo nessuno mi chiama alle 3 del mattino chiedendomi perché il codice di produzione si sia rotto. Quindi, dipende dagli sviluppatori per risolvere l'obsolescenza del codice mentre attraversano e riparano le loro bandiere di avvertimento. Se a quel punto non lo risolvono, quando le stringhe di connessione iniziano a non funzionare su di loro è colpa loro per non aver riparato i loro flag di avvertimento ... non i miei.
P.Brian.Mackey,

Ogni volta che scrivi un nuovo codice corri il rischio di introdurre problemi. I test ti permetteranno di fare il refactoring senza aver paura. La paura è l'assassino della mente. Inoltre stai solo ritardando l'inevitabile; aggiungeranno a malincuore un "2" alla loro chiamata tra un paio di iterazioni da ora e riceverai la stessa telefonata se non funziona.
Brian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.