[Aviso: esta pergunta é subjetiva, mas eu preferiria obter respostas apoiadas por fatos e / ou reflexões]
Acho que todo mundo conhece o Princípio da Robustez , geralmente resumido pela Lei de Postel:
Seja conservador no que você envia; seja liberal no que você aceita.
Concordo que, para o design de um protocolo de comunicação amplo, isso faça sentido (com o objetivo de permitir uma extensão fácil), no entanto, sempre achei que sua aplicação ao HTML / CSS era uma falha total, cada navegador implementando seu próprio ajuste silencioso detecção / comportamento, tornando quase impossível obter uma renderização consistente em vários navegadores.
Percebo, porém, que ali a RFC do protocolo TCP considera "Falha Silenciosa" aceitável, a menos que seja especificado de outra forma ... o que é um comportamento interessante, para dizer o mínimo.
Existem outros exemplos da aplicação desse princípio em todo o comércio de software que surgem regularmente porque morderam desenvolvedores, de cima para baixo:
- Inserção de ponto e vírgula em Javascript
- Conversões internas C (silenciosas) (que não seriam tão ruins se não fossem truncadas ...)
e existem ferramentas para ajudar a implementar o comportamento "inteligente":
- algoritmos fonéticos de correspondência de nomes ( Double Metaphone )
- algoritmos de distâncias de string ( distância de Levenshtein )
No entanto, acho que essa abordagem, embora possa ser útil ao lidar com usuários não técnicos ou para ajudar os usuários no processo de recuperação de erros, apresenta algumas desvantagens quando aplicada ao design da interface da biblioteca / classes:
- é um tanto subjetivo saber se o algoritmo adivinha "certo" e, portanto, pode ir contra o Princípio da Mínima Surpresa
- torna a implementação mais difícil, portanto, mais chances de introduzir bugs (violação do YAGNI ?)
- isso torna o comportamento mais suscetível a alterações, pois qualquer modificação na rotina de "suposição" pode interromper os programas antigos, quase excluindo as possibilidades de refatoração ... desde o início!
E foi isso que me levou à seguinte pergunta:
Ao projetar uma interface (biblioteca, classe, mensagem), você se inclina para o princípio da robustez ou não?
Eu próprio tendem a ser bastante rigorosos, usando ampla validação de entrada em minhas interfaces, e fiquei pensando se talvez fosse muito rigoroso.