¿Cuáles son las mejores prácticas para eliminar el código obsoleto?

9

Tengo la necesidad de eliminar un método obsoleto. Soy consciente del [Obsolete]atributo. ¿Tiene Microsoft una guía recomendada de mejores prácticas para hacer esto?

Aquí está mi plan actual:

R. No quiero crear un nuevo ensamblaje porque los desarrolladores tendrían que agregar una nueva referencia a sus proyectos y espero recibir mucho dolor de mi jefe y compañeros de trabajo si deben hacerlo. Tampoco mantenemos múltiples versiones de ensamblaje. Solo usamos la última versión. Cambiar esta práctica requeriría cambiar nuestro proceso de implementación, lo cual es un gran problema (hay que enseñar a las personas cómo hacer cosas con TFS en lugar de FinalBuilder y hacer que abandonen FinalBuilder)

B. Marque el viejo método como obsoleto.

C. Debido a que la implementación está cambiando (no la firma del método), necesito cambiar el nombre del método en lugar de crear una sobrecarga. Entonces, para que los usuarios conozcan el método adecuado, planeo agregar un mensaje al [Obsolete]atributo. Esta parte me molesta, porque el único cambio que estoy haciendo es desacoplar el método de la cadena de conexión. Pero, como no estoy agregando un nuevo ensamblaje, no veo forma de evitar esto.

Resultado:

[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
fuente

Respuestas:

5

Microsoft utiliza el atributo [obsoleto] para informar a los desarrolladores que el método, la propiedad o la clase están en desuso y que pueden modificarse (o no admitirse) en futuras versiones.

Eso le brinda al menos un ciclo de lanzamiento para notificar a los usuarios de su API que su función está "desapareciendo" y para eliminar referencias a ella en futuras versiones de su software.

El tiempo que dejes la característica original depende de ti. Si desea "alentar encarecidamente" a los desarrolladores a que usen sus nuevas funciones en lugar de las anteriores, solo necesita un ciclo de lanzamiento adicional para eliminarlo. Si tiene la intención de tener una compatibilidad con versiones anteriores permanente, puede dejarla para siempre.

Como señala Brian, si solo está cambiando la implementación subyacente, pero no la firma del método, es posible que no necesite hacer nada de esto.

Robert Harvey
fuente
La práctica de Microsoft generalmente es eliminar algo obsoleto en la próxima versión principal. Por el contrario, Java nunca elimina las cosas obsoletas, por lo que depende de usted.
Scott C Wilson
No versionamos ensamblajes más allá del nivel de aplicación (1 aplicación gigante con muchas soluciones). Combine esto con el hecho de que el número de soluciones que dependen de un conjunto dado no están definidas. No puedo probar una aplicación que no conozco. Pero, si hago un cambio que causa la ruptura de una aplicación que no conozco ... bueno, es mi culpa. Es por eso que cambié el nombre del método. Entonces, de lo que he leído hasta ahora, no hay mejor manera de hacerlo.
P.Brian.Mackey
4

Debido a que la implementación está cambiando (no la firma del método), necesito cambiar el nombre del método en lugar de crear una sobrecarga.

No entiendo. Si la implementación está cambiando pero la firma no, ¿por qué harías esto? Deje que el método "antiguo" use la implementación nueva y mejorada. Todos los desarrolladores que consuman esta API rodarán los ojos cuando vean un método con la misma firma creada y advertencias de desaprobación en sus llamadas a métodos existentes. (¿Puedes pensar en alguna vez que esto haya sucedido en una API?)

Si no está seguro de si cambiar la implementación subyacente de este método funcionará, verifique el comportamiento con pruebas unitarias antes y después de cambiar la implementación.

brian
fuente
Ese es un buen ideal. El problema es que no tenemos arneses de prueba en su lugar. Ese es otro problema en conjunto que espero resolver. Entonces, como no hay pruebas de integración, no puedo hacer lo que me recomiendan. Hay demasiadas dependencias aún indefinidas que no se probarán.
P.Brian.Mackey
La razón por la que mencioné las pruebas es porque claramente quería hacer esto, de modo que aquellos que consuman su API harían las pruebas y lo ayudarían a resolver cualquier problema entre las 2 llamadas. Su mejor opción parece ser arrojar a los desarrolladores que usan su código al fuego y hacer que usen la nueva implementación y esperar que realicen un control de calidad exhaustivo o que tengan pruebas propias.
Brian
Me arrojaría al fuego. Prefiero seguir con el código original que publiqué. De esa manera, nadie me llama a las 3 am preguntándome por qué se rompió el código de producción. Luego, dependa de los desarrolladores para resolver la obsolescencia del código a medida que avanzan y reparan sus banderas de advertencia. Si no lo arreglan en ese punto, entonces cuando las cadenas de conexión comienzan a fallar, es su culpa por no reparar sus banderas de advertencia ... no la mía.
P.Brian.Mackey
Cada vez que escribe un nuevo código corre el riesgo de presentar problemas. Las pruebas te permitirán refactorizar sin tener tanto miedo. El miedo es el asesino de la mente. Además, solo estás retrasando lo inevitable; agregarán a regañadientes un "2" a su llamada en un par de iteraciones a partir de ahora y recibirán la misma llamada telefónica si no funciona.
Brian