[Avertissement: cette question est subjective, mais je préférerais obtenir des réponses étayées par des faits et / ou des réflexions]
Je pense que tout le monde connaît le principe de robustesse , généralement résumé par la loi de Postel:
Soyez conservateur dans ce que vous envoyez. soyez libéral dans ce que vous acceptez.
Je conviens que pour la conception d'un protocole de communication répandu, cela peut avoir un sens (dans le but de permettre une extension facile), mais j'ai toujours pensé que son application au HTML / CSS était un échec total, chaque navigateur mettant en œuvre son propre ajustement silencieux. détection / comportement, ce qui rend pratiquement impossible l’obtention d’un rendu cohérent sur plusieurs navigateurs.
Je remarque cependant que la RFC du protocole TCP considère que "l'échec silencieux" est acceptable, sauf indication contraire ... ce qui est un comportement intéressant, pour le moins qu'on puisse dire.
Il existe d'autres exemples d'application de ce principe dans le commerce de logiciels qui apparaissent régulièrement parce qu'ils ont mordu les développeurs, du haut de ma tête:
- Insertion de point-virgule Javascript
- Conversions intégrées C (silencieuses) (qui ne seraient pas si mauvaises si elles n'étaient pas tronquées ...)
et il existe des outils pour aider à implémenter un comportement "intelligent":
- algorithmes phonétiques de correspondance de nom ( Double Metaphone )
- algorithmes de distances de chaîne ( distance de Levenshtein )
Cependant, j'estime que cette approche, bien qu'elle puisse être utile pour traiter avec des utilisateurs non techniques ou pour aider les utilisateurs dans le processus de récupération d'erreur, présente certains inconvénients lorsqu'elle est appliquée à la conception de l'interface bibliothèque / classes:
- il est quelque peu subjectif de savoir si l'algorithme devine "vrai", et cela peut donc aller à l'encontre du principe de moindre étonnement
- cela rend la mise en œuvre plus difficile, donc plus de chances d'introduire des bugs (violation de YAGNI ?)
- cela rend le comportement plus susceptible de changer, car toute modification de la routine "deviner" peut casser les anciens programmes, ce qui exclut presque les possibilités de refactorisation ... dès le départ!
Et c'est ce qui m'a amené à la question suivante:
Lorsque vous concevez une interface (bibliothèque, classe, message), vous penchez-vous ou non vers le principe de robustesse?
J'ai moi-même tendance à être assez strict, en utilisant une validation d'entrée étendue sur mes interfaces, et je me demandais si j'étais peut-être trop strict.