Недавно я открыл для себя Design by Contract (DbC) и считаю, что это чрезвычайно интересный способ написания кода. Среди прочего, казалось бы, предложить:
- Лучшая документация. Поскольку договор является документацией, он не может быть устаревшим. Кроме того, поскольку в контракте конкретно указывается, что делает подпрограмма, это помогает поддерживать повторное использование.
- Упрощенная отладка. Поскольку выполнение программы прекращается в тот момент, когда контракт не выполняется, ошибки не могут распространяться, и конкретное нарушенное утверждение, вероятно, будет выделено. Это предлагает поддержку во время разработки и во время обслуживания.
- Лучший статический анализ. DbC - это просто реализация логики Хоара, и должны применяться те же принципы.
Затраты, по сравнению с ними, кажутся довольно небольшими:
- Дополнительный отпечаток пальца. Поскольку контракты должны быть прописаны.
- Требуется некоторое обучение, чтобы освоиться с написанием контрактов.
Теперь, будучи знакомым в первую очередь с Python, я понимаю, что на самом деле можно написать предварительные условия (просто выбрасывая исключения для несоответствующего ввода) и даже можно использовать утверждения для повторного тестирования определенных постусловий. Но невозможно смоделировать определенные функции, такие как «старый» или «результат», без какой-либо дополнительной магии, которая в конечном счете будет считаться непифонической. (Кроме того, есть несколько библиотек, которые предлагают поддержку, но в конечном итоге я понимаю, что было бы неправильно использовать их, как это делают большинство разработчиков.) Я предполагаю, что это аналогичная проблема для всех других языков (кроме, конечно, Эйфелева).
Моя интуиция подсказывает мне, что отсутствие поддержки должно быть результатом какого-то отказа от практики, но поиск в Интернете не был плодотворным. Мне интересно, может ли кто-нибудь объяснить, почему большинство современных языков так мало поддерживают? Является ли DbC ошибочным или чрезмерно дорогим? Или это просто устарело из-за экстремального программирования и других методологий?