Vlad писал(а):
Valery Solovey писал(а):
Для того, чтобы проверить значение функции, в идеале достаточно прослеживать изменения только лишь возвращаемого значения. То есть, смотрим, какая переменная стоит после RETURN, и прослеживаем её изменения с начала подпрограммы.
А зачем?
Это ж так не удобно - отслеживать изменения какой-то там переменной. Намного удобнее проверять результат каждой под-операции.
То есть, предлагаете скормить входные данные, сверить выходные данные с полученными вручную и в случае совпадения считать данный отрезок кода верным? Это не достаточное основание для того, чтобы считать код достоверным, всё зависит от его сложности. А сколько тестов надо? Пять будет много или мало? Чтобы ответить на данный вопрос, требуется анализ кода. Именно это я подразумевал: анализ кода с оглядкой на переменную, значение которой будем возвращать.
Vlad писал(а):
По-моему такой подход проистекает из другой проблемы - необходимости объявлять все переменные сразу и в одном месте. Отсюда боязнь, что по ходу дела в какую-нибудь переменную (например в ту, которая используется для возвращаемого значения) запишется что-то не то
Я постепенно исправляюсь в лучшую сторону, но раньше в моём коде был сущий бардак. Однако, случайно записать в результат что-то не то как-то не получалось даже тогда. Тут есть другая проблема: иногда, процедуры приходится делать большими с огромным числом отдельных переменных. Вот тогда единый блок объявления меня действительно раздражал. А как насчёт того факта, что признаком дурного тона при программировании на Си считается объявлять переменные где-либо не в начале подпрограммы? К тому же, объявления переменных, распределённые по всей подпрограмме, тоже создают проблемы.
Vlad писал(а):
Valery Solovey писал(а):
Но если в подпрограмме (процедуре или функции) изменяются какие-то внешние значения (глобальные переменные или VAR параметры), то приходится прослеживать и их значения, чтобы удостовериться в их корректности на момент выхода из подпрограммы по одному из множества ретурнов.
Я ж уже писал - используйте две процедуры. Например, основную работу делает вложенная процедура, ее результат проверяется и возвращается внешней.
Получается оригинальная динамическая проверка, которая иногда будет очень сказываться на производительности. А откуда уверенность, что внешняя процедура работает верно? Её тоже надо проверять. Причём, не факт, что она будет проще вложенной.