Основные принципы структурного программирования
Сам термин структурное программирование, как и набор правил, был сформулирован Дейкстрой. Он предложил следующее:
1. Текст программы должен быть структурирован т.о., чтобы она была максимально читабельна и понятна. Это предполагает наличие отступов при написании иерархически вложенных операторов; написании операторов только с одной позиции; продолжение оператора с другой позиции; помещение не более одного оператора на строку; каждый оператор должен быть как можно короче; выделение меток; ясное выделение начала и конца логических блоков программы; выделение операторов прерывания; обязательное комментирование программы; обязательное документирование программы; использование мнемонических имён.
2. Программа должна быть разбита на ясные логические блоки при выполнении которых исполняется только одна функция. В каждый блок возможен только один вход и только один выход. Программа должна быть как можно короче.
3. Провести последовательно принцип один вход – один выход. Добиться написания программы в чисто структурированной форме невозможно. Связанно это со сложностью организации одного выхода. Все языки, поддерживающие структурный подход имеют операторы, нарушающие данный принцип, но упрощающие процесс написания программы. Например, оператор case (в Pascal) или switch (в С). Или же наличие безусловного выхода из цикла командой break. Однако, данный принцип следует придерживаться на столько, на сколько это возможно, дабы исключить появление множества других ошибок.
4. Хаотическое использование оператора goto резко усложняет как понимание программы, так и её отладку и значительно снижает её надёжность. Было доказано, что без goto можно программировать или написать любую программу. Однако удаление goto из арсенала программиста увеличивает в некоторых случаях длину программы. Т.о. предложенно ограничить использование goto, а не исключать его вовсе.
Замечание: структурное программирование не явилось технологическим скачком. Дело не том, что не было соответствующей технической поддержки, когда она появилась, никто не вспомнил о структурном программировании, как о явлении. Основная причина в том, что не было новых технологических приёмов, хотя было несколько старых, оформленных по-новому; не было увеличения производительности труда программиста.
10. Модели управления в программных системах: централизованное управление, управление, основанное на событиях.
Централизованное управление чаще всего используется в СРВ, различных диспетчерских системах (например, опрос датчиков). В системах с централизованным управлением выделяют: координатор (некую центральную подсистему или модуль) и множество программных компонент (ПК). ПК пассивны, для получения от них сообщения. Координатор должен сам регулярно опрашивать их.
В случае событийного управления активную роль играют ПК, а вместо Координатора используется диспетчер сообщений. Он не ведет опрос ПК – они сами передают сообщения. Такая модель управления более распространена в Windows-приложениях, распределенных системах. Здесь события называются сообщениями (message). Windows посылает программе сообщения, связанные либо с тем, что произошло что-то внешнее (мышь/клавиатура), либо с тем, что самой системе потребовались от программы какие-то действия. Самым распространённым таким действием является предоставление информации или уведомление о начале какого-то действия.
В Windows одна процедура, называемая оконной, обрабатывает все сообщения. Каждое сообщение имеет свой уникальный номер, а оконная процедура обычно целиком состоит из оператора case, и каждому сообщению соответствует своя альтернатива этого оператора. Обычной программе приходится обрабатывать довольно много сообщений, поэтому оконная процедура бывает, очень длинной и громоздкой. Обработка сообщения требует времени, иногда довольно значительного. За это время окну может быть отправлено ещё несколько сообщений. Чтобы они не пропали, Windows организует так называемую очередь сообщений. Очередь сообщений своя для каждой нити. Нить должна сама выбирать сообщения из этой очереди, транслировать их и затем вызывать функцию DispatchMessage, чтобы направить это сообщение в нужную оконную процедуру.
Отправка сообщения другому окну может осуществляться достаточно разнообразными способами. Можно послать сообщение в очередь, а можно заставить Windows вызвать оконную процедуру напрямую, в обход очереди. Можно установить max-ное время ожидания отклика от окна, которому послано сообщение. Использование сообщений очень удобно в тех случаях, когда нужно заставить окно выполнить какое-то действие. Поэтому Windows предоставляет возможность программисту создавать свои сообщения, которые м.б. локальными или глобальными. Использование локальных сообщений связано с некоторым риском. Дело в том, что эти сообщения должны посылаться только «своим» окнам, т.е. тем, оконные процедуры которых написаны так, чтобы правильно интерпретировать это сообщение. Если послать такое сообщение «чужому» окну, его реакция м.б. непредсказуемой, т.к. человек, писавший его оконную процедуру, мог использовать сообщение с этим же номером для своих целей. Чтобы избежать таких последствия следует использовать глобальные пользовательские сообщения, называемые также строковыми.