[Haftungsausschluss: Diese Frage ist subjektiv, aber ich würde es vorziehen, Antworten mit Fakten und / oder Überlegungen zu erhalten.]
Ich denke, jeder kennt das Robustheitsprinzip , das normalerweise durch das Postelsche Gesetz zusammengefasst wird:
Seien Sie konservativ in dem, was Sie senden. Sei liberal in dem, was du akzeptierst.
Ich stimme zu, dass dies für die Entwicklung eines weit verbreiteten Kommunikationsprotokolls sinnvoll sein kann (mit dem Ziel, eine einfache Erweiterung zu ermöglichen). Ich war jedoch immer der Meinung, dass die Anwendung auf HTML / CSS völlig fehlgeschlagen ist und jeder Browser seine eigene stille Optimierung implementiert Erkennung / Verhalten, was es nahezu unmöglich macht, ein konsistentes Rendering über mehrere Browser hinweg zu erzielen.
Ich stelle jedoch fest, dass der RFC des TCP-Protokolls "Silent Failure" als akzeptabel erachtet, sofern nicht anders angegeben ... was gelinde gesagt ein interessantes Verhalten ist.
Es gibt andere Beispiele für die Anwendung dieses Prinzips im gesamten Softwarehandel, die regelmäßig auftauchen, weil sie Entwickler von oben in den Kopf gebissen haben:
- Javascript Semikolon einfügen
- C (stille) eingebaute Konvertierungen (was nicht so schlimm wäre, wenn es nicht abgeschnitten würde ...)
und es gibt Tools, die bei der Implementierung von "intelligentem" Verhalten helfen:
- Phonetische Algorithmen zur Namensanpassung ( Doppelmetaphon )
- String-Distanz-Algorithmen ( Levenshtein-Distanz )
Ich bin jedoch der Meinung, dass dieser Ansatz zwar hilfreich sein kann, wenn es um nicht technische Benutzer geht oder wenn es darum geht, Benutzer bei der Fehlerbehebung zu unterstützen, bei der Gestaltung der Benutzeroberfläche für Bibliotheken / Klassen jedoch einige Nachteile aufweist:
- Es ist etwas subjektiv, ob der Algorithmus "richtig" vermutet, und daher kann er gegen das Prinzip des geringsten Erstaunens verstoßen
- es erschwert die Implementierung und erhöht somit die Wahrscheinlichkeit, Fehler einzuführen (Verstoß gegen YAGNI ?)
- es macht das Verhalten anfälliger für Änderungen, da jede Änderung der "Vermutungs" -Routine alte Programme beschädigen kann, was Refactoring-Möglichkeiten fast ausschließt ... von Anfang an!
Und das hat mich zu folgender Frage geführt:
Neigen Sie beim Entwerfen einer Schnittstelle (Bibliothek, Klasse, Nachricht) zum Robustheitsprinzip oder nicht?
Ich selbst neige dazu, ziemlich streng zu sein und eine umfangreiche Eingabevalidierung für meine Schnittstellen zu verwenden, und ich habe mich gefragt, ob ich vielleicht zu streng bin.