[Disclaimer: questa domanda è soggettiva, ma preferirei ottenere risposte sostenute da fatti e / o riflessioni]
Penso che tutti siano a conoscenza del principio di robustezza , in genere riassunto dalla legge di Postel:
Be conservative in what you send; be liberal in what you accept.
Concordo sul fatto che per la progettazione di un protocollo di comunicazione diffuso questo abbia senso (con l'obiettivo di consentire un'estensione facile), tuttavia ho sempre pensato che la sua applicazione a HTML / CSS fosse un fallimento totale, ogni browser che implementava il suo possiede il rilevamento / comportamento di tweak silenzioso, rendendo quasi impossibile ottenere un rendering coerente su più browser.
Tuttavia noto che la RFC del protocollo TCP considera accettabile il "Silent Failure" a meno che non sia diversamente specificato ... il che è un comportamento interessante, per usare un eufemismo.
Ci sono altri esempi dell'applicazione di questo principio nel commercio del software che appaiono regolarmente perché hanno morso gli sviluppatori, dall'alto verso il basso:
- Inserimento punto e virgola JavaScript
- C (silent) conversioni integrate (che non sarebbero così male se non fossero troncate ...)
e ci sono strumenti per aiutare a implementare un comportamento "intelligente":
- nome corrispondente agli algoritmi fonetici ( Double Metaphone )
- algoritmi di distorsione delle stringhe ( distanza Levenshtein )
Tuttavia, trovo che questo approccio, sebbene possa essere utile quando si ha a che fare con utenti non tecnici o per aiutare gli utenti nel processo di recupero degli errori, ha alcuni svantaggi quando viene applicato alla progettazione dell'interfaccia librerie / classi:
- è alquanto soggettivo se l'algoritmo indovina "giusto", e quindi potrebbe andare contro il principio di stordimento
- rende l'implementazione più difficile, quindi maggiori possibilità di introdurre bug (violazione di YAGNI ?)
- rende il comportamento più suscettibile al cambiamento, poiché qualsiasi modifica della routine "guess" potrebbe interrompere i vecchi programmi, quasi escludendo le possibilità di refactoring ... dall'inizio!
E questo è ciò che mi ha portato alla seguente domanda:
Quando progetti un'interfaccia (libreria, classe, messaggio), ti appoggi al principio di robustezza o no?
Io stesso tendo ad essere piuttosto severo, usando un'estesa validazione dell'input sulle mie interfacce, e mi chiedevo se fossi forse troppo severo.