OberonCore
https://forum.oberoncore.ru/

Часто замечаю за собой
https://forum.oberoncore.ru/viewtopic.php?f=86&t=3793
Страница 1 из 2

Автор:  Иван Кузьмицкий [ Четверг, 26 Январь, 2012 10:05 ]
Заголовок сообщения:  Часто замечаю за собой

ошибки таких видов:

1) Указатель перед использованием не проверяется на NIL. Это даёт львиную долю трапов. Хотя после усиления самоконтроля их стало поменьше, но раньше вообще был сенокос. Ведь локальное тестирование зачастую завершается успешно (поскольку сам неосознанно обходишь свои же грабли), а вот на полевых испытаниях всё и вылезает.

2) Заложено много, реализовано лишь часть. Перед разработкой компонента задача часто формулируется в общем виде, а компонент в итоге реализует лишь часть из сформулированного. "Заработало, двигаемся дальше". В итоге, опять - локальное тестирование ничего не показывает, а в "чистом поле" компонент попадает именно в те условия, где проявляется недоработка.

Как можно с этим бороться и если не забороть совсем, то хотя бы придавить посильнее?

И какие ещё шаблонные ошибки вы за собой замечаете?

Автор:  Сергей Губанов [ Четверг, 26 Январь, 2012 23:49 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Иван Кузьмицкий писал(а):
И какие ещё шаблонные ошибки вы за собой замечаете?
Написать процедуру, но забыть вызвать её в нужном месте. Запускаешь программу, а ничего не изменилось. Смотришь в код, вот она процедура, программа должна выполнять то-то и то-то, а ничего подобного нет. Ах, блин, я же эту процедуру нигде не вызвал! :D

Автор:  Валерий Лаптев [ Четверг, 26 Январь, 2012 23:57 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Регулярно ошибаюсь в сложных условиях цикла - нет автоматического навыка формализации. Из-за этого очень не люблю repeat - условие цикла противоположное.

Автор:  Alexey_Donskoy [ Пятница, 27 Январь, 2012 07:47 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Любая изначально простая задача имеет тенденцию развиваться, и условия усложняются и нагромождаются одно на другое, до полной невозможности понять, что надо сделать в этом месте.
Очень помогают таблицы решений и иногда диаграммы состояний.
Но таблицы решений для мозга, похоже, противоестественны, очень уж он сопротивляется, даже зная о пользе :wink:

Автор:  Валерий Лаптев [ Пятница, 27 Январь, 2012 08:28 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Пацаны сейчас сильно перерабатывают первоначальную архитектуру редактора.
Сильно помогаеют паттерны.
Прям по книжке Кориевски Рефакторинг с использованием шаблонов.
Спрашиваю: а сразу думать в этом направлении было никак нельзя?
Ответ почти классический: Опыт нельзя перешагнуть! Только каждый шаг самому пройти... :)
Очень рекомендуют нагружать студентов паттернами пораньше... :)
Хотя сами на 2 курсе ни хрена не понимали... :)

Автор:  Александр Ильин [ Воскресенье, 05 Февраль, 2012 19:35 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Почему-то с трудом дошли до меня правила внесения +1 или -1 в операцию сравнения целочисленных переменных:
(a-1 < b) = (a <= b)
(a+1 > b) = (a >= b)
С трудом в том смысле, что иной раз приходится подумать, можно ли избавиться от единицы, но формализовать никак не додумывался. Всё "на пальцах" рассуждал.

Мне тут интуитивно не за что зацепиться. Надо какое-то мнемоническое правило придумать.

И наоборот:
(a < b) = (a+1 <= b)
(a > b) = (a-1 >= b)

Автор:  Иван Кузьмицкий [ Среда, 22 Февраль, 2012 19:55 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Вспомнил ещё одну довольно шаблонную ошибку. Это отсутствие явной инициализации полей.

Например, если в процедуре записи в базу данных используется (часто объявляемая локально) некая структура, поля которой совпадают с полями таблицы на сервере и какое-то поле непроинициализировать, то в базу может улететь произвольное значение. Зачастую это приводит к совершенно загадочному поведению системы и отыскать причину бывает проблематично.

Автор:  Евгений Темиргалеев [ Среда, 22 Февраль, 2012 22:20 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Иван Кузьмицкий писал(а):
Вспомнил ещё одну довольно шаблонную ошибку. Это отсутствие явной инициализации полей.
Вопрос привычки --- поэтому стараюсь придерживаться стиля явной инициализации всего. В т.ч. и указателей, которые обещает заниливать КП. Если уж очень зудит "оптимизация", заниливание указателей комментирую.

Автор:  Илья Ермаков [ Четверг, 23 Февраль, 2012 21:25 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Я для таких дел имел процедуру ZeroRec (имя, как в Дельфе) и ей зачищал записи до использования.

Автор:  Евгений Темиргалеев [ Пятница, 24 Февраль, 2012 09:39 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Илья Ермаков писал(а):
Я для таких дел имел процедуру ZeroRec (имя, как в Дельфе) и ей зачищал записи до использования.
В качестве замечания: инициализация # зануление; ZeroRec, об которой речь, требует IMPORT SYTSTEM.

Автор:  Пётр Кушнир [ Понедельник, 05 Март, 2012 20:27 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Можно замечать не только за собой, но и за другими
Иван Кузьмицкий писал(а):
1) Указатель перед использованием не проверяется на NIL.

Модуль StdTabViews.

Код:
   PROCEDURE (tv: View) Neutralize*;
   BEGIN
      IF tv.NofTabs() > 0 THEN
         tv.View(tv.Index()).Neutralize;
      END
   END Neutralize;


вроде бы всё логично, но суть в том, что если удалить все вкладки программно (это важно), а потом добавить первую, то модуль сначала создаёт для неё пустую ячейку в списке табсов, но не заполняет её, а посылает запрос Views.Do на выполнение операции Stores.Operation а Views - нейтрализует отображение вкладки и тут мы натыкаемся на результат вызова функции равный NIL.

Исправил на:
Код:
   PROCEDURE (tv: View) Neutralize*;
      VAR v: Views.View;
   BEGIN
      IF (tv.scriptLevel=0) & (tv.NofTabs() > 0) THEN
         v:=tv.View(tv.Index());
         IF v#NIL THEN v.Neutralize END
      END
   END Neutralize;

что не позволит отображению обрабатывать эту процедуру вообще, если вкладки находятся в режиме изменений BeginChanges/EndChanges

Автор:  Иван Кузьмицкий [ Понедельник, 05 Март, 2012 20:36 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Эту ошибку можно отнести к классу т.н. "неявных предположений". То есть условия контракта не охраняются, предполагая, что "и так должно быть всё хорошо".

Автор:  Иван Кузьмицкий [ Воскресенье, 01 Июль, 2012 18:47 ]
Заголовок сообщения:  Re: Часто замечаю за собой

ещё одну не такую уж и редкую ситуацию.

Торопишься, быстро вносишь изменения в код, компилируешь и запускаешь. Не идёт. Приходится искать причину, выводя в журнал сигналы. А в итоге обнаруживается, что допустил ошибку второпях, не доработав код.

Обнаружить проблемное место было легко - всего лишь спокойно прочитав исходник, и отладка в таком случае бы не понадобилась вовсе.

Автор:  Иван Кузьмицкий [ Вторник, 21 Август, 2012 12:25 ]
Заголовок сообщения:  Re: Часто замечаю за собой

вольности со множественными RETURN. Решил, так сказать, поиграть в "ремесленничество", поработать "на результат". Вот, только что напоролся - список недозаполняется из-за раннего выхода, пришлось потратить время на поиск ошибки и переработать процедуру.

Приятно, конечно, чувствовать себя профессионалом, которому "всё можно". Однако же, когда поджимает дедлайн, за подобные ляпы хочется оторвать самому себе руки.

Автор:  Владислав Жаринов [ Среда, 22 Август, 2012 10:19 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Вы имеете в виду то, на что указывалось в этом посте (и там дальше немного обсуждалось)?..
А как вы "убираете ретурны"?.. и/или не допускаете их?..

Автор:  Rifat [ Понедельник, 27 Август, 2012 12:59 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Александр Ильин писал(а):
Почему-то с трудом дошли до меня правила внесения +1 или -1 в операцию сравнения целочисленных переменных:
(a-1 < b) = (a <= b)
(a+1 > b) = (a >= b)
С трудом в том смысле, что иной раз приходится подумать, можно ли избавиться от единицы, но формализовать никак не додумывался. Всё "на пальцах" рассуждал.

Мне тут интуитивно не за что зацепиться. Надо какое-то мнемоническое правило придумать.

И наоборот:
(a < b) = (a+1 <= b)
(a > b) = (a-1 >= b)

В принципе эквивалентны, но не совсем, если может происходить переполнение.
Например, a = MinInt, b = MinInt+1. Тогда a <= b, но при операции a - 1 будет переполнение и результат скорее всего будет MaxInt и выражение a-1 < b не будет выполняться.

То есть сравнение без арифметических операций надежнее, так как здесь невозможно переполнение.

Автор:  Иван Кузьмицкий [ Понедельник, 27 Август, 2012 17:23 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Владислав Жаринов писал(а):
Вы имеете в виду то, на что указывалось в этом посте (и там дальше немного обсуждалось)?..
А как вы "убираете ретурны"?.. и/или не допускаете их?..


Я имею в виду несколько выходов из процедуры. Убираю же эти выходы очень просто - посредством присваивания значения некой переменной выхода. Она и возвращается в итоге один раз, в конце процедуры, что гарантирует полное прохождение всего тела процедуры.

Автор:  Владислав Жаринов [ Понедельник, 27 Август, 2012 18:14 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Точно! Когда почитывал тексты со многими ретурнами - пришёл к тому же... :) Грубо говоря, в часто встречающемся случае:
Код:
ЕСЛИ (то-то)
  ТО                               
   РЕТУРН (нет/Что-то-1)
ВСЁ
(делать что-то)
РЕТУРН Что-то-2
вместо этого писать:
Код:
ФУНКЦИЯ Имя
ЕСЛИ (то-то)
  ТО                                  ИНАЧЕ
   ИмяРез:=(нет/что-то-1)               (делать что-то, в частности ИмяРез:=Что-то-2)
ВСЁ
КОН Имя
- так?

Я тут опять попробовал физически двумерное текстовое программирование... не знаю, не съедут ли пробельные отступы... :)

Автор:  Иван Кузьмицкий [ Вторник, 28 Август, 2012 08:04 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Владислав Жаринов писал(а):
... - так?


Совершенно верно. Хотя язык и позволяет ставить RETURN где угодно, но в данном случае такая выразительность только вредит. Используя менее выразительный стиль с одним RETURN в конце, мы гарантируем избавление от некоторых ошибок. Как раз в тему: viewtopic.php?f=89&t=4062

Автор:  Alexey_Donskoy [ Вторник, 28 Август, 2012 16:18 ]
Заголовок сообщения:  Re: Часто замечаю за собой

Rifat писал(а):
То есть сравнение без арифметических операций надежнее, так как здесь невозможно переполнение.
На самом деле сравнение все процессоры делают как раз путём вычитания, и учитывают в том числе переполнение. Поэтому надо пользоваться сравнением, корректность которого уже гарантирована производителем :)

У меня на эту тему только недавно глюк вылез - стояло простое сравнение с порогом (без равенства), так кто-то задал порог = maxint :lol: Так что о таких моментах позаботиться - и достаточно.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/