OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 00:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Часто замечаю за собой
СообщениеДобавлено: Четверг, 26 Январь, 2012 10:05 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
ошибки таких видов:

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

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

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

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


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Четверг, 26 Январь, 2012 23:57 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Регулярно ошибаюсь в сложных условиях цикла - нет автоматического навыка формализации. Из-за этого очень не люблю repeat - условие цикла противоположное.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Пятница, 27 Январь, 2012 07:47 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1053
Откуда: Россия, Чебоксары
Любая изначально простая задача имеет тенденцию развиваться, и условия усложняются и нагромождаются одно на другое, до полной невозможности понять, что надо сделать в этом месте.
Очень помогают таблицы решений и иногда диаграммы состояний.
Но таблицы решений для мозга, похоже, противоестественны, очень уж он сопротивляется, даже зная о пользе :wink:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Пятница, 27 Январь, 2012 08:28 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Воскресенье, 05 Февраль, 2012 19:35 
Аватара пользователя

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Среда, 22 Февраль, 2012 19:55 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Вспомнил ещё одну довольно шаблонную ошибку. Это отсутствие явной инициализации полей.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Среда, 22 Февраль, 2012 22:20 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Четверг, 23 Февраль, 2012 21:25 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Я для таких дел имел процедуру ZeroRec (имя, как в Дельфе) и ей зачищал записи до использования.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Пятница, 24 Февраль, 2012 09:39 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Илья Ермаков писал(а):
Я для таких дел имел процедуру ZeroRec (имя, как в Дельфе) и ей зачищал записи до использования.
В качестве замечания: инициализация # зануление; ZeroRec, об которой речь, требует IMPORT SYTSTEM.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Понедельник, 05 Март, 2012 20:27 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Можно замечать не только за собой, но и за другими
Иван Кузьмицкий писал(а):
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Понедельник, 05 Март, 2012 20:36 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Эту ошибку можно отнести к классу т.н. "неявных предположений". То есть условия контракта не охраняются, предполагая, что "и так должно быть всё хорошо".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Воскресенье, 01 Июль, 2012 18:47 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
ещё одну не такую уж и редкую ситуацию.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Вторник, 21 Август, 2012 12:25 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
вольности со множественными RETURN. Решил, так сказать, поиграть в "ремесленничество", поработать "на результат". Вот, только что напоролся - список недозаполняется из-за раннего выхода, пришлось потратить время на поиск ошибки и переработать процедуру.

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


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

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 2046
Вы имеете в виду то, на что указывалось в этом посте (и там дальше немного обсуждалось)?..
А как вы "убираете ретурны"?.. и/или не допускаете их?..


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

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Александр Ильин писал(а):
Почему-то с трудом дошли до меня правила внесения +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 не будет выполняться.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Понедельник, 27 Август, 2012 17:23 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Владислав Жаринов писал(а):
Вы имеете в виду то, на что указывалось в этом посте (и там дальше немного обсуждалось)?..
А как вы "убираете ретурны"?.. и/или не допускаете их?..


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


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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Вторник, 28 Август, 2012 08:04 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Владислав Жаринов писал(а):
... - так?


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Часто замечаю за собой
СообщениеДобавлено: Вторник, 28 Август, 2012 16:18 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1053
Откуда: Россия, Чебоксары
Rifat писал(а):
То есть сравнение без арифметических операций надежнее, так как здесь невозможно переполнение.
На самом деле сравнение все процессоры делают как раз путём вычитания, и учитывают в том числе переполнение. Поэтому надо пользоваться сравнением, корректность которого уже гарантирована производителем :)

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB