Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 [4]  Все   Вниз
  Печать  
Автор Тема: Типичные ошибки при написании программ.  (Прочитано 37894 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #90 : 22-02-2010 11:32 » 

Сосредоточимся на программировании Улыбаюсь
Хорошо Улыбаюсь Тогда размышления дальше движутся по такому пути: система получает сигналы и отсылает ответные, информирующие окружение об изменениях в состоянии. Задержки при передаче и обработке сигналов, вообще говоря, могут приводить к тому, что окружение отправляет сигнал, ориентируясь на прежнее состояние системы, тогда как оно может успеть измениться. Например, пользователь сигнализировал "запустить G" (или "запустить F"), и в тот же момент система получила сигнал "A изменилось" - это может ввести в заблуждение пользователя: будет ли произведена операция? И если А изменилось после момента отправки и до момента обработки F - то для какого A будет вычислено F?

Всё это наводит на мысль о том, что любые изменения в системе должны иметь характер транзакций. Система должна отдельно уведомлять о начале и завершении транзакции.

Допустим, все поступающие сообщения помещаются в очередь. Тогда, например, в случае поступления сигнала "изменяется A" уведомление о начале транзакции приводит к тому, что сбрасывается флаг Z1 (и об этом узнаёт UI), а затем уже нужно выполнить собственно модификацию A и закрыть транзакцию.

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

Однако что же делать с сигналами, которые успели наотправлять источники? Думаю, здесь нужна система приоритетов: очевидно, что если данное состояние системы позволяет, скажем, как изменение A, так и вычисление G, то вычислению G нужно отдать приоритет - иначе этот важный процесс может так никогда и не быть выполненным под градом частых изменений A. В то же время, процесс F является менее приоритетным, чем изменения A в том смысле, что в рамках конкретного отсечённого набора сообщений, поступивших до начала транзакции, выгоднее сначала иметь наиболее актуальное A, и лишь затем выполнить F.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #91 : 22-02-2010 12:49 » 

Вад, длинно о блокировках Улыбаюсь Поскольку задачу ставил я, то я же и делаю уточнения Улыбаюсь Будем считать, что поступление сигналов и изменение переменных идёт с шагом не чаще, чем в 1 секунду, а на протяжении этого времени система предоставлена сама себе и изолирована от внешних воздействий; по истечение кванта времени может прийти одно или несколько событий; внутри обработчиков запрещено запускать F и G, а остальные операции выполняются за время, много меньшее кванта.

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

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
ezus
Опытный

il
Offline Offline

« Ответ #92 : 14-03-2010 18:19 » 

To Dimka
Мне кажется, что обсуждение свелось к тонким деталям алгоритма. Это само по себе интересно, но, скорей всего, алгоритм вами уже разработан, и сейчас можно перейти к следующей стадии - разработка структуры программы. Не могли бы Вы привести основные соображения  по выбору структура программы и их возможные обоснования?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #93 : 15-03-2010 04:29 » 

ИМХО, алгоритм и структура программы вещи связанные, но не настолько, чтобы одно навязывало другое.
Записан

Странно всё это....
ezus
Опытный

il
Offline Offline

« Ответ #94 : 15-03-2010 06:55 » 

ИМХО, алгоритм и структура программы вещи связанные, но не настолько, чтобы одно навязывало другое.
Согласен.
Вот мне и интересно,
какими критериями руководствуются спецы при проектировании структуры программы,
какие мысли их посещают,
какие из них помогают, а какие - мешают.
О чем думать сначала, а что откладывать на потом?
Как структуру программы сделать по возможности более объективной?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #95 : 17-03-2010 20:01 » 

Цитата: ezus
Не могли бы Вы привести основные соображения  по выбору структура программы и их возможные обоснования?

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

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

Дальше, если сигналы нужно обрабатывать группами, требуется определить способ распознавания конца группы - момента, когда нужно от накопления информации переходить к её обработке. А также определить структуры данных, в которых информация накапливается (в данном случае простые переменные).

Мешающих мыслей у меня не возникало.


Теперь об "объективности" структуры программы. Либо я не понимаю, о чём этот вопрос, либо, если понимаю, он требует длинной философской лекции на тему.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #96 : 23-03-2010 15:56 » 

в тему
http://habrahabr.ru/blogs/arbeit/88443/
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #97 : 23-03-2010 17:42 » new

Sla, я не знаю, к чему тяготею - всё как-то больше о семантике интерфейсов забочусь. Стадию новичка-энтузиаста как-то прошёл мимо; стадия подающего надежды гения до сих пор проявляется, но в несколько модифицированном стиле; стадия поборника абстракций прошла довольно быстро, и ко всему прочему сильно отпугнули матёрые поборники, код которых приходилось сопровождать - зарёкся и до сих пор не люблю особо богатых конфигов, чем ужасно не порадовали новые веяния .NET - не люблю зависимости от всяких wizard'ов; в стадии ветерана был, но сбежал; "гуру" не являюсь, но симпатизирую.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: 1 2 3 [4]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines