[Dichiarazione di non responsabilità: questa domanda è soggettiva, ma preferirei ricevere risposte sostenute da fatti e / o riflessioni]
Penso che tutti conoscano il principio di robustezza , di solito riassunto dalla Legge di Postel:
Sii prudente in ciò che invii; sii liberale in ciò che accetti.
Concordo sul fatto che per la progettazione di un protocollo di comunicazione diffuso ciò potrebbe avere senso (con l'obiettivo di consentire una facile estensione), tuttavia ho sempre pensato che la sua applicazione a HTML / CSS fosse un fallimento totale, ogni browser implementava il proprio tweak silenzioso rilevamento / comportamento, rendendo quasi impossibile ottenere un rendering coerente su più browser.
Noto però che lì il RFC del protocollo TCP considera accettabile "Silent Failure" se non diversamente specificato ... il che è un comportamento interessante, per non dire altro.
Ci sono altri esempi dell'applicazione di questo principio in tutto il commercio di software che compaiono regolarmente perché hanno morsi sviluppatori, dalla cima della mia testa:
- Inserimento di punti e virgola Javascript
- C (silenzioso) conversioni integrate (che non sarebbe così male se non si tronca ...)
e ci sono strumenti per aiutare ad attuare comportamenti "intelligenti":
- algoritmi fonetici corrispondenti al nome ( Double Metaphone )
- algoritmi delle distanze delle stringhe ( distanza di 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, presenta alcuni svantaggi quando applicato alla progettazione dell'interfaccia libreria / classi:
- è in qualche modo soggettivo se l'algoritmo indovina "giusto", e quindi potrebbe andare contro il principio del minimo stupore
- 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 "indovina" può rompere i vecchi programmi, quasi escludendo le possibilità di refactoring ... dall'inizio!
E questo è ciò che mi ha portato alla seguente domanda:
Quando si progetta un'interfaccia (libreria, classe, messaggio), ti inclini verso il principio di robustezza o no?
Io stesso tendo ad essere piuttosto severo, usando un'ampia convalida dell'input sulle mie interfacce, e mi chiedevo se forse ero troppo severo.