Неконтролируемый доступ к данным

Недостатки структурного программирования

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

Проанализировав причины столь печальной судьбы многих проектов, можно прийти к выводу о недостаточной мощи структурного программирования: как бы эффективно ни применялся структурный подход, он не позволяет в доста­точной степени упростить большие сложные программы

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

Можно рассмотреть недостатки на примере программы складского учета. В такой программе записи в книге являются глобальными данными.

 

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

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

Если существует необходимость совместного использования одних и тех же данных несколькими функциями, то данные должны быть объявлены как глобальные.

           
   
 
   

 


    Функция А
    Функция В

 

 


Рис. 1.1 Глобальные и локальные данные

 

 

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

 

 

 


Большое число связей между функциями и данными, в свою очередь, также порождает несколько проблем. Во-первых, усложняется структура програм­мы. Во-вторых, в программу становится трудно вносить изменения. Изменение структуры глобальных данных может потребовать переписывания всех функ­ций, работающих с этими данными. Например, если разработчик программы складского учета решит сделать код продукта не 5-значным, а 12-значным, то будет необходимо изменить соответствующий тип данных с short на long. Это означает, что во все функции, оперирующие кодом продукта, должны быть вне­сены изменения, позволяющие обрабатывать данные типа Long. Можно привести аналогичный бытовой пример, когда в супермаркете изменяется расположение отделов, и покупателям приходится соответствующим образом менять свой при­вычный путь от одного отдела к другому.

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