[Uwaga: to pytanie jest subiektywne, ale wolałbym uzyskać odpowiedzi poparte faktami i / lub refleksjami]
Myślę, że wszyscy wiedzą o zasadzie solidności , zwykle podsumowanej przez prawo Postela:
Bądź konserwatywny w tym, co wysyłasz; bądźcie liberalni w tym, co akceptujecie.
Zgodziłbym się, że przy projektowaniu powszechnego protokołu komunikacyjnego może to mieć sens (w celu umożliwienia łatwego rozszerzenia), jednak zawsze uważałem, że jego zastosowanie do HTML / CSS było całkowitą porażką, każda przeglądarka wdrożyła własne ciche poprawki wykrywanie / zachowanie, co uniemożliwia uzyskanie spójnego renderowania w wielu przeglądarkach.
Zauważam jednak, że tam RFC protokołu TCP uznaje „cichą awarię” za dopuszczalną, chyba że określono inaczej ... co jest co najmniej ciekawym zachowaniem.
Istnieją inne przykłady zastosowania tej zasady w handlu oprogramowaniem, które regularnie pojawiają się, ponieważ ugryzły programistów, od samego początku:
- Wstawianie średników w JavaScript
- C (ciche) wbudowane konwersje (co nie byłoby takie złe, gdyby nie zostało obcięte ...)
i istnieją narzędzia, które pomogą wprowadzić „inteligentne” zachowanie:
- algorytmy fonetyczne dopasowujące nazwy ( Double Metaphone )
- algorytmy odległości ciągów ( odległość Levenshteina )
Uważam jednak, że takie podejście, chociaż może być pomocne w kontaktach z użytkownikami nietechnicznymi lub pomagać użytkownikom w procesie odzyskiwania błędów, ma pewne wady, gdy stosuje się je do projektowania interfejsu biblioteki / klas:
- jest nieco subiektywne, czy algorytm zgaduje „dobrze”, a zatem może być sprzeczne z zasadą najmniejszego zdziwienia
- utrudnia to wdrożenie, a tym samym zwiększa szanse na wprowadzenie błędów (naruszenie YAGNI ?)
- sprawia, że zachowanie jest bardziej podatne na zmianę, ponieważ każda modyfikacja procedury „zgadywania” może uszkodzić stare programy, prawie wykluczając możliwości refaktoryzacji ... od samego początku!
I to doprowadziło mnie do następującego pytania:
Czy projektując interfejs (bibliotekę, klasę, komunikat) kierujesz się zasadą niezawodności, czy nie?
Ja sam bywam dość rygorystyczny, korzystam z szerokiej weryfikacji danych wejściowych na moich interfejsach i zastanawiałem się, czy nie byłem może zbyt rygorystyczny.