Неконтролируемый доступ к данным
Недостатки структурного программирования
В непрекращающемся процессе роста и усложнения программ стали постепенно выявляться недостатки структурного подхода к программированию. Возможно, вам приходилось слышать «страшные истории» о том, как происходит работа над программным проектом, или даже самим участвовать в создании такого проекта: задача оказывается сложнее, чем казалось, сроки сдачи проекта переносятся. Все новые и новые программисты привлекаются для работы, что резко увеличивает расходы. Окончание работы вновь переносится, и в результате проект терпит крах.
Проанализировав причины столь печальной судьбы многих проектов, можно прийти к выводу о недостаточной мощи структурного программирования: как бы эффективно ни применялся структурный подход, он не позволяет в достаточной степени упростить большие сложные программы
Существуют два недостатка процедурно-ориентированных языков. Первый недостаток в неограниченности доступа функций к глобальным данным. Вторая состоит в том, что разделение данных и функций, являющееся основой структурного подхода, плохо отображает картину мира.
Можно рассмотреть недостатки на примере программы складского учета. В такой программе записи в книге являются глобальными данными.
В процедурной программе, написанной на языке процедурного программирование (например, Си), существует два типа данных: глобальные и локальные.
Локальные данные находятся внутри функции и предназначены для использования исключительно этой функцией. Локальные данные функции недоступны никому, кроме самой функции, и не могут быть изменены другими функциями.
Если существует необходимость совместного использования одних и тех же данных несколькими функциями, то данные должны быть объявлены как глобальные.
|
|
Рис. 1.1 Глобальные и локальные данные
Проблема процедурного метода заключается в том, что число возможных связей между глобальными переменными и функциями может быть огромным (рис.1.2)
Большое число связей между функциями и данными, в свою очередь, также порождает несколько проблем. Во-первых, усложняется структура программы. Во-вторых, в программу становится трудно вносить изменения. Изменение структуры глобальных данных может потребовать переписывания всех функций, работающих с этими данными. Например, если разработчик программы складского учета решит сделать код продукта не 5-значным, а 12-значным, то будет необходимо изменить соответствующий тип данных с short на long. Это означает, что во все функции, оперирующие кодом продукта, должны быть внесены изменения, позволяющие обрабатывать данные типа Long. Можно привести аналогичный бытовой пример, когда в супермаркете изменяется расположение отделов, и покупателям приходится соответствующим образом менять свой привычный путь от одного отдела к другому.
Когда изменения вносятся в глобальные данные больших программ, бывает непросто быстро определить, какие функции необходимо скорректировать. Даже в том случае, когда это удается сделать, из-за многочисленных связей между функциями и данными исправленные функции начинают некорректно работать с другими глобальными данными. Таким образом, любое изменение влечет за собой далеко идущие последствия.