2012-08-09 11 views
5

si tengo una función como¿Algún daño al cambiar un tipo de devolución nula a otra cosa en una función de utilidad comúnmente utilizada?

public void usefulUtility(parameters...) { 
    string c = "select * from myDB"; 
    do_a_database_call(c); 
} 

que se utiliza en muchos de los lugares, ¿hay alguna posibilidad de daño en el cambio a:

public bool usefulUtility(parameters...) { 
    string c = "select * from myDB"; 
    bool result = do_a_database_call(c); 
    return result; 
} 

Podría esto romper cualquier código?

No se me ocurre nada ... pero puede ser posible?

+2

[Sí] (http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx) – Servy

+1

El artículo al que hace referencia Servy es técnicamente correcto, pero pasar de un tipo de devolución 'nulo' a un tipo de devolución 'cadena' no rompería el código de su cliente. – jp2code

+1

@ jp2code Sí, en realidad, podría. Ver la respuesta que he escrito. El artículo no usa eso como uno de sus ejemplos, pero sí afirma que cualquier cambio público es un cambio radical. – Servy

Respuesta

3

Sí, prácticamente cualquier cosa que pueda hacer que afecte a su interfaz pública es un cambio radical. Puede ser lo suficientemente pequeño para que no te importe y que nadie, o casi nadie, llegue a las cajas de las esquinas, pero Eric Lippert explains dice que hay casos extremos (muchos de los cuales involucran la inferencia de tipos) que pueden causar incluso estos cambios aparentemente inocuos para romper.

Para su ejemplo particular, este código se romperá por ese cambio.

Action a = usefulUtility; 
+0

Pero su versión original devolvió 'null', por lo que no tendría forma de asignar' a' a la versión original. ¿Correcto? – jp2code

+2

Aparentemente no soy el único que mantiene un catálogo de las publicaciones de Lippert en mi [email protected] jp2code en este caso, no está llamando al método usefulUtility, lo guarda como un delegado al método Action, que se rompería porque la definición del delegado ha cambiado. –

+0

@ jp2code Este código funcionará perfectamente con un tipo de devolución de nulo. No se compilará después de haber sido modificado para devolver una cadena. – Servy

0

Tendría que devolver realmente un String o al menos nulo para el método para compilar. Ya no puedes finalizar el método sin una devolución.

+4

Supongo que quiere decir en términos de "¿Es esto un cambio radical para mis clientes si se trata de una función de biblioteca?". – Servy

1

Es ciertamente posible que podría romper algún otro código. Como señala Lippert, casi Every public change is a breaking change en alguna situación extraña.

La pregunta más importante es, ¿es probable para hacer que algo se rompa, y la respuesta es no. Debería estar bastante seguro haciendo este cambio, porque es poco probable que las personas hagan las cosas extrañas que tendrían que hacer para causar problemas. Eso no significa que sea imposible romper otro código, pero está fuera del ámbito de la responsabilidad razonable.

+0

Vale la pena señalar que el impacto también es una función de cómo se usa su biblioteca (además de la probabilidad). Para un método BCL aún surgen circunstancias muy, muy poco probables, a veces bastante en términos de números absolutos. Si se trata de una biblioteca que solo se utiliza en un puñado de proyectos dentro de su empresa, incluso los casos más probables pueden no aparecer en absoluto. – Servy

0

Si quiere estar absolutamente seguro de no romper nada, proporcione al método que devuelve un String un nombre diferente, y deje la firma del método void igual.

2

Un cambio como este definitivamente podría romper cosas, tanto en términos de compatibilidad binaria como en términos de compatibilidad con la fuente.

Es posible que desee echar un vistazo a this StackOverflow answer y su hilo asociado, donde se analizan en profundidad los cambios de API.

+0

¡Ah! Veo una referencia a un delegado en su enlace. No había pensado en eso. – jp2code

Cuestiones relacionadas