Приложение 4. ЭЛЕМЕНТЫ ЯЗЫКА OBJECT PASKAL
1. МОДУЛЬ В OBJECT PASCAL
Язык объектно-ориентированного программирования Object Pascal применяется при работе в среде визуального программирования Delphi. Язык Object Pascal в основном включает «старый» язык Borland Pascal.
Программы на языке Object Pascal состоят из нескольких файлов: файла проекта (Delphi Project) с расширением *.dpr, одного или нескольких файлов модулей (Unit) с расширением *.pas и файлов дизайнера экранных форм с расширением *.dfm.
Файл проекта содержит текст основной программы Program, с которой начинается выполнение всей программы. Тексты вызываемых подпрограмм и используемых объектов находятся в файлах модулей.
Рассмотрим организацию исходного текста модуля:
Модуль начинается с описательного оператора заголовка модуля:
unit MyUnit1;
Имена файлов MyUnitl.pas, MyUnitl.dfm должны совпадать с именем, описанным в заголовке модуля MyUnitl. Наличие файла MyUnitl.dfm не является обязательным.
Между зарезервированными словами interface и implementatton находятся описательные операторы секции интерфейса. В интерфейсной части объявляются константы, типы, переменные, прототипы процедур и функций (только оператор заголовка без исполняемых операторов), которые должны быть доступны для использования в других модулях. Описания подключений других модулей осуществляются при помощи оператора uses, который может располагаться строго за оператором interface. Имена подключаемых модулей должны быть расположены в таком порядке, чтобы обеспечить последовательное описание всех нужных типов в данной интерфейсной секции и интерфейсных секций подключаемых модулей.
За зарезервированным словом implementation находятся описательные операторы секции реализации. В отличие от описаний секции интерфейса описания из секции реализации недоступны для других модулей, но доступ к ним возможен из данного модуля. Как и в секции интерфейса, может следовать оператор uses, а за ним объявления констант, типов, переменных. В отличие от секции интерфейса, процедуры и функции описываются вместе с их выполняемыми операторами. В секции должны быть определены как процедуры и функции из секции реализации, так и процедуры и функции, прототипы которых были объявлены в секции интерфейса. Код процедур и функций модуля, описанный в секции implementation, подключается (линкуется или связывается) к основной программе или к точкам вызова подпрограмм и функций в других модулях (через механизм линкера, работа которого определяется uses).
В необязательном разделе initialization размещаются операторы, которые выполняются сразу после запуска программы.
Раздел finalization не является обязательным, более того, он может присутствовать только в том случае, если в модуле присутствовала секция initialization. В секции размещаются операторы, которые выполняются непосредственно перед завершением программы.
2. ОБЪЕКТЫ И КЛАССЫ В ЯЗЫКЕ OBJECT PASCAL
В обычном языке Pascal существует тип-запись:
Тип-запись позволяет описывать структурированные переменные, содержащие несколько значений как одного, так и разных типов. В приведенном примере запись TmyRecord содержит поля MyFieIdI и MyField2, которые соответственно имеют типы String и Integer.
Тип-класс в Object Pascal по виду близок к записи, но отличается от записи возможностью наследования от других классов, а также возможностью описания методов класса. Классом в Object Pascal называется особый тип записи, который может иметь
в своем составе поля, методы и свойства. Такой тип также будем называть объектным типом:
В примере описан класс TMyObject, который наследуется от класса Tobject. Понятие «наследования классов» и понятие «свойства» будут подробно рассмотрены далее. Пока можно определить понятие свойства как поле, которое доступно не напрямую, а через посылку сообщений особым методам.
Класс TMyObject имеет поле MyField и методы MyMethodl и MyMethod2. Нужно заострить внимание на том, что классы могут быть описаны либо в секции интерфейса модуля Interface (под модулем здесь понимается файл с исходным кодом вида Unit), либо на верхнем уровне вложенности секции реализации Implementation. Не допускается описание классов внутри процедур и других блоков кода.
В случае если класс включает в себя поле с типом другого класса, разрешено опережающее объявление класса как в следующем примере:
Для того чтобы использовать новый тип в программе, нужно, как минимум, объявить переменную этого типа, которая называется или переменной объектного типа, или экземпляром класса, или объектом:
Согласно обычному языку Borland Pascal, переменная AMyObject должна содержать в себе весь экземпляр объекта типа TMyObject (код и данные вместе) — статический объект. Но в Delphi все объекты динамические, поэтому, не вдаваясь в подробности, выполним оператор:
Теперь другие объекты программы могут посылать сообщения данному объекту. Посылка сообщений заключается в вызове методов нужного объекта, например:
Методы — это процедуры и функции, описанные внутри класса. Как видно, посылка сообщений в Object Pascal близка к вызову процедур языка Pascal, но имени вызываемой процедуры или процедуры-функции предшествует имя конкретного объекта, например: AMyObject.
Опишем два объекта AMyObject, BMyObject одного класса TMyObject:
При проектировании программисты считают, что каждый объект (экземпляр класса) имеет свой внутренний код методов и индивидуальную память, где размещаются свои поля.
На самом деле методы у разных объектов одного класса общие. Другими словами, они реализуются общим кодом, расположенным только в одном месте памяти. Это экономит память. В приведенном примере вызов методов:
на самом деле приведет к исполнению одного и того же кода при моделируемой для программиста видимости принадлежности своего индивидуального кода разным объектам. Это сближает методы с процедурами и процедурами-функциями языка Pascal. Напомним, что указатель — это переменная, содержащая в памяти адрес (номер ячейки) другой переменной, процедуры или объекта. В состав класса входит указатель на специальную таблицу, где содержится вся информация, нужная для вызова методов. От обычных процедур и функций методы отличаются тем, что им при вызове передается (неявно) указатель на тот объект, который их вызвал. Внутри методов он доступен под зарезервированным именем Self.
Засылка и извлечение значений в поля, согласно не рекомендуемому в Object Pascal прямому доступу, практически не отличается от использования полей записи обычного языка Pascal:
В отличие от методов поля объекта — это данные, уникальные для каждого объекта, являющегося экземпляром даже одного класса. Поля AMyObject.MyField и BMyObject.MyField. являются совершенно разными полями, поскольку они располагаются в разных объектах.
3. ОБЛАСТИ ВИДИМОСТИ
При описании нового класса важен разумный компромисс. С одной стороны, требуется скрыть методы и поля, представляющие собой внутреннее устройство класса. Маловажные детали на других уровнях будут бесполезны и только помешают целостности восприятия. Доступ к важным деталям нужно организовать через систему проверок.
В языке Object Pascal введен механизм доступа к составным частям объекта, определяющий области, где ими можно пользоваться (т. е. области видимости). Поля и методы могут относиться к четырем группам, отличающимся областями сокрытия информации:
→ public — общие;
→ private — личные;
→ protected — защищенные;
→ published — опубликованные.
Деление на составные части работает на уровне файлов модулей (Unit в смысле языка Pascal). Если вы нуждаетесь в специальной защите объекта или его части, то для этого необходимо поместить его в отдельный модуль.
Поля, свойства и методы, находящиеся в секции public, не имеют ограничений на видимость. Они доступны из других функций и методов объектов как в данном модуле, так и во всех прочих, ссылающихся на него. Обычно методы данной секции образуют интерфейс между объектного обмена сообщениями в период выполнения программы (run-time).
Поля, свойства и методы, находящиеся в секции private, доступны только в методах класса и функциях, содержащихся в том же модуле, что и описываемый класс. Такая директива позволяет скрыть детали внутренней реализации класса от всех. Элементы из секции private можно изменять, и это не будет сказываться на программах, работающих с объектами этого класса. Единственный способ для кого-то другого — обратиться к ним переписать заново созданный вами модуль.
Раздел protected комбинирует функциональную нагрузку разделов private и public таким образом, что если вы хотите скрыть внутренние механизмы вашего объекта от конечного пользователя, этот пользователь не сможет в run-time использовать ни одно из объявлений объекта из его protected-области. Но это не помешает разработчику новых компонент использовать эти механизмы в других наследуемых классах, т. е. protected-объявления доступны у любого из наследников вашего класса.
Раздел published оказался необходимым при введении в Object Pascal возможности установки свойств и поведения компонент еще на этапе конструирования форм и самого приложения (design-time) в среде визуальной разработки программ Delphi. Именно published-объявления доступны через Object Inspector, будь это ссылки на свойства или обработчики событий. Во время исполнения приложения раздел объекта published полностью аналогичен public.
Следует отметить тот факт, что при порождении нового класса путем наследования возможен перенос объявлений из одного раздела в другой с единственным ограничением: если вы производите скрытие объявления за счет его переноса в раздел private, в дальнейшем его «вытаскивание» у наследника в более доступный раздел в другом модуле будет уже невозможен. Такое ограничение, к счастью, не распространяется на динамические методы-обработчики сообщений Windows.
Пример описания класса с заданными областями видимости приведен ниже.
4. ИНКАПСУЛЯЦИЯ
Классическое правило объектно-ориентированного программирования утверждает, что для обеспечения надежности нежелателен прямой доступ из других объектов к полям объекта: чтение и обновление их содержимого должно производиться посредством вызова соответствующих методов. Это правило и называется инкапсуляцией. До сих пор идея инкапсуляции внедрялась в программирование только посредством призывов и примеров в документации, но в языке же Object Pascal появилась соответствующая конструкция. В объектах Object Pascal пользователь объекта может быть полностью отгорожен от его полей при помощи свойств.
Работу со свойствами рассмотрим на следующем примере. Пусть мы создали при помощи дизайнера форм Delphi экранную форму Form l с двумя элементами визуальных компонент: Button l и Label 1 (рис. 1).
Кликнем кнопку Buttonl и отредактируем исходный текст модуля до следующего текста:
Сохраним проект (Save Project As). При сохранении проекта укажем новое имя модуля — testir и новое имя проекта — PrTestir. Рассмотрим текст получившегося файла проекта (пункты меню View и далее Project Source):
Данный файл содержит текст основной программы PrTestir. К основной программе подключается модуль Forms (для работы с формой) и исходный код модуля testir. Три исполняемых оператора основной программы последовательно организуют новый вычислительный процесс выполнения написанной программы PrTestir, создадут объект формы Form l, осуществят запуск программы на выполнение (Run).
В набранном примере текст модуля содержит сгенерированный текст объявления объектного типа Tform1. В типе содержатся указания на агрегацию в данном классе объекта кнопки Buttonl: Tbutton и объекта Labell: Tlabel. Благодаря агрегации экземпляры объектов кнопки и надписи будут создаваться одновременно с созданием экземпляра объекта формы, в результате чего как бы получится совместно работающий с кнопкой и надписью объект формы. В типе Tform l Delphi по двойному щелчку мыши по кнопке <Button1> сгенерировала прототип вызова метода:
procedure But ton lClick (Sender: TObject ) .
Также Delphi автоматически сгенерировала переменную объектного типа
var
Form l: TForm1;
и в секции реализации вставила текст «пустой» процедуры Button 1(jlick отработки действий по нажатию кнопки Buttonl.
Рассмотрим элементы, добавленные нами в текст модуля по реализации инкапсуляции. Итак, нами был набран текст описания класса TAnObject и переменная данного объектного типа TAnObject:
Обычно свойство (property) определяется тремя своими элементами: полем и двумя методами, которые осуществляют его запись/чтение:
В данном примере свойство Aproperty выполняет такую же функцию, какую в предшествующем примере выполняло поле MyField. Доступ к значению свойства Aproperty осуществляется через вызовы методов GetAProperty и SetAProperty. Однако в обращении к этим методам в явном виде нет необходимости (в рассматриваемом примере они даже защищены — protected), достаточно написать:
и компилятор оттранслирует эти операторы в вызовы методов. Рассмотрим три оператора, вписанные в текст «пустой» процедуры (метод) ButtonlClick:
Первый оператор создает экземпляр объекта. Второй оператор в недоступное по интерфейсу (protected) поле Fvalue засылает при помощи недоступной по интерфейсу (protected) процедуры An0bject.SetAProperty текст «Привет!». Третий оператор при помощи недоступной по интерфейсу (protected) процедуры AnObject.SetAProperty считывает данные из недоступного по интерфейсу поля Fvalue и засылает их в свойство Caption объекта надписи Label 1.
Само свойство AProperty описано как общедоступное по интерфейсу (public), т. е. внешне свойство выглядит в точности, как доступ к обычному полю, но за всяким обращением к свойству могут стоять нужные программисту действия. Например, если у нас есть объект, представляющий собой квадрат на экране, и мы его свойству «цвет» присваиваем значение «белый», то произойдет немедленная перерисовка, приводящая реальный цвет на экране в соответствие значению свойства.
В методах, входящих в состав свойств, может осуществляться проверка устанавливаемой величины на попадание в допустимый диапазон значений и вызов других процедур, зависящих от вносимых изменений. Если же потребности в специальных процедурах чтения и/или записи нет, то возможно вместо имен. методов применять имена полей.
Рассмотрим следующую конструкцию:
В этом примере чтение значения свойства AValue означает просто чтение поля FValue. Зато при присвоении ему значения внутри метода SetValue вызывается сразу два метода.
Если свойство должно только читаться или только записываться, то в его описании может присутствовать только соответствующий метод:
В этом примере вне объекта значение свойства можно лишь прочитать. Попытка присвоить значение Aproperty вызовет ошибку компиляции.
5. ОБЪЕКТЫ И ИХ ЖИЗНЕННЫЙ ЦИКЛ
Как создаются и уничтожаются объекты? В Object Pascal экземпляры объектов могут быть только динамическими! Это означает, что в приведенном в начале раздела фрагменте переменная AMyObject хотя и выглядит как статическая переменная языка Pascal, на самом деле является указателем, содержащим адрес объекта. Любая переменная объектного типа есть указатель (указатель — переменная, содержащая значение адреса оперативной памяти).
Память под конкретные объекты (динамические экземпляры классов) выделяется диспетчером памяти в периоде выполнения программы в особой heap-области, где должно еще быть свободное место для размещения новых объектов. Неар — «куча мусора». Диспетчер памяти может как размещать в heap-области новые объекты, так и удалять уже ненужные, освобождая память под все новые объекты. Как раз при размещении объекта в памяти инициализируется значение переменной объектного типа адресом объекта. При удалении объекта переменная объектного типа инициализируется значением nil (пустой указатель) — нет объекта в памяти. При размещении нового объекта в памяти может оказаться, что общая свободная память имеет большой объем, но любой из освободившихся участков памяти, занимаемых уже удаленными объектами, оказывается меньше объема нового большого объекта. Для избежание такой ситуации при использовании объектных программ устанавливают в ЭВМ оперативную память заведомо большого объема.
Новый экземпляр объекта создается особым методом — конструктором, а уничтожается специальным методом — деструктором:
В Object Pascal конструкторов у класса может быть несколько. Общепринято называть конструктор Create. Типичное название деструктора — Destroy. Рекомендуется использовать для уничтожения экземпляра объекта метод Free, который первоначально проверяет указатель (не равен ли он nil) и затем уж вызывают Destroy.
Для того чтобы правильно проинициализировать в создаваемом объекте поля, относящиеся к классу-предку, нужно сразу же при входе в конструктор вызвать конструктор предка:
Метод Create объекта MyObject типа TMyObject унаследован от класса предка TObject.
взяв любой из примеров, поставляемых вместе с Delphi, мы обнаружим, что там почти нет вызовов конструкторов и деструкторов. Дело в том, что любой компонент, попавший при визуальном проектировании в приложение из Палитры компонентов, включается в определенную иерархию. Иерархия эта замыкается на форме (TForm): для всех ее составных частей конструкторы и деструкторы вызываются автоматически, незримо для программиста.
Кто создает и уничтожает формы? Это делает приложение (глобальный объект с именем Application). В файле проекта (.DPR) можно увидеть вызов функции CreateForm, предназначенный для этой цели. Что же касается объектов, создаваемых динамически (во время выполнения приложения), то здесь нужен явный вызов конструктора.
6. НАСЛЕДОВАНИЕ
Вторым «столпом» ООП, помимо инкапсуляции, является наследование. Этот простой принцип означает, что если нужно создать новый класс, лишь немного отличающийся от старого, то совершенно нет необходимости в переписывании заново уже существующих полей и методов. Новый класс
является потомком, или дочерним классом старого класса, называемого предком, или родительским классом. Добавляются к нему лишь новые поля, методы и свойства.
В Object Pascal все классы являются потомками класса TObject. Поэтому если строится дочерний класс прямо от TObject, то в определении TObject можно не упоминать. Следующие два выражения одинаковы верны:
Использование последнего выражения оправдано, если разработчик хочет показать, что, согласно его замыслу, проектируемый класс как бы не имеет предков.
Приведем объявление базового для всех объектных типов класса TObject:
Такая архитектура возможна только при наличии механизма поддержки информации о типах — RTTI (RunTime Type Information). Основой такого механизма является внутренняя структура классов и, в частности, возможность доступа к ней за счет использования методов классов, описываемых конструкцией class function...
Унаследованные от предка поля и методы доступны в дочернем классе; если имеет место совпадение имен методов, то эти методы перекрываются.
По тому, какие действия происходят при вызове, методы делятся на группы:
→ статические (static);
→ виртуальные (virtual);
→ динамические (dynamic);
→ абстрактные (abstract).
Статические методы, а также поля в объектах-потомках ведут себя одинаково: можно без ограничений перекрывать старые имена и при этом изменять тип методов:
В этом примере разные методы с именем SetData присваивают значения разным полям с именем i. Перекрытое поле предка недоступно в потомке. В отличие от поля внутри других методов перекрытый метод доступен при указании зарезервированного слова inherited. Методы объектов по умолчанию являются статическими — их адрес определяется еще1на стадии компиляции проекта. Они вызываются быстрее всего.
Язык С++ позволяет так называемое множественное наследование. В этом случае новый класс может наследовать часть своих элементов от одного родительского класса, а часть — от другого, это наряду с удобствами зачастую приводит к проблемам.
В Object Pascal понятие множественного наследования отсутствует. Если необходимо, чтобы новый класс объединял свойства нескольких, можно породить классы-предки один от другого или включить в класс несколько полей, соответствующих этим желаемым классам.
Принципиально отличаются от статических методов виртуальные и динамические методы. Они могут быть объявлены путем добавления соответствующей директивы virtual или dynamic. Адрес таких методов определяется во время выполнения программы по специальной таблице. С точки зрения наследования методы .этих двух видов одинаковы: они могут быть перекрыты в дочернем классе только одноименными методами, имеющими тот же тип.
Общим для них является то, что при их вызове адрес определяется не во время компиляции, а во время выполнения путем поиска в специальных таблицах. Такой способ еще называется поздним связыванием. Разница между методами заключается в особенности поиска адреса.
Когда компилятор встречает обращение к виртуальному методу, он подставляет вместо обращения к конкретному адресу код, который обращается к специальной таблице и извлекает оттуда нужный адрес. Эта таблица называется таблицей виртуальных методов (Virtual Method Table, VMT), и она есть для каждого объектного типа. В ней хранятся адреса всех виртуальных методов класса независимо от того, унаследованы ли они от предка или перекрыты. Отсюда и достоинства, и недостатки, виртуальных методов: они вызываются сравнительно быстро (но медленнее статических), однако для хранения указателей на них требуется большое количество памяти.
Динамические методы вызываются медленнее, но позволяют более экономно расходовать память. Каждому динамическому методу системой присваивается уникальный индекс.
В таблице динамических методов (Dynamic Method Table, DMT) класса хранятся индексы и адреса только тех динамических методов, которые описаны в данном классе (базовая информация по обработке динамических методов содержится в модуле x:\delphi \source\rtl\sys\dmth.asm). При вызове динамического метода происходит поиск в этой таблице. В случае неудачи просматриваются все классы-предки в порядке иерархии и, наконец, TObject, где имеется стандартный обработчик вызова динамических методов. Экономия памяти налицо.
Для перекрытия и виртуальных, и динамических методов служит новая директива override, с помощью которой (и только с ней!) можно переопределять оба этих типа методов:
Первый из методов в примере создается заново, остальные два — перекрываются. Попытка применить override к статическому методу вызовет ошибку компиляции.
В Object Pascal абстрактными называются методы, которые определены в классе, но не содержат никаких действий, никогда не вызываются и должны быть переопределены в потомках класса. Абстрактными могут быть только виртуальные и динамические методы. Для этого используется директива abstract, указываемая при описании метода:
При этом никакого кода для этого метода писать не нужно. Как и ранее, вызов метода NeverCallMe приведет к ошибке времени выполнения.
Первый пример этого раздела поясняет, для чего нужно использование абстрактных методов. В данном случае класс Tfield не используется сам по себе; его основное предназначение — быть родоначальником иерархии конкретных классов — «полей» и дать возможность абстрагироваться от частностей. Хотя параметр у ShowData и описан как TField, но если поместить туда объект этого класса, произойдет ошибка вызова абстрактного метода.
7. ПОЛИМОРФИЗМ
Рассмотрим пример. Пусть у нас имеются некое обобщенное поле для хранения данных — класс TField и три его потомка — для хранения строк, целых и вещественных чисел:
В этом примере классы содержат разнотипные данные, которые «умеют» только сообщить о значении этих данных текстовой строкой (при помощи метода GetData). Внешняя по отношению к ним процедура ShowData получает объект в виде параметра и показывает эту строку.
Правила контроля соответствия типов (typecasting) языка Pascal говорят о том, что объекту как указателю на экземпляр объектного типа может быть присвоен адрес любого экземпляра любого из дочерних типов. В процедуре ShowData параметр описан как TField. Это значит, что в нее можно передавать объекты классов и TStringField, и TIntegerField, и TExtendedField, и любого другого потомка TField.
Но какой (точнее, чей) метод GetData при этом будет вызван? Тот, который соответствует классу фактически переданного объекта. Этот принцип называется полиморфизмом, и он, пожалуй, представляет собой наиболее важный «козырь» ООП. Допустим, имеется дело с некоторой совокупностью явлений или процессов. Чтобы смоделировать их средствами ООП, нужно выделить их самые общие, типовые черты. Те из них, которые не изменяют своего содержания, должны быть реализованы в виде статических методов. Те же, которые варьируют при переходе от общего к частному, лучше облечь в форму виртуальных методов. Основные «родовые» черты (методы) нужно описать в классе-предке и затем перекрыть их в классах-потомках. В предыдущем примере программисту, пишущему процедуру вроде ShowData, важно лишь одно: то, что любой объект, переданный в нее, является потомком TField, и он умеет сообщить о значении своих данных (выполнив метод GetData).
Если к примеру такую процедуру скомпилировать и поместить в динамическую библиотеку, то эту библиотеку можно будет раз и навсегда использовать без изменений, хотя будут появляться и новые, неизвестные в момент ее создания классы-потомки TField!
Наглядный пример использования полиморфизма дает сама Delphi. В ней имеется класс TComponent, на уровне которого сосредоточены определенные «правила» того, как взаимодействовать со средой разработки и с другими компонентами. Следуя этим правилам, можно порождать от TComponent свои компоненты, настраивая Delphi на решение специальных задач.
8. ОБРАБОТКА СООБЩЕНИЙ
Потребность в динамических методах особенно ощутима при разработке объектов, соответствующих элементам интерфейса Windows, когда каждый из большой иерархии объектов содержит обработчики десятков разнообразных сообщений.
Методы, предназначенные специально дня обработки сообщений Windows, составляют подмножество динамических методов и объявляются директивой message, за которой следует индекс — идентификатор сообщения. Они должны быть обязательно описаны как процедуры, имеющие один var-параметр, который может быть описан произвольно, например:
Для перекрытия методов-обработчиков сообщений директива override не используется. В этом случае нужно сохранить в описании директиву message с индексом метода. Необходимости изобретать собственные структуры, по-своему интерпретирующие содержание того или иного сообщения, нет: для большинства сообщений Windows типы уже описаны в модуле MESSAGES.
В обработчиках сообщений (и только в них) можно вызвать метод-предок, просто указав ключевое слово inherited, без указания его имени и преобразования типа параметров: предок будет найден по индексу. Следует напомнить, что система обработки сообщений встроена в Object Pascal на уровне модели объектов, и самый общий обработчик — метод DefaultHandler — описан в классе TObject.
9.СОБЫТИЯ И ДЕЛЕГИРОВАНИЕ
Работать с большим количеством сообщений, даже имея под рукой справочник, нелегко, поэтому одним из больших достижений Delphi является то, что программист избавлен от необходимости работать с сообщениями Windows (хотя такая возможность у него есть). Стандартных событий в Delphi не более двух десятков, и все они имеют простую интерпретацию, не требующую глубоких знаний среды.
Рассмотрим, как реализованы события на уровне языка Object Pascal. События — это свойства процедурного типа предназначенные для создания пользовательской реакции на те или иные входные воздействия:
Присвоить такому свойству значение — это означает указать объекту адрес метода, который будет вызываться в момент наступления события. Такие методы назовем обработчиками событий. Например
Это означает, что при каждой активизации Application (так называется объект, соответствующий работающему приложению) будет вызван метод-обработчик MyActivatingMethod.
Внутри библиотеки времени выполнения Delphi вызовы обработчиков событий находятся в методах, обрабатывающих сообщения Windows. Выполнив принципиально необходимые действия, этот метод проверяет, известен ли адрес обработчика, и, если это так, вызывает его:
В зависимости от происхождения и предназначения события имеют разные типы. Общим для всех является параметр Sender, указывающий на объект-источник события. Самый простой тип — TNotifyEvent — не имеет других параметров:
Тип метода, предназначенный для извещения о нажатии клавиши, предусматривает передачу программисту кода этой клавиши а передвижение мыши — ее координат и т. п.
Все события в Delphi принято именовать с «On»: OnCreate, OnMouseMove, OnPaint и т.д. Щелкнув в Инспекторе объектов на странице Events в поле любого события, автоматически получается заготовка метода нужного типа При этом его имя будет состоять из имени текущего компонента и имени события (без «On»), а относиться он будет к текущей форме. Пусть, например, на форме Forml есть текст Labell. Тогда для обработки щелчка мышью на нем (событие OnClick) будет создан метод Tform1. Labe11Click.
Поскольку события — это свойства объекта, их значения можно изменять во время выполнения программы. Такая замечательная возможность называется делегированием. Можно в любой момент взять способы реакции на события у одного объекта и делегировать их другому:
Но какой механизм позволяет подменять обработчики, ведь это не просто процедуры, а методы? Здесь как нельзя кстати приходится введенное в Object Pascal понятие указателя на метод. Помимо явно описанных параметров методу передается еще и указатель на вызвавший его экземпляр (Self). Вы можете описать тип процедуры, которая будет совместима по присваиванию с методом (т.е. предусматривать получение Self). Для этого в ее описание нужно добавить зарезервированные слова of Object. Указатель на метод — это указатель на такую процедуру:
Как в этом примере, так и повсюду в Delphi за свойствами-событиями стоят поля, являющиеся указателями на метод. Таким образом, при делегировании можно присваивать методы других классов. Здесь обработчиком события OnMyEvent объекта Objl по очереди выступают методы SetValuel и SetValue2 объекта Obj2.
10. ФУНКЦИИ КЛАССА
В Object Pascal имеется возможность определения полей процедурного типа. Очевидно, что в теле функций, привязываемых к этим полям, разработчику необходим доступ к другим полям объекта, методам и т. п. Возможность такого доступа базируется на передаче в эти функции неявного, но доступного в их коде параметра, автоматически принимающего значение поля объекта Self. Такие функции называются функциями классов. Для объявления функций классов необходимо использовать специальную конструкцию function ... оf object.
11. ПРИВЕДЕНИЕ ТИПОВ
На операции с переменной определенного типа компилятор обычно налагает ограничения, разрешая выполнение только тех операций, которые характерны для указанного типа данных. Иногда компилятор осуществляет автоматическое приведение типа, например, при присвоении целого значения действительной переменной.
В языке Pascal имеется механизм явного приведения типов.
В операции is определяется, принадлежит ли данный объект указанному типу или одному из его потомков. Выражение, представленное в следующем примере, возвращает True, если переменная AnObject ссылается на образец объектного типа TMyClass или одного из его потомков.
AnObject is TmyClass
Сама по себе операция is не является операцией задания типа. В ней лишь проверяется совместимость объектных типов. Для корректного приведения типа объекта применяется операция as:
With AnObject аs TmyClass do …
Возможен и такой способ приведения типа без явного указания as:
With TMyClass (AnObject) do …
В программах перед операцией as проверяю? совместимость типов с помощью операции is. Если типы несовместимы, запускается обработчик исключительной ситуации EinvalidCast.
Таким образом, в конструкции as операция явного приведения типа оказывается заключенной в безопасную оболочку:
12. ОБЪЕКТНАЯ ССЫЛКА
Delphi позволяет создать специальный описатель объектного типа (именно на тип, а не на экземпляр!), известный как object reference — объектная ссылка.
Объектные ссылки используются в следующих случаях:
— тип создаваемого объекта не известен на этапе компиляции; — необходим вызов метода класса, чей тип не известен на
этапе компиляции;
— в качестве правого операнда в операциях проверки и приведения типов с использованием is и as.
Объектная ссылка определяется с использованием конструкции class of.... Приведем пример объявления и использования class reference:
Таким образом, в Delphi определена специальная ссылка TClass, совместимая по присваиванию с любым наследником TObject. Аналогично объявлены классы: TPersistentClass и ТСотроnentClass.
13. СТРУКТУРНАЯ ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
Под исключительной ситуацией (raise) здесь понимается ситуация, которая не позволяет без особых дополнительных мер продолжить выполнение программы, например деления на ноль, переполнения разрядной сетки, извлечения квадратного корня из отрицательного числа и т.д.
При традиционной обработке ошибок, ошибки, обнаруженные в процедуре, обычно передаются наружу (в вызывавшую процедуру) в виде возвращаемого значения функции, параметров или глобальных переменных (флагов). Каждая вызывающая процедура должна проверять результат вызова на наличие ошибки и выполнять соответствующие действия. Часто это просто выход в более верхнюю вызывающую процедуру и т.д.
Структурная обработка исключительных ситуаций — это программный механизм, позволяющий программисту при возникновении ошибки (исключительной ситуации — exception) связаться с кодом программы, подготовленным для обработки такой ошибки. В Delphi система называется структурной, поскольку обработка ошибок определяется областью «защищенного» кода. Такие области могут быть вложенными. Выполнение программы не может перейти на произвольный участок кода. Выполнение программы может перейти только на обработчик исключительной ситуации активной программы.
Модель исключительных ситуаций в Object Pascal является не возобновляемой (non-resumable). При возникновении исключительной ситуации вы уже не сможете вернуться в точку, где она возникла, для продолжения выполнения программы (это позволяет сделать лишь возобновляемая (resumable) модель).
Для обработки исключительных ситуаций в язык Object Pascal добавлено новое ключевое слово «try», которое используется для обозначения первой части защищенного участка кода. Существуют два типа защищенных участков:
1) try..except;
2) try..finally.
Первый тип используется для обработки исключительных ситуаций. Его синтаксис:
Для уверенности в том, что ресурсы, занятые вашим приложением, освободятся в любом случае, можете использовать конструкцию второго типа. Код, расположенный в части finally, выполняется в любом случае, даже если возникает исключительная ситуация. Соответствующий синтаксис:
В приведенном ниже примере процедура А установила бы «охрану» со связанным обработчиком ошибки на фрагмент кода, в котором вызывается В. В просто вызывает С. Когда С обнаруживает ошибку, то создает (raise) исключительную ситуацию. Специальный код, сгенерированный компилятором и встроенный в Run-Time Library (RTL), начинает поиск обработчика данной исключительной ситуации. При поиске «защищенного» участка кода используется информация, сохраненная в стеке. В процедурах С и В нет такого участка, а в А — есть.
Если один из обработчиков ошибок, которые используются в А, подходит по типу для возникшей в С исключительной ситуации, то программа переходит на его выполнение. При этом область стека, используемая в В и С, очищается. Выполнение этих процедур прекращается.
Если в А нет подходящего обработчика, то поиск продолжается в более верхнем уровне, и так может идти» пока в процессе поиска не будет найден подходящий обработчик ошибок среди используемых по умолчанию обработчиков в RTL. Обработчики ошибок из RTL только показывают сообщение об ошибке и форсированно прекращают выполнение программы.
Любая исключительная ситуация, которая осталась необработанной, приведет к прекращению выполнения приложения.
При наличии исключительных ситуаций подпрограмма В не должна содержать дополнительный код для проверки возвращаемого результата и передачи его в А. В ничего не должна делать для передачи исключительной ситуации, возникшей в С, в процедуру А: встроенная система обработки исключительных ситуаций делает всю работу.
Ниже приведены процедуры А, В и С, обсуждавшиеся ранее, воплощенные в новом синтаксисе Object Pascal:
При ErrorCondition = True программа выдаст:
Возможно, вас удивила декларация типа 'ESample Error= class' вместо '=object', это еще одно новое расширение языка. Delphi вводит новую модель объектов, доступную через декларацию типа '= class'. Здесь же достаточно сказать, что исключительные ситуации (exceptions) являются классами, частью новой объектной модели.
Процедура С проверяет наличие ошибки (в нашем случае это значение глобальной переменной) и, если она есть (а это так), С вызывает (raise) исключительную ситуацию класса ESampleError.
Процедура А помещает часть кода в блок try..except. Первая часть этого блока содержит часть кода, аналогично конструкции begin..end. Эта часть кода завершается ключевым словом except, далее следует один или более обработчиков исключительных ситуаций on xxxx do уууу, затем может быть включен необязательный блок else, вся конструкция заканчивается end;. В конструкции, назначающей определенную обработку для конкретной исключительной ситуации (on хххх do уууу), после резервного слова on указывается класс исключительной ситуации, а после do следует собственно код обработки данной ошибки. Если возникшая исключительная ситуация подходит по типу к указанному после on, то выполнение программы переходит сюда (на код после do). Исключительная ситуация подходит в том случае, если она того же класса, что указан в on, либо является его потомком.
Например, в случае on EFileNotFound обрабатываться будет ситуация, когда файл не найден. А в случае on EFileIO — все ошибки при работе с файлами, в том числе и предыдущая ситуация. В блоке else обрабатываются все ошибки, не обработанные до этого.
Приведенные в примере процедуры содержат код (строка с writeln), который отображает путь выполнения программы. Когда с вызывает exception, программа сразу переходит на обработчик ошибок в процедуре А, игнорируя оставшуюся часть кода в процедурах В и С.
После того как найден подходящий обработчик ошибки, поиск оканчивается. После выполнения кода обработчика программа продолжает выполняться с оператора, стоящего после слова end блока try..except (в примере — writeln('Exit А')).
Конструкция try..except подходит, если известно, какой тип ошибок нужно обрабатывать в конкретной ситуации. Но что делать, если требуется выполнить некоторые действия в любом случае, произошла ошибка или нет? Это тот случай, когда понадобится конструкция try. finally.
Рассмотрим модифицированную процедуру В:
Если С вызывает исключительную ситуацию, то программа уже не возвращается в процедуру В. А что же с теми 1000 байтами памяти, захваченными в В? Строка FreeMem(P,1000) не выполнится? и вы потеряете кусок памяти. Как это исправить? Нужно ненавязчиво включить процедуру В в процесс, например:
Если в А поместить вызов New B вместо В, то программа выведет сообщения следующим образом:
Код в блоке finally выполнится при любой ошибке, возникшей в соответствующем блоке try. Он же выполнится и в том случае, если ошибки не возникло. В любом случае память будет освобождена. Если возникла ошибка, то сначала выполняется блок finally затем начинается поиск подходящего обработчика. В штатной ситуации после блока finally программа переходит на следующее предложение после блока.
Почему вызов GetMem не помещен внутрь блока try? Этот вызов может окончиться неудачно и вызвать exception EOutOf Memory. Если это произошло, то FreeMem попытается освободить память, которая не была распределена. Когда мы размещаем GetMem вне защищаемого участка, то предполагаем, что В сможет получить нужное количество памяти, а если нет, то более верхняя процедура получит уведомление EOutOfMemory.
А что, если требуется в В распределить четыре области памяти по схеме «все или ничего?». Если первые две попытки удались, а третья провалилась, то как освободить захваченную область памяти? Можно так:
Установив первоначально указатели в NIL, далее можно определить, успешно ли прошел вызов GetMem.
Оба типа конструкции try можно использовать в любом месте, допускается вложенность любой глубины. Исключительную ситуацию можно вызывать внутри обработчика ошибки, конструкцию try можно использовать внутри обработчика исключительной ситуации.
Первый тип конструкции. Вызов исключительной ситуации. В процедуре С из примера уже было видно, как должна поступать программа при обнаружении состояния ошибки — она вызывает исключительную ситуацию:
После ключевого слова raise следует код, аналогичный тому, что используется для создания нового экземпляра класса. Действительно, в момент вызова исключительной ситуации создается экземпляр указанного класса; данный экземпляр существует до момента окончания обработки исключительной ситуации и затем автоматически уничтожается. Вся информация, которую нужно сообщить в обработчик ошибки, передается в объект через его конструктор в момент создания.
Второй тип конструкции. Почти все существующие классы исключительных ситуаций являются наследниками базового класса Exception и не содержат новых свойств или методов. Класс Exception имеет несколько конструкторов, какой из них конкретно использовать, — зависит от задачи. Описание класса Exception можно найти в on-line Help.
До сих пор были рассмотрены механизмы защиты кода и ресурсов, логика работы программы в исключительной ситуации. Теперь )нужно немного разобраться с тем, как же обрабатывать возникшую ошибку. А точнее, как получить дополнительную информацию о коде ошибки, текст сообщения и т. п.
Как уже говорилось, при вызове исключительной ситуации (raise) автоматически создается экземпляр соответствующего класса, который и содержит информацию об ошибке. Весь вопрос в том, как в обработчике данной ситуации получить доступ к этому объекту.
Рассмотрим модифицированную процедуру А в нашем примере:
Пример демонстрирует еще одно новшество в языке Object Pascal — создание локальной переменной. В нашем примере локальной переменной является ESE — это тот самый экземпляр класса ESampleError, который был создан в процедуре С в момент вызова исключительного состояния. Переменная ESE доступна только внутри блока do. Свойство Message объекта ESE содержит сообщение, которое было передано в конструктор Create в процедуре С.
Есть еще один способ доступа к экземпляру exception — использовать функцию Exception Object:
Приложение 5. ОСНОВНЫЕ ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
Абстрагирование от проблемы — игнорирование ряда подробностей с тем, чтобы свести задачу к более простой задаче.
Абстрактная машина Дейкстры — применяется в проектировании архитектуры системы, самый нижний уровень абстракции — это уровень аппаратуры. Каждый уровень реализует абстрактную машину с все большими возможностями.
Абстрактный родительский класс — родительский класс, не имеющий экземпляров объектов.
Абстракция — мысленное отвлечение, обособление от тех или иных сторон, свойств или связей предметов и явлений для выявления существенных их признаков.
Абстракция сущности — произвольная абстракция. Объект представляет собой полезную модель некой сущности в предметной области.
Автоматизированная система (АС) — организационно-техническая система, обеспечивающая выработку решений на основе автоматизации информационных процессов в различных сферах деятельности (управление, проектирование, производство и т. д.) или их сочетаниях, система, состоящая из персонала и комплекса средств автоматизации его деятельности, реализующая информационную технологию выполнения установленных функций.
Автономное тестирование (тестирование модуля) (module testing) — контроль отдельного модуля в изолированной среде (например, с помощью ведущей программы), инспекция текста модуля на сессии программистов, которая иногда дополняется математическим доказательством правильности модуля.
Агрегированный объект — объект, составленный из подобъектов. Подобъекты называются частями агрегата, и агрегат отвечает за них.
Алгоритм — строго однозначно предопределенный порядок действий.
Альфа-тестирование (системное тестирование, лабораторные испытания) — фаза тестирования, выполняемая разработчиками для подтверждения, что все фрагменты правильно интегрированы в систему, а сама система работает надежно.
Анализ — процесс определения функционирования по заданному описанию системы.
Артефакт реализации — нечто, что нельзя обнаружить в постановке решаемой задачи, но необходимое для составления программы.
Архитектура системы — структура объединения нескольких программных средств в одно целое.
АС — см. автоматизированная система. Аттестация (certification) — авторитетное подтверждение правильности программы.
Бета-тестирование — это фаза общего тестирования, при которой программное изделие поставляется ограниченному кругу конечных пользователей для более жесткого тестирования.
Блочно-иерархический подход — частный эвроритм системного подхода, при котором процесс проектирования и представления о самом объекте расчленяется на иерархические уровни. На высшем уровне используется наименее детализированное представление, отражающее самые общие черты и особенности проектируемой системы. На каждом новом последовательном уровне разработки степень подробности рассмотрения возрастает, при этом система рассматривается не в целом, а отдельными блоками.
Визуальное моделирование — процесс графического представления модели с помощью некоторого стандартного набора графических элементов.
Внедрение — стадия, по завершении которой программная документация размножена в нужном количестве, программа установлена и сопровождается, пользователи обучены.
Восстанавливаемость программного обеспечения — свойство, характеризующее возможность приспосабливаться к обнаружению ошибок и их устранению.
Генетический анализ — исследование объекта на его соответствие законам развития программных систем. В процессе анализа изучается история развития (генезис) исследуемого объекта: конструкции аналогов и возможных частей, технологии изготовления, объемы тиражирования, языки программирования и т.д.
ГОСТ — государственный стандарт.
Деструктор — особый метод самого объекта, обеспечивающий уничтожение данного объекта.
Диаграмма вариантов использования — диаграмма, которая отображает взаимодействие между вариантами использования, представляющими функции системы, и действующими лицами, представляющими людей или системы, получающие или передающие информацию в данную систему.
Диаграмма классов — диаграмма, отражающая взаимодействие между классами системы.
Диаграмма компонент — диаграмма, показывающая, как выглядит модель на физическом уровне. На ней изображаются компоненты (файлы) программы и связи между ними.
Диаграмма кооперативная — диаграмма, отражающая ту же самую информацию, что и диаграммы последовательности, но связь со временем отсутствует.
Диаграмма последовательности — диаграмма, отражающая поток событий, происходящих в рамках варианта использования.
Диаграмма потоков данных (ДПД) — диаграмма, описывающая порядок изменения данных от их источников через преобразующие их процессы к их потребителям.
Диаграмма размещения — диаграмма, показывающая физическое расположение различных компонентов программной системы в сети.
Диаграмма состояний — диаграмма, предназначенная для моделирования различных состояний, в которых может находиться объект. В то время как диаграмма классов показывает статическую картину классов и их связей, диаграмма состояний применяется при описании динамики поведения системы.
Динамическое связывание — ассоциация запроса с объектом и одной из его операций во время выполнения.
Доказательство (proof) — попытки найти в программе ошибки путем доказательств на основе математических теорем о правильности программы, безотносительно к внешней программной среде.
Документ — документ, выполненный по заданной форме, в котором представлено какое-либо проектное решение.
ДПД — Диаграмма потоков данных.
Единая система программной документации (ЕСПД) — комплекс государственных стандартов, устанавливающий взаимоувязанные правила разработки, оформления и обращения программ и программной документации.
ЕСПД — Единая система программной документации
Жизненный цикл — совокупность взаимосвязанных процессов создания и последовательного изменения состояния продукции от формирования к ней исходных требований до окончания ее эксплуатации или потребления.
Заглушка — макет еще не реализованного модуля, необходимый при нисходящей реализации, представляет собой простейшую подпрограмму либо без действий, либо с действиями вывода входных данных, либо возвращающую в вышестоящие модули тестовые данные (которые обычно присваиваются внутри заглушки), либо содержащий комбинацию этих действий.
Иерархия — подчиненность.
Инкапсуляция — это механизм совмещения в классе полей данных с методами, которые манипулируют защищенными полями данных.
Интерфейс — это набор форматов допустимых сообщений. Для исключения возможных, но недопустимых сообщений, используется механизм сокрытия информации.
Испытание (validation) — попытка найти ошибки, выполняя программу в заданной программной среде.
Кодировщик программ — программист, пишущий и автономно тестирующий код компонент программ.
Комплексное тестирование (system testing) — контроль и/или испытание системы по отношению к исходным целям. Является процессом контроля, если оно выполняется в моделируемой среде, и процессом испытания при выполнении в реальной среде.
Композиция объектов — это реализация составного объекта, состоящего из нескольких совместно работающих объектов и образующих единое целое с новой, более сложной функциональностью.
Компонентный анализ — рассмотрение объекта, включающего в себя составные элементы и входящего, в свою очередь, в систему более высокого ранга.
Конструктор — особый метод класса, предназначенный для создания экземпляра объекта.
Контейнер-менеджер, или контейнер, — класс, позволяющий объединять (агрегировать) в себе самые разные классы объектов, в том числе и другие контейнеры.
Контроль (verification) — попытка найти ошибки, выполняя программу в тестовой или моделируемой среде.
Корректность программного обеспечения — свойство безошибочной реализации требуемого алгоритма при отсутствии таких мешающих факторов, как ошибки входных данных, ошибки операторов ЭВМ (людей), сбоев и отказов ЭВМ.
Критерий — показатель качества.
ЛПР — лицо, принимающее решение.
Метод — способ практического осуществления чего-нибудь.
Методика — совокупность методов практического выполнения чего-нибудь.
Методология (от греч. — «учение о методах») — система принципов и способов.
Метод мозгового штурма — метод синтеза вариантов систем, использующий взаимную стимуляцию мышления в группе.
Метод морфологических таблиц — согласно данному методу, для интересующего нас объекта формируется набор отличительных признаков: наиболее характерных подсистем, свойств или функций. Затем для каждого из них определяются альтернативные варианты реализации. Комбинируя альтернативные варианты, можно получить множество различных решений. Анализируя их, выделяют предпочтительные варианты.
Метод проб и ошибок — метод синтеза вариантов систем, основанный на последовательном выдвижении и рассмотрении идей.
Метод эвристических приемов — метод синтеза вариантов систем, базирующийся на выделении базовых приемов, найденных при анализе лучших программных изделий.
Методы объекта (methods, member functions) — подпрограммы, реализующие действия (выполнение алгоритмов) в ответ на их вызов в виде переданного сообщения.
Механизм сокрытия информации — механизм, используемый для исключения возможных, но недопустимых сообщений объектам.
Множественное наследование классов — наследование, при котором каждый класс может, в принципе, порождаться от одного или сразу от нескольких родительских классов, наследуя поведение всех своих предков.
Модель — один объект или система может выступать в роли модели другого объекта или системы, если между ними установлено сходство в каком-то смысле.
Модуль — фундаментальное понятие и функциональный элемент технологии структурного программирования, подпрограмма, но оформленная в соответствии с особыми правилами.
Модуль — в технологии объектно-ориентированного программирования это файл (unit) с описаниями родственных классов.
Модульность программ — основной принцип технологии структурного программирования, характеризуется тем, что вся программа состоит из модулей.
Наследование — определение класса и затем использование его для построения иерархии классов-потомков, причем каждый потомок наследует доступ к коду и данным всех своих классов прародителей.
Научно-исследовательская работа Д (HNP) — самостоятельный этап, проводимый для выявления последних научных достижений с целью их использования в проекте, проверки реализуемости изделия и уточнения отдельных его характеристик.
НИР — научно-исследовательская работа.
Нисходящее проектирование — один из главных принципов технологии структурного программирования, согласно которому при разработке иерархии модулей программ выделяются первоначально модули самого верхнего уровня иерархии, а затем подчиненные, модули.
Нисходящая реализация программы — в технологии структурного программирования первичная реализация группы модулей верхних уровней, которые называются ядром программы, и далее постепенно, в соответствии с планом, реализуются модули нижних уровней. Необходимые для линковки программы, недостающие модули имитируются заглушками
Обобщение — выявление в группе классов общих свойств и вынесение их в общий базовый класс.
Объект — логическая единица, содержащая всю информацию о некотором физическом предмете или реализуемом в программе понятии, структурированная переменная типа класс, которая содержит поля данных и методы с кодом алгоритма.
Объектная модель — модель, описывающая структуру объектов, составляющих систему, их атрибуты, операции, взаимосвязи с другими объектами. В объектной модели должны быть отражены те понятия и объекты реального мира, которые важны для разрабатываемой системы.
Объектно-ориентированное программирование (OOПp) (object-oriented programming) — это процесс реализации программ, основанный на представлении программы в виде совокупности объектов.
Объектно-ориентированное проектирование (OOП) (object-oriented design, OOD) — методология проектирования, соединяющая в себе процесс объектной декомпозиции и приемы представления логической и физической, а также статической и динамической моделей проектируемой системы.
Объектно-ориентированный анализ (ООА object-oriented analysis) — методология, при которой требования к системе воспринимаются с точки зрения классов и объектов, прагматически выявленных в предметной области.
Операционный подход к составлению алгоритмов — согласно этому подходу, операции (алгоритмические действия) выделяются последовательно по ходу пути вычислений при каких-то наборах данных.
Оптимизация разработки программ — нахождение разумного компромисса между достигаемой целью и затрачиваемыми на это ресурсами.
ОС — операционная система.
Отладка (debugging) не является разновидностью тестирования, а является средством установления точной природы ошибок.
Параметрический анализ — установление качественных пределов развития объекта: физических, экономических, экологических и др. Применительно к программам параметрами могут быть: время выполнения какого-нибудь алгоритма, размер занимаемой памяти и т.д.
Паспорт модуля — внутренний документ проекта, который обычно представляет собой конверт с именем модуля. Внутри конверта содержатся описания прототипа вызова самого модуля и модулей; вызываемых модулем данных; расшифровка входных и выходных переменных модуля; описание функции, выполняемой модулем; принципы реализации алгоритма модуля с описанием основных структур данных.
Паттерн проектирования — это образец, типовое решение какого-либо механизма объектно-ориентированной программы.
Планирование на всех стадиях проекта — основополагающий принцип проектирования, позволяет первоначально спланировать как состав стадий, так и продолжительность всех этапов работ. Такое планирование позволяет завершить разработку в заданный срок при заданных затратах на разработку. Далее планируется порядок и время интеграции модулей во все расширяющееся ядро. Планируются мероприятия по тестированию программы от ранних до заключительных этапов.
ПО — программное обеспечение автоматизированных систем.
Повторное использование — это использование в программе
класса для создания экземпляров или в качестве базового для создания нового класса, наследующего часть или все характеристики родителя. Повторное использование сокращает объем кода, который необходимо написать и оттестировать при реализации программы, что сокращает объемы труда.
Подпрограмма — некоторая последовательность инструкций, которая может вызываться в нескольких местах программы; программная единица, компилируемая независимо от остальных частей программы. В Объектно-ориентированном программировании соответствует методу.
Позднее связывание — связи между объектами определяются динамически во время выполнения программы, сам процесс связывания заключается в замене адресов памяти виртуальных функций.
Показатели качества (критерии) — величины, свойства, понятия, характеризующие систему с точки зрения субъекта, позволяющие оценить степень удовлетворения его потребностей.
Поле объекта (data members) — порция данных объекта, значения которых определяют текущее состояние объекта.
Полиморфизм — это средство для придания различных значений одному и тому же событию в зависимости от типа обрабатываемых данных, т. е. полиморфизм определяет различные формы реализации одноименного действия.
Порт — программный механизм накопления и верификации как входных, так и выходных данных в соответствующих очередях.
Потомок — класс, используемый характеристики другого класса посредством наследования.
Предок — это класс, предоставляющий свои возможности и характеристики другим классам.
Программный документ — документ, содержащий сведения, необходимые для разработки, изготовления, эксплуатации и сопровождения программного изделия.
Программное изделие — программа на носителе данных, являющаяся продуктом промышленного производства.
Программное обеспечение автоматизированных систем (ПО) — совокупность программ на носителях данных и программных документов, предназначенная для отладки, функционирования и проверки работоспособности автоматизированных систем.
Проект — совокупность проектных документов в соответствии с установленным перечнем, которая представляет результат проектирования.
Проектирование — это процесс создания описания (спецификации), необходимого для построения в заданных условиях еще несуществующего объекта на основе первичного описания этого объекта.
Проектная задача — задача, характеризующаяся неопределенностью априори информации: что требуется получить, что задано. Более того, получение способа решения задачи является объектом проектирования. И наконец, решение проектной задачи должно быть найдено в рамках ограничений внешней среды: доступных денежных средств, заранее заданных сроков, возможностями технических средств, состоянием теории программирования, программных заделов и т.д.
Проектная операция — действие или формализованная совокупность действий, составляющих часть проектной процедуры, алгоритм которых остается неизменным для ряда проектных процедур, например вычерчивание схемы, дифференцирование функции.
Проектная процедура (синоним — методика) — формализованная совокупность действий, выполнение которая оканчивается проектным решением. Например, проектной процедурой являются процедура раскрытия проектной ситуации, оптимизация, контроль, поиск решения.
Проектная ситуация — реальность (ситуация), в которой ведется проектирование.
Проектное решение — описание в заданной форме объекта проектирования или его части, необходимое и достаточное для определения дальнейшего направления проектирования.
Проектным документом называется документ, выполненный по заданной форме и представляющий какое-либо проектное решение.
Простое наследование классов — наследование, при котором определенный пользователем класс имеет только одного родителя. Схема иерархии классов в этом случае представляет собой ряд одиночно стоящих деревьев (hierarchical classification).
Рабочий проект (РП) — наименование стадии и программный документ, содержащий описание реализованного изделия.
Раннее связывание — связи между объектами определяются статически во время компиляции.
Резидентная программа — не удаляемая ОС программа, постоянно находящаяся в оперативной памяти ЭВМ.
Родитель — непосредственный класс-предок, стоящий у корня схемы иерархии, и от которого порождаются первые потомки, а от потомков еще потомки.
Родительский класс — начальный класс, от которого наследуются классы-потомки.
РП — рабочий проект. САПР — система автоматизированного проектирования. Свойства (property) — это особым образом оформленные методы, предназначенные как для чтения и контролируемого изменения внутренних данных объекта (полей), так и выполнения действий, связанных с поведением объекта.
Сессия программистов — встреча кодировщиков для проведения взаимной инспекции текстов программ и набора использованных тестов.
Синтез — это процесс построения описания системы по заданному функционированию.
Система — множество элементов, находящихся в отношениях и связях друг с другом, которое образует определенную целостность, единство.
Системный аналитик — программист, разрабатывающий проект от требований до внутренней структуры программы и участвующий в тестировании как при интеграции компонентов в ядро, так и в комплексном тестировании ПО.
Системный подход — об щек научный обобщенный эвроритм, предусматривающий всестороннее исследование сложного объекта с использованием компонентного, структурного, функционального, параметрического и генетического видов анализа.
Сквозной структурный контроль — использование на многих этапах проекта контроля корректности спецификации связей частей программы.
Слияние — объединение нескольких небольших, но тесно взаимодействующих классов в один.
Сопровождение — деятельность по оказанию услуг, необходимых для обеспечения устойчивого функционирования или развития программного изделия, включает анализ функционирования, развитие и совершенствование программы, а также внесение изменений в нее с целью устранения ошибок.
Спецификация — достаточно полное и точное описание решаемой задачи на этапах проекта.
Стадия проекта — одна из частей процесса создания программы, установленная нормативными документами и заканчивающаяся выпуском проектной документации, содержащей описание полной, в рамках заданных требований модели программы на заданном для данной стадии уровне, или изготовлением программ. По достижении стадии заказчик имеет возможность рассмотреть состояние проекта и принять решение по дальнейшему продолжению проектных работ.
Стратегия — наука, искусство генерации наиболее существенных общих целей и тактик их достижения.
Структура программы — искусственно выделенные программистом взаимодействующие части программы.
Структура данных программы — состав, а также описание носителей данных, участвующих в обмене как между отдельными частями программы, так и между вводимыми и выводимыми с/на внешних устройств.
Структурное кодирование модулей программ — основной принцип технологии структурного программирования, воспринятый технологией объектно-ориентированного программирования, который заключается в особом оформлении текстов модулей (методов). У модуля должен быть легко различимый заголовок с комментарием, поясняющим функциональное назначение модуля. Имена переменных должны быть мнемоническими. Суть переменных и порядок размещения в них информации должны быть пояснены комментариями, а код закодирован с использованием типовых алгоритмических структур.
Структурный анализ — выявление элементов объекта и связей между ними.
Структурный подход — набор принципов, характеризующий технологию структурного программирования: модульность программ; структурное кодирование модулей программ; нисходящее проектирование рациональной иерархии модулей программ; нисходящая реализация программы с использованием заглушек; осуществление планирования на всех стадиях проекта; сквозной структурный контроль программных комплексов в целом и составляющих их модулей.
СУБД — система управления базами данных.
Схема иерархии программы — используется в технологии структурного программирования, отражает только подчиненность модулей (подпрограмм), но не порядок их вызова или функционирование программы.
Сценарий — последовательность событий, которая может иметь место при конкретном выполнении системы.
Сценарий диалога программы — последовательность ввода и вывода информации в диалоговом режиме работы программы.
Тактика — совокупность средств и приемов для достижения намеченной цели и искусство их применения, организации и построения теоретической и практической деятельности, а также учение об этой системе.
Тестирование (testing) — процесс выполнения программы с намерением найти ошибки; может осуществляться как с ЭВМ, так и без ЭВМ.
Тестирование приемлемости (acceptance testing) — проверка соответствия программы требованиям пользователя.
Тестирование сопряжений (integration testing) — контроль сопряжений между частями системы как между компонентами в комплексе, так и между модулями отдельного компонента (например, у заглушки).
Тестировщик — программист, готовящий наборы тестов для отладки разрабатываемого программного изделия.
Технический проект (ТП) — комплект проектных документов на программу, разрабатываемый на стадии «Технический проект», утвержденный в установленном порядке, содержащий основные проектные решения по программе в целом, ее функциям и достаточный для разработки рабочего проекта.
Техническое задание (T3) — документ, оформленный в установленном порядке и определяющий цели создания программы, требования к программе и основные исходные данные, необходимые для ее разработки, а также план-график создания программы.
Технология визуального программирования — популярная парадигма программирования, состоящая в автоматизированной разработке программ с использованием особой диалоговой оболочки.
Технология объектно-ориентированного программирования — технология, ориентированная на получение программ, состоящих из объектов.
Технологии программирования — это апробированные стратегии создания программ, которые излагаются в виде методик с информационными фондами, описаниями проектных процедур и проектных операций.
Технология программирования Дейкстры, основанная на абстракции данных — в данной технологии во главе ставятся данные; сначала очень тщательно специфицируется выход, вход, промежуточные данные; большое внимание уделяется типизации данных с использованием структур для объединения близкой по смыслу информации в единые данные.
Технология структурного программирования — технология, основанная на структурном подходе.
Типизация — это способ защититься от использования объектов одного класса вместо другого или, по крайней мере, управлять таким использованием. Типизация заставляет нас выражать наши абстракции так, чтобы язык программирования, используемый в реализации, поддерживал соблюдение принятых проектных решений.
ТП — технический проект.
Управление разработкой программных систем (software management) — деятельность, направленная на обеспечение необходимых условий для работы коллектива разработчиков программного обеспечения, планирование и контроль деятельности этого коллектива с целью обеспечения требуемого качества ПО, выполнения сроков и бюджета разработки ПО.
Устойчивость программного обеспечения — свойство осуществлять требуемое преобразование информации при сохранении выходных решений программы в пределах допусков, установленных спецификацией при воздействии на программы таких факторов неустойчивости, как ошибки операторов ЭВМ, а также не выявленных ошибок программы.
Форма — визуальный компонент, обладающий свойством окна Windows.
Функция системы — совокупность действий системы, направленная на достижение определенной цели.
Функциональный анализ — рассмотрение объекта как комплекса выполняемых им функций.
Эвристика — наука, раскрывающая природу мыслительных операций человека при решении конкретных задач независимо от их конкретного содержания. В более узком смысле, эвристика — это догадки, основанные на опыте решения родственных задач.
Эвроритм — порядок действия человека при выполнении какой-то деятельности. В отличие от алгоритма может изменяться в процессе исполнения благодаря разумности исполнителя.
Экземпляр класса — объект.
Эксплуатационная документация — часть рабочей документации на программу, предназначенной для использования при эксплуатации программы, определяющей правила действия персонала и пользователей программы при ее функционировании, проверке и обеспечении ее работоспособности.
Эскизный проект (ЭЛ) — комплект проектных документов на программу, разрабатываемый на стадии Эскизный проект», утвержденный в установленном порядке, содержащий описание нескольких альтернативных вариантов реализации будущего изделия и уточненные требования на основе их анализа. Степень проработки при этом должна быть достаточной лишь для достижения возможности сравнения вариантов.
ЭТ — электронная таблица.
Этап проекта — часть стадии проекта, выделенная по соображениям единства характера работ и (или) завершающего результата или специализации исполнителей.
Ядро — все увеличивающаяся уже реализованная часть программы.
САSЕ-средства — это программные средства, поддерживающие процессы создания и сопровождения программных продуктов, включая анализ и формулировку требований, проектирование продукта и баз данных, генерацию кода, тестирование, документирование, обеспечение качества, конфигурационное управление и управление проектом, а также другие процессы.
CASE-средства вместе с системным программным обеспечением и техническими средствами образуют полную среду разработки программных систем.
САSЕ-технология (Computer Aided Software Engineering) — технология, представляющая собой методологию проектирования АС, а также набор инструментальных средств, позволяющих в наглядной форме моделировать предметную область, анализировать эту модель на всех этапах разработки и сопровождения программных систем и разрабатывать приложения в соответствии с информационными потребностями пользователей.
СОМ — Component Object Model.
Component Object Model (модель компонентных объектов) — спецификация метода создания компонент и построения из них программ.
CRC-карточка (Component, Responsibility, Collaborator — объект, обязанности, сотрудники) — промежуточный документ проекта, необходимый для специфицирования объектов.
DFD — ДПД (Data Flow diagrams).
RDD-проектирование (Responsibility-Driven-Design) — технология проектирования на основе обязанностей, предложенная Т. Бадтом. Данная технология по способу мышления аналогична разработке структуры служб какой-то организации: директора, заместителей директора, служб и подразделений.