[Descargo de responsabilidad: esta pregunta es subjetiva, pero preferiría obtener respuestas respaldadas por hechos y / o reflexiones]
Creo que todos saben sobre el Principio de robustez , generalmente resumido por la Ley de Postel:
Sé conservador en lo que envíes; Sé liberal en lo que aceptas.
Estoy de acuerdo en que para el diseño de un protocolo de comunicación generalizado esto puede tener sentido (con el objetivo de permitir una fácil extensión), sin embargo, siempre he pensado que su aplicación a HTML / CSS fue un fracaso total, cada navegador implementa su posee detección / comportamiento de ajustes silenciosos, lo que hace casi imposible obtener una representación coherente en varios navegadores.
Sin embargo, me doy cuenta de que la RFC del protocolo TCP considera aceptable el "Fallo silencioso" a menos que se especifique lo contrario ... lo que es un comportamiento interesante, por decir lo menos.
Hay otros ejemplos de la aplicación de este principio en todo el comercio de software que aparecen regularmente porque han mordido a los desarrolladores, desde el principio:
- inserción de punto y coma de Javascript
- C (silencioso) conversiones incorporadas (que no serían tan malas si no se truncaran ...)
y hay herramientas para ayudar a implementar el comportamiento "inteligente":
- nombre de algoritmos fonéticos ( Double Metaphone )
- algoritmos de distancias de cadena ( distancia Levenshtein )
Sin embargo, me parece que este enfoque, si bien puede ser útil cuando se trata de usuarios no técnicos o para ayudar a los usuarios en el proceso de recuperación de errores, tiene algunos inconvenientes cuando se aplica al diseño de la interfaz de biblioteca / clases:
- es un tanto subjetivo si el algoritmo adivina "correcto", y por lo tanto puede ir en contra del Principio de menos asombro
- hace que la implementación sea más difícil, por lo tanto, hay más posibilidades de introducir errores (violación de YAGNI ?)
- hace que el comportamiento sea más susceptible de cambiar, ya que cualquier modificación de la rutina de "adivinación" puede romper los programas antiguos, casi excluyendo las posibilidades de refactorización ... ¡desde el principio!
Y esto es lo que me llevó a la siguiente pregunta:
Al diseñar una interfaz (biblioteca, clase, mensaje), ¿te inclinas hacia el principio de robustez o no?
Yo mismo tiendo a ser bastante estricto, utilizando una extensa validación de entrada en mis interfaces, y me preguntaba si quizás era demasiado estricto.