
- •Архитектуры и модели программ и знаний
- •Структурное программирование:
- •Литература по структурному программированию
- •Принципы структурного программирования
- •“Неструктурный” стиль программирования и не рекомендуемое использование GOTO
- •Пошаговая детализация
- •Преимещуства структурного программирования
- •Недостатки структурного программирования
- •программирование:
- •Модульное
- •Принципы модульности
- •Литература по модульному программированию
- •Интерфейс модуля
- •Реализация модуля
- •Виды модулей и способы их
- •Языки модульного программирования
- •Связность (прочность) модуля по Г. Майерсу (cohesion) – 1/2
- •Связность (прочность) модуля по Г. Майерсу (cohesion) – 2/2
- •Сцепление (coupling) модулей по Г. Майерсу
- •Типичные ошибки нарушения модульности и принципов TWC
- •Вопросы и домашнее задание к лекции 4

Архитектуры и модели программ и знаний
Лекция 4
Структурное и модульное программирование
Сафонов Владимир Олегович
Профессор кафедры информатики Заведующий лабораторией Java-технологии
(http://polyhimnie.math.spbu.ru/jtl)
Санкт-Петербургский государственный университет
Email: vosafonov@gmail.com
WWW: http://www.vladimirsafonov.org

Структурное программирование:
Исторически первый подход к систематизации и повышению надежности программирования
BS (Bowl-of-Spaghetti) –программы: С точки зрения TWC, наихудший |
|
стиль программирования |
|
Принципиально ненадежен |
|
Основан на бесконтрольных переходах (goto) в обоих направлениях , |
|
вследствие необходимости внесения изменений в код программы на |
|
языке низкого уровня, без передвижения фрагментов первоначального |
|
кода:основной код; GOTO на “заплатку”; исполнение “заплатки”; GOTO |
|
обратно |
|
Как бороться с BS-стилем? (одна из основных проблем |
|
программирования 1960х гг.) |
|
C. Boehm, J.Jacopini (1966): Теоретически доказали, что любая |
|
программа может быть преобразована в функционально эквивалентную |
|
ей, НЕ использующую GOTO, а использующую лишь следующий |
|
ограниченный набор конструкций: |
|
Последовательность операторов: S1; S2 |
|
Условный оператор: |
if B then S |
Цикл while: |
while B do S |
Вызов процедуры: |
P(X1, … Xn) |
Литература: |
|
1) Boehm C, Jacopini G. Flow diagrams, Turing machines and languages with only two formation rules. Communications of the ACM 1966;9(5).
2) Dijkstra EW. Go to statement considered harmful. Communications of the ACM 1968;11(3):147-148.
(C) Сафонов В.О. 2012

Литература по структурному программированию
1.Дж. Хьюз, Дж. Мичтом. Структурный подход к программированию. М.: Мир, 1978.
2.Иодан Э. Структурное программирование
ипроектирование программ. – М.: Мир, 1980.
3.Дейкстра Э. Заметки по структурному программированию. – В сб.: Структурное программирование, М.: Мир, 1975.
4.Вирт Н. Систематическое программирование. Введение. – М.: Мир, 1977
Pascal (1970) – язык систематического (структурного) программирования
(C)Сафонов В.О. 2012

Принципы структурного программирования
Использование ограниченного набора конструкций с
ясной и безопасной семантикой и простым потоком управления– последовательность операторов; оператор if; оператор while; оператор case (switch); структурный выход из конструкций; конструкции обработки исключений (try/catch – C++, Java, C#; signal/except/when
– CLU и т.д.)
Отсутствие операторов GOTO, либо, по крайней мере,
только структурный стиль использования GOTO: для прекращения сложной конструкции оператором go to на метку, помечающую оператор, следующий за конструкцией:
{ … GOTO M; … } M:
Сравните с Java:
ясен, M: { … break M; … } // поток управления более
// не требует
дополнительного анализаПошаговая детализация – метод пошагового
проектирования и разработки программ сверху вниз. При детализации испольуется псевдокод в стиле языка Паскаль
Использование мнемонических меток для обозначения
шагов алгоритма и псевдопроцедур, например:
INITIALIZATION: … PROCESS_INPUTSTREAM: …
Формальная спецификация(C) Сафонов В.О. 2012структурированных
программ и формальная версфикация их корректности

