Понятие о нисходящей разработке программ

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

Из названия видно, что алгоритмы разрабатываются 'сверху вниз". Верхним уровнем считается уровень постановки задачи, на котором выделяют несколько самых общих шагов ее решения. Например, задачу определения стоимости покупки можно разбить на два основных этапа решения:

1. Определение веса покупки.

2. Определение по весу стоимости покупки.

На следующем вниз уровне детализации следует конкретизировать способ выполнения первого шага, например

1. Положить покупку на весы.

2. Считать с индикатора вес покупки.

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

Интуитивно понятно, что любую более-менее сложную задачу можно разбить на подзадачи. Далее возможны два пути. Можно, в первую очередь, решить те подзадачи, которые проще или решение которых известно. Этот путь обеспечивает быстрое достижение успехов на первых порах, однако, в большинстве случаев, дальнейшее продвижение столь же надежно замедляется на этапе объединения и отладки.

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

Более наглядное представление о достоинствах нисходящей разработки программ дает следующий пример.

Создавать программы размером до 1000 операторов, в которых отсутствуют ошибки, хотя и можно, но довольно трудно. Однако, теоретически и практически в девяти случаях из десяти несложно составить правильную программу из пятидесяти операторов. С помощью методов нисходящего программирования можно программу из 1000 операторов записать в виде двадцати блоков или модулей по пятьдесят операторов в каждом, причем не в виде автономных программ, а как совместно выполняющиеся части программы. Если восемнадцать из двадцати модулей не содержат ошибок, а остальные два могут быть внесены исправления, то можно получить очень высокую степень доверия к результирующе программе, состоящей из тысячи операторов. Таким образом - основой для создания программ, не содержащих ошибок, должна быть не человеческая непогрешимость, не повышена аккуратность, которая, конечно, не мешает, а понимании программы как совокупности математических объектов, подчиняющейся определенным законам.

Программа для ЭВМ первых поколений считалась хорошей, если занимала минимум памяти и обладала высоким быстродействием. Это было естественно, так как сами ЭВМ имели очень скромные, по сегодняшним меркам, ресурсы, но зачастую достигалось за счет таких трюков, которые делали почти невозможным самостоятельное изучение текста программы другим человеком. В то время это не являлось крупным препятствием, так как эксплуатацией программы занимался ее автор, а самих программ, так же, как и ЭВМ, было не очень много. По мере того, как цена на ЭВМ падала, они выходили из разряда уникального оборудования и на повестку дня вставал вопрос промышленной эксплуатации как аппаратуры, так и программного обеспечения, которое значительно усложнилось, что повлекло увеличение трудоемкости при его разработке. Это, а также то, что программы стали выпускаться массовыми тиражами, вследствие чего их сопровождение осуществлялось специальными группами без участия разработчиков, потребовало создания технологии программирования, которая позволила бы надежно управлять большими коллективами разработчиков, выпускать надежные программы, поддержка которых упрощалась бы из-за наличия легко читаемого исходного текста. Такой технологией является нисходящая разработка программ, применение которой позволяет, во-первых, математически строго доказывать правильность написанных программ, во-вторых, существенно улучшить управление крупными программными проектами, а, в-третьих, осуществлять в промышленных масштабах эксплуатацию и сопровождение программного обеспечения.

В рассмотренном примере мы употребляли понятие модуля. Что же это такое? Под модулем понимают последовательность логически связанных фрагментов, оформленную в виде процедуры как отдельная часть программы. Выделение модулей позволяет повысить производительность труда программистов за счет разбиения программы на фрагменты и их параллельного программирования. Модули должны выделяться так, чтобы отвечать следующим требованиям.

• Модуль целиком реализует одну функцию, то есть преобразование данных в результат строго определенным образом. Эта функция может быть охарактеризована одной фразой, например, "Загрузить файл", "Распечатать оглавление" и т.д. Концепция "Один модуль - одна функция" является ключом к хорошим программам.

• Работа модуля не должна зависеть от истории его вызовов.

• По завершении работы он должен возвращать управление программой вызвавшему его модулю и передавать результаты работы только ему.

• Вызвать модуль можно только по его имени. При этом он должен иметь только один вход и один выход. Лучше написать несколько похожих модулей с небольшими различиями, чем один универсальный, но запутанный, с трудно обнаруживаемыми ошибками.

• Желательно, чтобы модуль имел небольшие размеры (20 - 50 строк). Это упрощает его восприятие и облегчает локализацию ошибок.

Если программа разбита на модули таким образом, что их разработка практически не зависит друг от друга. По мере разработки модулей они включаются в готовую программу, которая начинает работать с завершением отладки последнего модуля. Здесь в рамках нисходящего подхода можно избрать следующие стратегии программирования:

• запрограммировать все модули одного уровня, затем перейти к следующему (нижнему);

• программировать все модули на одной ветви (от верхнего до нижнего уровня) схемы иерархии;

• реализовать операционный подход, то есть программировать модули в том порядке, как они выполняются при запуске готовой программы.

Лучше та из них, которая позволяет раньше решить главную задачу.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: