[Отказ от ответственности: этот вопрос субъективен, но я бы предпочел получать ответы, подкрепленные фактами и / или размышлениями]
Я думаю, что все знают о принципе робастности , обычно описываемом законом Постеля:
Будьте консервативны в том, что вы посылаете; быть либеральным в том, что вы принимаете.
Я согласен, что для разработки широко распространенного коммуникационного протокола это может иметь смысл (с целью обеспечения легкого расширения), однако я всегда думал, что его применение к HTML / CSS было полным провалом, каждый браузер реализовывал свой собственный бесшумный твик обнаружение / поведение, делающее практически невозможным получение согласованного рендеринга в нескольких браузерах.
Однако я замечаю, что в этом документе RFC протокола TCP считается допустимым «Silent Failure», если не указано иное ... что, по меньшей мере, является интересным поведением.
Существуют и другие примеры применения этого принципа в торговле программными продуктами, которые регулярно появляются, потому что они укусили разработчиков с головы до головы:
- Вставка точек с запятой в Javascript
- C (тихие) встроенные преобразования (что было бы не так плохо, если бы они не усекались ...)
и есть инструменты, помогающие реализовать «умное» поведение:
- фонетические алгоритмы сопоставления имен ( Double Metaphone )
- Алгоритмы струнных расстояний ( расстояние Левенштейна )
Однако я считаю, что этот подход, хотя он может быть полезен при работе с нетехническими пользователями или для помощи пользователям в процессе восстановления после ошибок, имеет некоторые недостатки при применении к дизайну интерфейса библиотеки / классов:
- несколько субъективно, угадывает ли алгоритм «правильно», и поэтому он может идти вразрез с принципом наименьшего удивления
- это делает реализацию более трудной, таким образом, больше шансов ввести ошибки (нарушение YAGNI ?)
- это делает поведение более восприимчивым к изменению, поскольку любая модификация процедуры «угадай» может сломать старые программы, почти исключая возможности рефакторинга ... с самого начала!
И это то, что привело меня к следующему вопросу:
При проектировании интерфейса (библиотеки, класса, сообщения) вы склоняетесь к принципу надежности или нет?
Я сам склонен быть довольно строгим, используя обширную проверку входных данных на моих интерфейсах, и мне было интересно, был ли я слишком строг.