[Descargo de responsabilidad: esta pregunta es subjetiva, pero preferiría obtener respuestas respaldadas por hechos y / o reflexiones]
Creo que todos conocen el Principio de Robustez , generalmente resumido por la Ley de Postel:
Sea conservador en lo que envía; 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 extensión fácil), sin embargo, siempre he pensado que su aplicación a HTML / CSS fue un fracaso total, cada navegador implementa su propio ajuste silencioso detección / comportamiento, por lo que es casi imposible obtener una representación coherente en varios navegadores.
Sin embargo, me doy cuenta de que allí el RFC del protocolo TCP considera aceptable la "falla silenciosa" a menos que se especifique lo contrario ... lo cual 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 lo más alto de mi cabeza:
- Inserción de punto y coma de Javascript
- Conversiones incorporadas C (silenciosas) (que no serían tan malas si no se truncaran ...)
y hay herramientas para ayudar a implementar el comportamiento "inteligente":
- algoritmos fonéticos coincidentes de nombre ( Metaphone doble )
- algoritmos de distancias de cuerda ( distancia de Levenshtein )
Sin embargo, encuentro que este enfoque, aunque puede ser útil cuando se trata con 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 algo 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, más posibilidades de introducir errores (¿violación de YAGNI ?)
- hace que el comportamiento sea más susceptible a cambios, ya que cualquier modificación de la rutina "adivinar" 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), ¿se inclina hacia el principio de robustez o no?
Yo mismo tiendo a ser bastante estricto, usando una extensa validación de entrada en mis interfaces, y me preguntaba si quizás era demasiado estricto.