
Лекция №10
Сложность системы.
Сложность – основная причина ошибок перевода и одна из главных причин ненадежности программного обеспечения. На этапе проектирования также решается вопрос минимизации сложности.
В общем случае сложность объекта является функцией взаимодействия между его компонентами. Например, сложность внешнего проекта программной системы в некоторой степени определяется связями между всеми ее внешними сопряжениями (между командами пользователя и соотношением между входной и выходной информацией системы). Сложность архитектуры системы определяется связями между подсистемами, а сложность отдельного модуля – функция связи между его командами.
Борьба со сложностью.
Независимость, т.е. максимальное усиление независимости компонент (высокочастотная динамика заключается в единых компонентах, а межкомпонентные взаимодействия – низкочастотная динамика систем)
Иерархическая структура (позволяет стратифицировать систему по уровням понимания).
Страты – такая иерархия системы, когда на каждом уровне рассматривается система целиком с точки зрения разных понятий.
Пример: Страница текста (система)
На уровне набора букв (например, буква «а» встречается в 100 раз чаще буквы «ъ», комбинация «аб» встречается чаще «ащ» в 50 раз и т.д.)
На уровне слова (количество глаголов, существительных и других частей речи).
На уровне предложения (правила синтаксиса, семантики и т.д.).
Каждый уровень иерархии ссылается на другой (предыдущий). Например, слово – единица на предыдущем уровне предложения, но в то же время состоит из букв, которые анализируются на другом уровне.
3. Проявление связей.
Проектное решение любого уровня имеет некоторую внутреннюю организацию или форму. Для минимизации сложности необходим метод проявления этой внутренней формы с тем, чтобы в соответствии с нею разбить проект на части.
При внешнем проектировании разбиение системы в соответствии с ее внутренней формой называется концептуальной целостностью. При разработке архитектуры системы и проектировании структуры программы рассматриваются методы определения этой внутренней формы для дальнейшего разбиения системы на множество компонент с высокой степенью независимостью.
При проектировании логики программы дисциплина, называемая структурным программированием, имеет целью помимо прочего привести эту логику в соответствие с несколькими базовыми стандартными формами.
Лекция № 11
Структурное программирование.
Для создания "хорошей" программы появляется необходимость придерживаться определенных принципов или определенной дисциплины программирования. Значительный прогресс в области программирования достигается с использованием так называемого структурного программирования. Появление новой технологии, или, как еще говорят, дисциплины программирования, основанной на структурном подходе, связано с именем известного голландского ученого Э.Дейкстры (1965 г.). В своих работах он высказал предположение, что оператор GOTO может быть исключен из языков программирования и что квалификация программиста обратно пропорциональна числу операторов GOTO в его программах. Такая дисциплина программирования упрощает и структуризирует программу. Однако представление о структурном программировании, как о программировании без использования оператора GOTO, является ошибочным. Например, Хоор определяет структурное программирование как "систематическое использование абстракции для управления массой деталей и способ документирования, который помогает проектировать программу". Структурное программирование можно толковать как "проектирование, написание и тестирование программы в соответствии с заранее определенной дисциплиной". Структурный подход к программированию как раз и имеет целью снижение трудоемкости всего процесса создания программного обеспечения от технического задания на разработку до завершения эксплуатации. Он означает необходимость единой дисциплины на всех стадиях разработки программы. В понятие структурного подхода к программированию обычно включают нисходящие методы разработки программ (принцип “сверху вниз”), собственно структурное программирование и так называемый сквозной структурный контроль.
1) нисходящая разработка
В проекте существует множество программ, подпрограмм, процедур и функций. Оттого, в какой последовательности эти процедуры и функции программируются, и зависит вид разработки.
При разработке «снизу - вверх» выделяются все функции, процедуры с нижнего уровня, пишутся программы, которые вызывают эти функции и процедуры. Затем составляются программы, ссылающиеся на предыдущие функции и процедуры, и так до общей организующей программы (интерфейс, мониторинговая программа и др.).
Главной особенностью такого вида разработки является то, что отладка верхнего уровня осуществляется только тогда, когда написаны все процедуры и программы нижнего уровня. Этот метод не столь эффективен, т.к. при обнаружении ошибки система целиком будет подлежать замене.
При разработке «сверху - вниз» в первую очередь пишется организующая программа и сразу же отлаживается. Затем постепенно пишутся подпрограммы и функции уровня ниже, а при отладке их замещает программа-«заглушка». Такая программа является пустой, она может совпадать с будущей только именем и иметь список формальных и фактических параметров. Примером такой программы может служить программа присваивания.

Организующая программа
подпрограмма
подпрограмма
подпрограмма
«заглушка»
«заглушка»
«заглушка»
программа
программа
Связи элементов схемы показывают не следование программ, а уровень вложенности, вызов программ.
2) Любая алгоритмически разрешимая задача обеспечивается решением алгоритмически полным набором действий (согласно теории математических систем). Выделяют три базовые процедуры:
Следование. Программы выполняются последовательно.
Ветвление (условие). Процедура типа if then else
if
Итеративность (цикличность)
while
Любой модуль всегда имеет «вход» и «выход», внутри модуля может быть любая комбинация из трех базовых процедур. Каждый модуль здесь – та подпрограмма, функция, проектирование которой осуществляет исполнитель, «спускаясь вниз», последовательно заменяя ее реальной программой.