Философия и практика безопасного программирования?

Здравствуйте!


Хочу поднять качество своего кода на уровень повыше. Сейчас качество своего кода пытаюсь обеспечивать в основном с помощью TDD и включив опцию «warnings as errors» в IDE. Хочу разобраться с двумя механизмами, которых я пока не применяю.


Первый — утверждения (asserts/assertions). Они мне никогда не давались. Как только я начинал применять assert'ы, мой код становился многословным и нечитаемым, а я убеждён, что нечитаемый код нельзя считать качественным и безопасным. Про assert'ы читал в Code complete, немножко в Pragmatic programmer и по блогам нескольким. Как-то не помогло, честно говоря.


Второй механизм — code contracts. С ними история почти та же, что и с assert'ами.


По сему имею несколько вопросов:

1. Как применять все эти практики совместно, чтобы повысить качество кода, а не понизить его неумелым применением практик? (Иными словами, интересует ваше мнение.)

2. Есть ли какие-то статьи именно на тему совместного применения практик? (Т.е. интересует мнение признанных авторитетов.)

3. Есть ли какая-то специфика применения практик, если они используются при разработке библиотек классов, а не приложения?
  • Вопрос задан
  • 3192 просмотра
Пригласить эксперта
Ответы на вопрос 6
taliban
@taliban
php программист
Подпишусь на ответы, хороший вопрос =)
А по поводу ассертов, или я что-то не понимаю, или мы думаем о разных ассертах, но ведь это простенькая функция которая принимает выжажение, и если ей приходит фолс, то она выводит ошибку (в разных языках по разному). Просто расставить их там где сомневаетесь в постоянстве данных и затем просматривать лог.
Ответ написан
Stac
@Stac
2х23 + кронштейн от Ergotron или другого производителя, который решит задачу взаимного расположения мониторов.
Ответ написан
Stac
@Stac
Если не ошибаюсь, assert'ы как-то обсуждали в Радио-Т (вместе с «эксепшнами» или отдельно).

Допустим, что именно так и было… :) Потому что мне запомнилось, что это зло.

В том смысле, что ошибки в программе надо перехватывать, конечно, но обрабатывать. И выдача сообщения об ошибке (или записьм в лог) это не лучший вариант обработки.
Ответ написан
assert'ы следует использовать в следующем случае:
Есть некий (громоздкий) кусок кода, у которого есть ожидаемое поведение, но ввиду каких-то обстоятельств (недостаточно документации, запутанность, недостаток опыта, недостаточное тестирование и т.п.) Вы можете быть в нем уверены только на 99.99%. Это зло, но иногда так бывает, особенно в начале разработки. Есть критическая операция, перед которой используется этот код и для которой надо быть уверенным на 100,01% что код сработал так, как ожидается, а если он сработал не так — то лучше остановить приложение, т.к. неправильное срабатывание может означать, например, что где-то повреждена память. Есть способ проверить, что код сработал так, как надо. Вот в той ситуации, когда уровень доверия к коду ниже требуемого для критической операции — перед критической операцией ставится ассерт на результат срабатывания кода. Если вам приходится ставить слишком много ассертов — то это значит, что Вы пишете заведомо плохой код.
Ответ написан
Комментировать
@gribozavr
assert'ом проверяются те утверждения, которые должны всегда выполняться. Если они не выполняются, то у вас в коде баг. В этом их отличие от, например, исключений. Если у вас функция возведения в квадрат вернула отрицательное число, какое исключение бросить? BadSquareImplementationException? глупость. А вот проверять что open() не вернул отрицательный файловый дескриптор нельзя, так как это вполне нормальная ситуация и бага в коде нигде нет (даже если вы в предыдущей строке этот файл создали, его кто-то мог уже успеть удалить).
Ответ написан
@dborovikov
Мое мнение — никогда не используйте assert-ы в коде, так как место их в юнит-тестах. Да и код загромождают да.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы