О связи между структурным
программированием и объектной технологией
говорят очень нечасто и очень немного.
Тем не менее, эта связь вполне очевидна,
и её понимание позволяет оценить общие
тенденции в области разработки программного
обеспечения, а, следовательно, и роль
объектной технологии. Именно поэтому цикл
писем по объектной технологии начинается
с рассмотрения её связи со структурным
программированием.
Целями структурного программирования
являлись структуризация данных и декомпозиция
кода. Объединение данных в структуры позволяло,
с одной стороны, более естественно описывать
сущности реального мира, имеющие самые
разнотипные наборы атрибутов. А, с другой
стороны, делало процесс разработки программ
более простым, поскольку однородные данные
были сгруппированы в одном месте и под
одним общим именем.
Декомпозиция кода заключалась
в разделении исходного кода программы
на отдельные подпрограммы. Подпрограммы
решали две важные задачи: они снижали
количество возможных связей между отдельными
операторами (локализация кода) и, кроме
того, позволяли устанавливать необходимую
область видимости для переменных, используемых
в подпрограммах (локализация данных).
Локализация кода не позволяла произвольно
переходить от одного оператора в одной
подпрограмме к любому оператору в другой
подпрограмме. Вызов подпрограммы приводил
к передаче управления только в определённую
точку входа, хотя некоторые языки допускали
более одной точки входа в подпрограмму.
Такое решение не только
повышало надёжность программ, но и, что
более важно, позволяло многократно использовать
одни и те же подпрограммы в различных
программах. Как следствие, стали появляться
библиотеки подпрограмм, как самостоятельные
программные продукты. Часть библиотек
поставлялась вместе с компиляторами с
языков программирования и операционными
системами, другая часть распространялась
свободно или на коммерческой основе. Применение
библиотек существенно ускоряло процесс
разработки программного обеспечения, так
как подпрограммы, применяемые многократно,
требовалось отлаживать только единожды.
Локализация данных имела ничуть не меньшее
значение, чем локализация кода. Подпрограммы
имели дело с тремя видами данных:
-
локальные данные подпрограммы,
которые автоматически создавались
при её вызове и уничтожались при возврате
из подпрограммы;
-
локальные данные, сохраняемые
между несколькими вызовами одной подпрограммы;
-
глобальные данные доступные
нескольким или всем подпрограммам,
и доступ к которым осуществлялся прямо
из подпрограммы;
-
фактические параметры,
передаваемые подпрограммам, замещающие
объявленные формальные параметры.
Примеры различных видов
данных приведены в следующем фрагменте:
Locals |
@@ |
; признак локальности
данных и меток |
DataSeg |
|
|
Glob1 |
dd |
0 |
|
; пример глобальных
данных |
Glob2 |
dd |
100 |
dup(0) |
|
... |
|
|
|
CodeSeg |
|
|
|
Start: |
|
|
; начало программы |
|
... |
|
|
|
;
при вызове подпрограмме ей передаются
фактические параметры |
|
call
MyProc |
offset Glob1, |
eax |
|
... |
|
|
Proc |
MyProc |
|
|
Arg |
@@par1 |
:dword, |
; первый формальный
параметр |
|
@@par2 |
:dword, |
; второй формальный
параметр |
Local |
@@buf |
:byte: 16 |
; локальная переменная,
создаваемая |
|
|
|
; при вызове
подпрограммы |
DataSeg |
|
|
|
|
@@loc1 |
dd |
0 |
; локальные переменные,
сохраняющие |
|
@@loc2 |
db |
80h dup (0) |
; своё значение
между вызовами |
CodeSeg |
|
|
|
|
... |
|
;тело подпрограммы |
|
ret |
|
|
endp |
MyProc |
|
|
|
... |
|
|
end |
Start |
|
|
|
|