“Неструктурный” стиль программирования и не рекомендуемое использование GOTO
(рекомендуется избегать, как противоречащего принципам TWC)
GOTO из одной альтернативы CASE-оператора в другую
(Паскаль):
CASE x OF
C1: S1; GOTO M;
C2: S2;
C3: M:S3
END
Произвольное использование GOTO с целью внесения
исправлений в программу
“Проваливание” (fall through) в стиле языка C:
SWITCH (x) {CASE C1: S1; /* FALLTHRU */ CASE C2: S2; }Отсутствие обработки ошибок и исключенийОтсутствие DEFAULT-альтернативы в операторе SWITCH
(такая альтернатива настоятельно рекомендуется; в ней должно выдаваться сообщение о недопустимом значении селектора)
(C) Сафонов В.О. 2012

Пошаговая детализация
/ |
P |
Псевдокод (варианты) : |
\ |
||
P1 |
… Pn |
PROCEDURE P; |
/ \ |
|
BEGIN P1; … Pn END; |
Q1 … Qm …
PROCEDURE P1;
BEGIN IF B1 THEN Q1 …
ELSE Qm
- Конструкции структурного программирования ~
псевдооператорыЕсли язык реализации – низкоуровневый (например,
ассемблер), то в результирующем коде сохраняется
первоначально спроектированная структура
псевдопроцедур и псевдооператоров (в форме мнемонических меток,(C) Сафоновмакросов,В.О. 2012 комментариев)

Преимещуства структурного программирования
Ясность и систематический стиль программПростота быстрой разработки прототипаРаспараллеливание проектирования и
разработки частей проектаПовышение надежности (благодаря
исключению бесконтрольных переходов и ясности структуры программы)Возможность формальной спецификации и
формальной верификации каждого этапа при пошаговой детализации программ
(C) Сафонов В.О. 2012

Недостатки структурного программирования
В подобном стиле гораздо сложнее проектировать и
реализовывать данные (определения, объявления и
др.)
Любое изменение может потребовать повторного
проектирования и повторной реализацииОпасность получить в результате код
ненадлежащего качества:
Опасная для качества продукта возможность
организации процесса разработки, при которой квалифицированные программисты выступают в роли
спецификаторов и проектировщиков, а результирующий код продукта разрабатывают сотни неопытных программистов под их руководством
(C) Сафонов В.О. 2012

программирование:
Выводы
Структурное программирование –
неотъемлемая часть современной программистской культурыОднако использования одного лишь
структурного подхода недостаточно: он хорошо подходит только для структурирования исполняемых конструкций (операторов)
Необходимы другие подходы – для
декомпозиции программ на относительно независимые части и для удобной и надежной реализации операций над сложными структурами данных
Этим целям и служат, соответственно,
модульное программирование и абстрактные типы данных – следующие
темы данного курса(C) Сафонов В.О. 2012

Модульное
программирование
Основатели – Glenford Myers, David Parnas
(1970-е гг.)
Отечественные классики модульности –
Г.С. Цейтин (СПбГУ / IBM); Е.А. Жоголев (МГУ) Литература: Г.С. Цейтин. На пути к сборочному
программированию. – Программирование, 1990, №
1 (номер памяти академика А.П. Ершова)
Концепция программного модуля заимствована
из электроники: модуль – заменяемый блок с
минимальным числом четко определенных
контактов (интерфейсом), реализующий какую- либо функциональность в системе
Принципы TWC: каждый модуль должен быть
надежен и безопасен; взаимодействие между
модулями должно быть надежным и безопасным
(C) Сафонов В.О. 2012