Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Лекции - Высокоуровневые методы информатики и программирования (ВМИП) - файл 1.doc


Лекции - Высокоуровневые методы информатики и программирования (ВМИП)
скачать (2205.5 kb.)

Доступные файлы (1):

1.doc2206kb.04.12.2011 09:12скачать

содержание
Загрузка...

1.doc

1   2   3   4   5   6   7   8   9   10   11
Реклама MarketGid:
Загрузка...

^ 5.2. Менеджер проекта (Project Manager)

Предназначен для управления составными частями разрабатываемого приложения.

Вызывается по команде ^ View/Project Manager

С помощью менеджера выполняются операции:

  • просмотр части проекта,

  • удаление отдельных частей проекта,

  • добавление к проекту новой части.

Открыть модуль для редактирования можно двойным щелчком мыши по имени файла в списке окна.

Менеджер Проекта позволяет объединять проекты которые работают вместе в одну проектную группу. Это позволяет организовать как работу взаимозависимых проектов, таких как однозначные и многозадачные приложения или DLL, так и совместную работу исполняемых программ.

На рис. Показано окно Project Manager с открытым проектом Apple.
В списке окна можно открыть какой-либо модуль для просмотра или редактирования двойным щелчком мыши по его имени или командой Open контекстного меню этого файла.

^ 5.3. Встроенный отладчик (Debugger)

Облегчает поиск и устранение ошибок в приложениях.

Средства отладчика доступны:

  • с помощью команд пункта меню Run (Выполнение);

  • и подменю View / Debug Windows (Просмотр/Окна отладки).

Действия отладчика:

  • выполнение до указанного оператора (строки кода),

  • пошаговое выполнение приложения,

  • выполнение до точки останова,

  • включение и выключение точек останова,

  • просмотр значений объектов, в окне просмотра,

  • установка значений объектов при выполнении приложения.


Установка параметров отладчика выполняется с помощью команды Tools / Debugger Options (Параметры отладчика).
^ 5.4. Обозреватель проекта (Project Browser)

Позволяет перемещаться по:

- иерархии классов,

  • модулям и

  • глобальным символам приложения.

Вызывается командой View / Browser (Просмотр / Обозреватель).
Для просмотра в окне левой части доступны три типа объектов:

  • Globals (Глобальные символы),

  • Classes (Классы) и

  • Units (Модули).

В правой части панели окна доступны для просмотра:

  • Scope (Пределы),

  • Inheritance (Иерархия) и

  • References (Ссылки).

Управление отображением данных осуществляется с помощью мыши.

Для управления параметрами отображенных объектов используется команда ^ Tools/Environment Options/Explorer
С помощью обозревателя проекта можно перебирать используемые программой модули и просматривать символы в разделах interface или implementation; можно перебирать глобальные символы приложения, просматривать их объявления и переходить к ссылкам на них в исходном коде.

Окно обозревателя проекта разделено на две части. Слева в иерархическом виде отображаются доступные для выбранной страницы объекты, а справа для выбранного объекта более детально отображаются его характеристики.
В зависимости от выбранного типа просматриваемого объекта в правой части могут быть доступны следующие варианты детального просмотра характеристик: Scope, Inheritance, References

Можно отображать или скрывать соответствующие объекты, например переменные или константы модуля.
^ 5.5. Хранилище объектов

Одни и те же объекты можно использовать в качестве шаблонов для разработки приложений.

Эти объекты находятся в хранилище (Repository).

Их можно просмотреть в окне New Items (Новые элементы), вызвав командой File/New… В хранилище находятся шаблоны приложений, форм, отчетов, Мастера форм.

Объекты добавляются различными способами:

  • Copy – в проект добавляется копия из хранилища.

Все изменения в объекте являются локальными и не затрагивают оригинал;

  • Inherit – от объекта из хранилища порождается (наследуется) новый объект и добавляется к проекту. Все модификации с объектом в проекте нельзя удалить.

Use – в проект включается непосредственно сам объект из хранилища со всеми файлами. При изменении в проекте этого объекта изменяется и объект в хранилище.
Объекты объединены в группы и размещаются на отдельных страницах:

  • New – Базовые объекты,

  • ActiveX – Объекты ActiveX и OLE,

  • Multitier – Объекты многопоточного приложения,

  • Project 1 – Формы создаваемого приложения,

  • Form – Формы,

  • Dialogs – Диалоги,

  • Data Modules – Модули данных,

  • Projects – Проекты,

  • Business –Мастера форм.


Название стр. Apple совпадает с названием создаваемого проекта. Сама страница содержит уже созданную форму. При изменении названия проекта или формы изменяются их названия в хранилище объектов. При добавлении или удалении формы ее шаблон соответственно добавляется или исключается из хранилища объектов. При добавлении объекта к проекту выбирается нужная страница, выделяется объект и подтверждается ОК.

5.6. Справочная система

В состав справочной системы входят:

  • стандартная система справки (с тремя вкладками);

  • справочная помощь через Internet (запуск браузера);

  • контекстно-зависимая справочная помощь(клавишаF1)

отображаемая справка зависит от активизации объекта.

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

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

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

Лекция 4

Введение в объектно-ориентированное программирование.
1. Понятие класса

2. Понятие объекта

3. Создание и уничтожение объектов

4. Свойства

5. События
Понятие класса.
Классом в Delphi называется особый тип, который может иметь в своем составе поля, методы и свойства. Такой тип также называют объектным типом.
type

tMyClass=class(tObject)

fMyFiled: integer;

function MyMethod: integer;

end;
Поля класса аналогичны полям записи. Это - данные, уникальные в программе для каждого созданного в программе экземпляра класса. Описанный выше класс tMyClass имеет одно поле - fMyFiled. В отличие от полей, методы у двух экземпляров одного класса общие. Методы - это процедуры и функции, описанные внутри класса, и предназначенные для операций над его полями. В состав класса входит указатель на специальную таблицу - таблицу виртуальных методов (VMT), в которой содержится вся информация, необходимая для вызова методов. От обычных процедур и функций методы отличаются тем, что при вызове в них передается указатель на экземпляр класса, который их вызвал. Поэтому обрабатываться будут поля именно того объекта, который вызвал метод. Внутри методов указатель на вызвавший их объект доступен через зарезервированное слово Self. Свойством класса называется совокупность поля и методов чтения/записи, обеспечивающих доступ к этому полю. При этом само поле декларируется как private (доступно только внутри данного класса), и доступ к нему возможен только посредством соответствующих методов. Подробнее свойства будут обсуждаться ниже.
Понятие объекта
Чтобы использовать новый тип в программе, нужно, как минимум, определить переменную этого типа. Переменная объектного типа называется экземпляром типа или объектом:
var aMyObject: tMyClass;
До введения понятия “класс” в языке Pascal существовала двусмысленность определения “объект”, который мог обозначать и тип, и переменную этого типа. Теперь существует четкая граница: класс - это описание, объект - то, что создано в соответствии с этим описанием.
Создание и уничтожение объектов
В отличие от С++ и Turbo Pascal в Delphi объекты могут быть только динамическими!!!. Это означает, что в приведенном выше примере переменная aMyObject на самом деле является указателем, содержащем адрес объекта.
^ Объект создается конструктором и уничтожается деструктором.
aMyObject := tMyClass.Create;

//

// действия с созданным объектом

//

aMyObject.Destroy;
Следует обратить внимание на то, что для создания объекта aMyObject вызывается метод класса tMyClass.Create. Конструктор класса (и ряд других методов) успешно работает и до создания объекта. Однако большинство обычных методов (в частности все виртуальные и динамические методы). Вызывать до инициализации объекта не следует.
В Delphi конструкторов у класса может быть несколько. Общепринято называть конструктор Create, в отличие от Turbo Pascal, где конструкторы назывались Init, и С++, в котором имя конструктора совпадает с именем класса. Типичное название деструктора - Destroy.
type

tMyClass=class(tObject)

fMyFiled: integer;

Constructor Create;

Destructor Destroy;

function MyMethod: integer;

end;
Для уничтожения объекта в Delphi рекомендуется использовать не деструктор, а метод Free, который первоначально проверяет указатель, и только затем вызывает деструктор Destroy:
procedure tObject.Free;
До передачи управления телу конструктора происходит собственно создание объекта: под него отводится память, значения всех полей обнуляются. Далее выполняется код конструктора, написанный программистом для инициализации объектов данного класса. Таким образом, несмотря на то, что синтаксис конструктора схож с вызовом процедуры (отсутствует возвращаемое значение), на самом деле конструктор - это функция, возвращающая созданный и проинициализированный объект.
Примечание. Конструктор создает новый объект только в том случае, если перед его именем указано имя класса. Если указать имя уже существующего объекта, он поведет себя по-другому: не создаст новый объект, а только выполнит код, содержащийся в теле конструктора.
Чтобы правильно проинициализировать в создаваемом объекте поля, относящиеся к классу - предку, нужно сразу же при входе в конструктор вызвать конструктор предка при помощи зарезервированного слова inherited:
constructor tMyClass.Create;

Begin

inherited Create;

// Код инициализации tMyClass

End;
Как правило, в коде программ, написанных на Delphi, практически не встречается вызовов конструкторов и деструкторов. Дело в том, что любой компонент, попавший при визуальном проектировании в приложение из палитры компонентов, включается в определенную иерархию. Эта иерархия замыкается на форме (класс tForm): для всех ее составных частей конструкторы и деструкторы вызываются автоматически, незримо для программиста. Кто создает и уничтожает формы? Это делает приложение (объект с именем Application). В файле проекта (с расширением DPR) вы можете увидеть вызовы метода Application.CreateForm, предназначенного для этой цели.
Что касается объектов, создаваемых динамически (во время выполнения программы), то здесь нужен явный вызов конструктора и метода Free.
Свойства
Как известно, существует три основных принципа, составляющих суть объектно-ориентированного программирования: инкапсуляция, наследование и полиморфизм. Классическое правило объектно-ориентированного программирования утверждает, что для обеспечения надежности нежелателен прямой доступ к полям объекта: чтение и изменение их содержимого должно осуществляться посредством вызова соответствующих методов. Это правило называется инкапсуляцией (сокрытие данных). В старых реализациях ООП (например в Turbo Pascal) эта мысль внедрялась только посредством призывов и примеров в документации; в Delphi есть соответствующая конструкция. Пользователь объекта в Delphi может быть полностью отгорожен от полей объекта при помощи свойств.
Обычно свойство определяется тремя элементами: полем и двумя методами осуществляющими его чтение/запись:
type

tMyClass=class(tObject)

function GetaProperty: tSomeType;

procedure SetaProperty(Value: tSomeType);

property aProperty: tSomeType read GetaProperty

write SetaProperty;

end;
В данном примере доступ к значению свойства aProperty осуществляется через вызовы методов GetaProperty и SetaProperty, однако в обращении к этим методам в явном виде нет необходимости: достаточно написать
aMyObject.aProperty:=aValue;

aVarable:= aMyObject.aProperty;
и Delphi откомпилирует эти операторы в вызовы соответствующих методов. То есть внешне свойство выглядит в точности как обычное поле, но за всяким обращением к нему могут стоять вызовы необходимых программисту методов. Например, если есть объект, представляющий собой квадрат на экране, и его свойству “цвет” присваивается значение “белый”, то произойдет немедленная прорисовка, приводящая реальный цвет на экране в соответствие значению свойства.
В методах, устанавливающих значения свойства, может производиться проверка значения на попадание в заданный диапазон значений и вызов других процедур зависящих от вносимых изменений. Если же потребности в специальных процедурах чтения/записи нет, можно вместо имен методов применять имена полей.
tPropClass=class

fValue: tSomeType;

procedure SetValue(aValue: tSomeType);

property Value:tSomeType read fValue write SetValue;

End;
В этом примере поле fValue модифицируется при помощи метода SetValue, а читается напрямую.
Если свойство должно только читаться или только записываться, в его описании может присутствовать только соответствующий метод:
tReadOnlyClass=class

property NotChanged:tSomeType read GetNotChanged;

End;
В этом примере свойство доступно только для чтения. Попытка присвоить значение свойству NotChanged вызовет ошибку компиляции.
Свойствам можно присваивать значения по умолчанию. Для этого служит ключевое слово default:
Property Visible:boolean read fVisible write SetVisible default TRUE;
Это означает, что при запуске программы свойство будет установлено компилятором в TRUE.
Свойство может быть и векторным. В этом случае оно выглядит как массив:
Property Points[index:integer]:tPoint read GetPoint write SetPoint;
Для векторного свойства необходимо описать не только тип элементов массива, но также и тип индекса. После ключевых слов read и write должны идти имена соответствующих методов. Использование здесь полей массивов недопустимо. Метод, читающий значение векторного свойства, должен быть описан как функция, возвращающая значение того же типа, что и элементы свойства, и имеющая единственный параметр того же типа и с тем же именем, что и индекс свойства:
function GetPoint(index:integer):tPoint;
Аналогично, метод, помещающий значения в такое свойство, должен первым параметром иметь индекс, а вторым - переменную нужного типа.
procedure SetPoint(index:integer; Value:tPoint);
У векторных свойств есть еще одна важная особенность: некоторые классы в Delphi (списки tList, наборы строк tStrings и т.д.) “построены” вокруг одного основного векторного свойства. Основной метод такого класса дает доступ к элементам некоторого массива, а все основные методы являются как бы вспомогательными. Для упрощения работы с объектами подобного класса можно описать подобное свойство с ключевым словом default:
type tMyList=class

property list[Index:integer]:string read Getlist write Setlist; default;

end;
Если у объекта есть такое свойство, его можно не упоминать, а ставить индекс в квадратных скобках сразу после имени объекта:
var MyList:tMyList

Begin

MyList.list[1]:=’First’; {Первый способ}

MyList.[2]:=’Second’; {Первый способ}

End;
Употребляя ключевое слово default необходимо соблюдать осторожность, т.к. для обычных и векторных свойств оно употребляется в разных значениях.
О роли свойств в Delphi красноречиво говорит тот факт, что у всех имеющихся в распоряжении программиста стандартных классов 100% полей недоступны и заменены базирующимися на них свойствами. Того же правила следует придерживаться и при разработке собственных классов.
События
Операционная система Windows® основана на сообщениях. Сообщения эти возникают в результате действий пользователя, аппаратуры компьютера или других программ. Таких сообщений в Windows сотни, и по большому счету, написать программу для Windows - значит определить реакцию на некоторые из них.
Работать с таким количеством сообщений, даже имея под рукой справочник, нелегко. Поэтому одним из главных преимуществ Delphi является то, что программист полностью избавлен от необходимости работать с сообщениями Windows (хотя такая возможность у него имеется). Типовых событий в Delphi - не более двух десятков, и все они имеют простую интерпретацию, не требующую глубоких знаний среды.
С точки зрения языка, событие - это поле процедурного типа, предназначенное для создания пользовательской реакции на те или иные входные воздействия:
Property OnMyEvent: tMyEvent read FMyEvent write FMyEvent;
Здесь OnMyEvent - поле объекта, содержащее адрес некоторого метода. Присвоить такому свойству значение - значит указать программе адрес метода, который будет вызываться в момент наступления события. Такие методы называются обработчиками событий.
Внутри библиотеки времени выполнения Delphi вызовы обработчиков событий находятся внутри методов, обрабатывающих сообщения Windows. Выполнив необходимые действия, этот метод проверяет, известен ли адрес обработчика, и, если это так, вызывает его.
^ События имеют разное количество и тип параметров, в зависимости от происхождения и назначения. Общим для всех события является параметр Sender - он указывает на объект, вызвавший событие. Самое простое событие - tNotifyEvent - не имеет других параметров.

tNotifyEvent = procedure(Sender:tObject) of object;
Тип метода, предназначенный для извещения о нажатии клавиши, предусматривает передачу в процедуру кода этой клавиши, о передвижении мыши - ее текущих координат и т.д.
Имя события в Delphi начинается с префикса On: OnClick, OnCreate, OnMouseDown и т.д. Имена методов - обработчиков событий состоят из имени объекта, генерирующего событие, и корня имени события: OkButtonClick. Дважды щелкнув мышью в инспекторе объектов на странице Events в поле напротив любого события, вы получите скелетный код (заготовку) этого события.
Поскольку события - это свойства объекта, их значения можно менять в любой момент во время выполнения программы. Эта возможность называется делегированием. Можно в любой момент взять способы реакции на события у одного объекта и присвоить (делегировать) их другому.
Принцип делегирования позволяет избежать трудоемкого процесса порождения новых классов для каждого специфического случая, заменяя нго простой подстановкой процедур.
Один и тот же обработчик может обрабатывать события от разных объектов. Типичный пример - в современных программах одно и то же действие можно вызвать несколькими способами - через главное меню, контекстное меню и т. д. Этого легко добиться, назначив один и тот же обработчик всем необходимым объектам в инспекторе объектов, разумеется, события должны быть одного и того же типа.
Более сложный случай - когда внутри обработчика необходимо определить, какой именно объект вызвал событие. Если объекты, которые потенциально могут это сделать, имеют разный тип, то именно их тип можно применить в качестве критерия:
If Sender is tMenuItem then ...
Если же все объекты, разделяющее между собой один обработчик события, относятся к одному классу, можно использовать свойство tObject.Tag.
Ниже приведены названия некоторых, наиболее употребительных событий Delphi:
Событие - Тип обработчика - Когда возникает
OnClick - TNotifyEvent - При нажатии левой клавиши мыши
OnActivate - TnotifyEvent - После передачи объекту фокуса
OnCreate - TnotifyEvent - После создание объекта
OnDestroy - TnotifyEvent - Перед уничтожением объекта
OnDeactivate - TnotifyEvent - Перед уходом фокуса из объекта
OnKeyPress - TkeyPressEvent - При нажатии клавиши
OnMouseDown - TmouseEvent - При нажатии клавиши мыши
OnMouseMove - TmouseMoveEvent - При движении мыши над объектом
OnMouseUp - TmouseEvent - При отпускании клавиши мыши
а также их типы:
Тип

Описание
TnotifyEvent

type TnotifyEvent = procedure (Sender: TObject) of object;
TkeyPressEvent

type TkeyPressEvent = procedure (Sender: TObject; var Key: Char) of object;
TmouseEvent

TmouseEvent = procedure (Sender: TObject; Button: TmouseButton; Shift: TShiftState; X, Y: Integer) of object;
TmouseMoveEvent

TmouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;
Стандартные события описаны в модуле Classes.

Лекция 5

Инкапсуляция. Наследование. Полиморфизм.
1. Наследование

2. Полиморфизм. Виртуальные и динамические методы

3. Методы и описание

4. Перегрузка методов

5. Абстрактные методы

6. Инкапсуляция
Наследование
Вторым “столпом” ООП является наследование. Этот простой принцип означает, что если необходимо создать новый класс, лишь немного отличающийся от уже имеющегося, нет необходимости в переписывании заново уже существующего кода. Вы объявляете, что новый класс
tNewClass=class(tOldClass);
является потомком или дочерним классом класса tOldClass, называемого предком или родительским классом, и добавляете к нему новые поля методы и свойства.
В Delphi все классы являются потомками класса tObject. Поэтому, если вы строите дочерний класс прямо от tObject, то в определении его можно не упоминать. Следующие два описания одинаково верны:
tMyClass=class(tObject);

tMyClass=class;
Более подробно класс tObject будет рассмотрен ниже.
Унаследованные от класса-предка поля и методы доступны в дочернем классе; если имеет место совпадение имен методов, говорят, что они перекрываются.
Рассмотрим поведение методов при наследовании. По тому, какие действия происходят при вызове, методы делятся на три группы. В первую группу отнесем статические методы, во вторую - виртуальные (virtual) и динамические (dynamic) и, наконец, в третью - появившиеся только в Delphi 4 перегружаемые (overload) методы.
Статические методы, а также любые поля в классах-потомках ведут себя одинаково: можно без ограничений перекрывать старые имена и при этом менять тип методов. Код нового статического метода полностью перекрывает (заменяет собой) код старого метода:
type

tFirstClass=class

fData:Extended;

procedure SetData(aValue:Extended);

end;
tSecondClass=class(tFirstClass)

fData:Integer;

procedure SetData(aValue:Integer);

end;
procedure tFirstClass.SetData(aValue:Extended);

Begin

fData:=1.0;

End;
procedure tFirstClass.SetData(aValue:Extended);

Begin

fData:=1;

inherited SetData(0.99);

End;
В этом примере разные методы с именем SetData присваивают значение разным полям с именем fData. Перекрытое (одноименное) поле предка недоступно в потомке. Поэтому два одноименных поля с именем fData приведены только для примера.
В отличие от поля, внутри других методов перекрытый метод доступен при указании ключевого слова inherited. По умолчанию методы объектов классов статические - их адрес определяется еще на этапе компиляции проекта, поэтому они вызываются быстрее всего.
Принципиально отличаются от статических виртуальные и динамические методы. Они должны быть объявлены путем добавления соответствующей директивы dynamic или virtual. С точки зрения наследования методы этих двух категорий одинаковы: они могут быть перекрыты в дочернем классе только одноименными методоми, имеющими тот же тип.
Полиморфизм. Виртуальные и динамические методы
Рассмотрим следующий пример. Пусть имеется некое обобщенное поле для хранения данных - класс tFiled и три его потомка - для хранения строк, целых и вещественных чисел:
type

tFiled = class

function GetData:string; virtual; abctract;

end;
tStringFiled = class(tFiled)

fData:string;

function GetData: string; override;

end;
tIntegerFiled = class(tFiled)

fData:Integer;

function GetData: string; override;

end;
tExtendedFiled = class(tFiled)

fData:Extended;

function GetData: string; override;

end;
function tStringFiled.GetData: string;

Begin

Result:=fData;

End;
function tIntegerFiled.GetData: string;

Begin

Result:=IntToStr(fData);

End;
function tExtendedFiled.GetData: string;

Begin

Result:=FloatToStr(fData,ffFixed, 7, 2);

End;
function ShowData(aFiled:tFiled): string;

Begin

Form1.Label1.Caption:=aFiled.GetData;

End;
В этом примере классы содержат разнотипные поля данных fData, а также имеют унаследованный от tFiled виртуальный метод GetData, возвращающий данные в виде строки. Внешняя по отношению к ним процедура ShowData получает объект в виде параметра и показывает эту строку.
Согласно правилам контроля соответствия типов (typecasting) ObjectPascal, объекту, как указателю на экземпляр класса, может быть присвоен адрес экземпляра любого из дочерних типов. Это означает, что в предыдущем примере в процедуру ShowData можно передавать объекты классов tStringFiled, tIntegerFiled, tExtendedFiled и любого другого потомка tFiled.
Но какой (точнее, чей) метод GetData будет при этом вызван? Тот, который соответствует классу фактически переданного объекта. Этот принцип называется полиморфизмом.
Возвращаясь к рассмотренному выше примеру, отметим, что у компилятора нет возможности определить класс объекта, фактически переданного в процедуру ShowData на этапе компиляции. Механизм, позволяющий определить этот класс прямо во время выполнения называется поздним связыванием. Естественно, такой механизм должен быть связан с передаваемым объектом. Для этого служит таблица виртуальных методов (Virtual Method Table, VMT) и таблица динамических методов (Dynamic Method Table, DMT).
Различие между виртуальными и динамическими методами заключается в особенности поиска адреса. Когда компилятор встречает обращение к виртуальному методу, он подставляет вместо прямого вызова по конкретному адресу код, который обращается к VMT и извлекает оттуда нужный адрес. Такая таблица есть для каждого класса. В ней хранятся адреса всех виртуальных методов класса, независимо от того, унаследованы ли они от предка или перекрыты в данном классе. Отсюда и достоинства и недостатки виртуальных методов: они вызываются сравнительно быстро, однако для хранения указателей на них в таблице VMT требуется большое количество памяти.
Динамические методы вызываются медленнее, но позволяют более экономно расходовать память. Каждому динамическому методу системой присваивается уникальный индекс. В таблице динамических методов класса хранятся индексы только тех методов только тех динамических методов, которые описаны в данном классе. При вызове динамического метода происходит поиск в этой таблице. В случае неудачи просматриваются DMT всех классов-предков в порядке их иерархии и, наконец, tObject, где имеется стандартный обработчик вызова динамических методов. Экономия памяти очевидна.
Для перекрытия и виртуальных и динамических методов служит директива override, с помощью которой (и только с ней!) можно переопределять оба этих типа методов.
type

tParentClass=class

fFirstFiled:Integer;

fSecondFiled:longInt;

procedure StaticMethod;

procedure VirtualMethod1; virtual;

procedure VirtualMethod2; virtual;

procedure DynamicMethod1; dynamic;

procedure DynamicMethod2; dynamic;

end;
tChildClass=class(tParentClass)

procedure StaticMethod;

procedure VirtualMethod1; override;

procedure DynamicMethod1; override;

end;
Первый метод класса tChildClass создается заново, два остальных перекрываются. Создадим объекты этих классов:
var Obj1: tParentClass;

Obj2: tChildClass;
Внутренняя структура этих объектов показана ниже.
Первое поле каждого экземпляра каждого объекта содержит указатель на его класс. Класс, как структура состоит из двух частей. Начиная с адреса, на который ссылается указатель на класс, располагается таблица виртуальных методов. Она содержит адреса всех виртуальных методов класса, включая и унаследованные от предков. Перед таблицей виртуальных методов расположена специальная структура, содержащая дополнительную информацию. В ней содержатся данные, полностью характеризующие класс: имя, размер экземпляров, указатели на класс-предок и т.д. Одно из полей структуры содержит адрес таблицы динамических методов класса (DMT). Таблица имеет следующий формат: в начале - слово, содержащее количество элементов таблицы. Затем - слова, соответствующие индексам методов. Нумерация индексов начинается с –1 и идет по убывающей. После индексов идут собственно адреса динамических методов. Следует обратить внимание на то, что DMT объекта Obj1 состоит из двух элементов, Obj2 - из одного, соответствующего перекрытому методу DynamicMethod1. В случае вызова Obj2.DynamicMethod2 индекс не будет найден в DMT Obj2, и произойдет обращение к DMT Obj1. Именно так экономится память при использовании динамических методов.
Как указывалось выше, указатель на класс указывает на первый виртуальный метод. Служебные данные размещаются перед таблицей виртуальных методов, то есть с отрицательным смещением. Эти смещения описаны в модуле SYSTEM.PAS:
vmtSelfPtr = -76

vmtIntfTable = -72

vmtAutoTable = -68

vmtInitTable = -64

vmtTypeInfo = -60

vmtFiledTable = -56

vmtMethodTable = -52

vmtDynamicTable = -48

vmtClassName = -44

vmtInstanceSize = -40

vmtParent = -36

vmtSafeCallException = -32

vmtAfterConstruction = -28

vmtBeforeDestruction = -24

vmtDispatch = -20

vmtDefaultHandler = -16

vmtNewInstance = -12

vmtFreeInstance = -8

vmtDestroy = -4
Поля vmtDynamicTable, vmtDispatch и vmtDefaultHandler отвечают за вызов динамических методов. Поля vmtNewInstance, vmtFreeInstance и vmtDestroy содержат адреса методов создания и уничтожения экземпляров класса. Поля vmtIntfTable, vmtAutoTable, vmtSafeCallException введены для обеспечения совместимости с моделью объекта COM. Остальные поля доступны через методы объекта tObject. В Object Pascal эта информация играет важную роль и может использоваться программистом неявно. В языке определены два оператора - is и as, неявно обращающиеся к ней. Оператор is предназначен для проверки совместимости по присвоению экземпляра объекта с заданным классом. Выражение вида:
AnObject is tObjectType
Принимает значение True только если объект AnObject совместим по присвоению с классом tObjectType, то есть является объектом этого класса или его потомком.
Оператор as введен в язык специально для приведения объектных типов. С его помощью можно рассматривать экземпляр объекта как принадлежащий к другому совместимому типу:
with AObjectOfSomeType as tAnotherType do . . .
От стандартного способа приведения типов использование оператора as отличается наличием проверки на совместимость типов во время выполнения: попытка приведения к несовместимому типу приводит к возникновению исключительной ситуации eInvalidCast. После выполнения оператора as сам объект остается неизменным, но выполняются те его методы, которые соответствуют присваиваемому классу.
Вся информация, описывающая класс, создается и размещается в памяти на этапе компиляции. Доступ к информации вне методов этого класса можно получить, описав соответствующий указатель, называющийся указателем на класс или указателем на объектный тип (class reference). Он описывается при помощи зарезервированных слов class of. Например, указатель на класс tObject описан в модуле SYSTEM.PAS и называется tClass. Аналогичные указатели определены и для других важнейших классов: tComponentClass, tControlClass и т.д.
С указателем на класс тесно связано понятие методов класса. Такие методы можно вызывать и без создания экземпляра объекта - с указанием имени класса в котором они описаны. Перед описанием метода класса нужно поставить ключевое слово class.
Разумеется, методы класса не могут использовать значения, содержащиеся в полях класса: ведь экземпляра класса не существует!!! Методы класса служат для извлечения внутренней информации класса. Ниже перечислены методы класса tObject:
Метод и Описание
сlass function ClassName:ShortString

Возвращает имя класса
сlass function ClassNameIs(const Name:ShortString):Boolean

Принимает значение True, если имя класса равно заданному
сlass function ClassParent:tClass

Возвращает указатель на родительский класс
сlass function ClassInfo:pointer

Возвращает указатель на структуру с дополнительными данными об опубликованных методах и свойствах.
сlass function InstanceSize:Longint

Возвращает размер экземпляра класса
сlass function InheritsFrom (aClass: tClass):Boolean

Возвращает True, если данный класс наследует от заданного
сlass function MethodAddress(const Name:ShortString):Pointer

Возвращает адрес метода по его имени (только для опубликованных методов)
сlass function MethodName (Addres: pointer):ShortString

Возвращает имя метода по его адресу (только для опубликованных методов)
В Delphi 4 в класс tObject добавлены еще два виртуальных метода - AfterConstruction и BeforeDestruction. Как следует из названия, они вызываются сразу после создания экземпляра объекта и непосредственно перед уничтожением.
Перегрузка методов
В Delphi 4 появилась новая разновидность методов - перегружаемые. Перегрузка нужна для того, чтобы произвести одинаковые или похожие действия над разнотипными данными. Перегружаемые методы описываются с ключевым словом overload.
Type

tFirstClass=class

E:extended;

procedure SetData(aValue: Extended); overload;

end;
tSecondClass=class(tFirstClass)

I:integer;

procedure SetData(aValue: Integer); overload;

end;
Объявив метод SetData перегружаемым, в программе можно использовать обе его реализации одновременно. Это возможно потому, что компилятор определяет тип передаваемого параметра (целый или вещественный) и в зависимости от этого подставит вызов соответствующего метода.
Для перегрузки виртуального метода используется зарезервированное слово reintroduce:
procedure SetData(aValue:string); reintrouce;overload;
На перегрузку методов накладывается ограничение: нельзя перегружать методы, находящиеся в области видимости published.
Абстрактные методы
Абстрактными называются методы, которые определены в классе, но не содержат никаких действий, никогда не вызываются и обязательно должны быть переопределены в классах-потомках. Абстрактными могут быть только виртуальные и динамические методы. Для описания абстрактного метода используется директива abstract:
Procedure NeverCallMe; virtual; abstract;
Никакого кода абстрактный метод не содержит. Его вызов приведет к созданию исключительной ситуации eAbstractError.
Инкапсуляция

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

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

Итак, инкапсуляция означает, что методы (коды) и данные одновременно представлены в одной и той же структуре.

Например,

^ Type

Coordinates = class

x, y : byte;

procedure Init (Xinit, Yinit: byte);

function GetX : byte;

function GetY : byte;

end;

Лекция 6

Введение в методы программирования и структуры данных.
1. Теория программирования

2. Инженерия программирования

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

Программа - завершенный продукт, пригодный для запуска своим автором на системе, на которой он был разработан.

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

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

Место программирования в предметной области информатики показано на рис. 1.


Рис. 1
В программировании четко выделяются подразделы, которые перечисляются ниже.

  • Теория программирования, которая включает следующие направления:

    • структуры данных, их представление в памяти компьютера;

    • информационный поиск, упорядочивание линейных массивов и файлов;

    • формальные языки, грамматики, автоматы и другие абстрактные машины;

    • синтаксический анализ программ;

    • оценку трудоемкости и теорию сложности алгоритмов;

    • эквивалентные преобразования алгоритмов, экономию памяти;

    • спецификацию задач, доказательство свойств программ, автоматический синтез программ;

    • семантику языков программирования (теорию моделей программ).

  • Методология программирования, изучающая методы с точки зрения основ построения. Это объединенная единым философским подходом совокупность методов, применяемых в процессе разработки программного обеспечения.

  • ^ Технология программирования, изучающая технологические процессы и порядок их прохождения (с использованием знаний, методов и средств). Технологический процесс - последовательность направленных на создание заданного объекта действий (технологических операций), каждое из которых основано на каких-либо естественных процессах и человеческой деятельности.

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

    • как проектировать и строить программы, образующие системы?

    • как проектировать и строить программы и системы, являющиеся надежным, отлаженным, документированным и сопровождаемым продуктом?

    • как осуществлять интеллектуальный контроль в условиях большой сложности?

Эти вопросы были сформулированы американским программистом Фредериком Бруком в 1968 году. Они актуальны и в настоящее время. Сегодняшнее содержание раздела «Инженерия программирования» изменяется весьма динамично и отражает большое количество направлений. Перечислим некоторые из них:

  • процесс разработки программного обеспечения;

  • формирование требований к программному продукту;

  • обратная (реверсивная) инженерия (реинжиниринг)- процесс восстановления спецификации из кода;

  • тестирование;

  • сопровождение и эволюция программного обеспечения;

  • архитектура программного обеспечения;

  • объектно-ориентированное моделирование;

  • инженерия программирования и «промежуточное» (между сетевой операционной системой и программой пользователя) программное обеспечение;

  • анализ программного обеспечения;

  • формальные спецификации;

  • математические основания инженерии программирования;

  • инженерия программирования и производительность программного продукта;

  • инженерия программирования для реального времени;

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

  • инструментарий и окружение инженерии программирования;

  • инженерии программирования и Интернет;

  • экономика программного обеспечения;

  • метрики программного обеспечения;

  • инженерия программирования как учебная дисциплина.

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

Основные области программирования представлены тремя группами. Каждая группа - это объединение двух достаточно близких направлений. Они представлены на рис 2.



Рис.2.





Лекция 8

Создание сложных программных приложений.
1. Программные продукты и их основные характеристики

2. Понятие программного обеспечения

3. Характеристики качество ПО

4. Проектирование программного продукта

5. Структура программного продукта

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

Задача – это проблема, подлежащая решению с помощью технических средств, а приложение (синоним программа) – реализованное на компьютере решение данной задачи.

Программы делятся на утилиты (для нужд разработчиков) и программные продукты (для удовлетворения потребностей пользователя)

В настоящее время на мировом рынке господствуют компьютеры разного типа: VAX и IBM и языки, совместимые с этими машинами. Программы, написанные для одной машине, не всегда подходят к другой.

Для разработчика это творчество, для заказчика это удобный инструмент.

В Японии 60% трудоспособного населения занимается программированием.
^ Понятия программного обеспечения

Программирование – это сфера действий, направленная на создание программ.

Программа – это последовательность команд компьютера, приводящая к решению задачи.

Приложение – это программная реализация на компьютере решения задачи.

^ Программное обеспечение (ПО) - это программные продукты и техническая документация к ним.

Программный продукт (ПП) – это комплекс взаимосвязанных программ, предназначенный для реализации определенной задачи массового спроса.

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

  1. Быстрая смена вычислительной техники и алгоритмических языков.

  2. Не стыковка машин друг с другом (VAX и IBM).

  3. Отсутствие полного взаимопонимания между заказчиком и исполнителем к разработанному программному продукту.


Характеристики качества ПО
Перечень показателей качества:

  • документированность,

  • эффективность,

  • простота использования,

  • удобство эксплуатации,

  • мобильность,

  • совместимость,

  • испытуемость,

  • стоимость.


Критерии оценки качества программы.

Программа должна:

  1. работать согласно техническому заданию (и это легко проверяется);

  2. быть эффективна по быстродействию и памяти (или быстрее работать или занимать меньше памяти);

  3. широко использоваться и быть доступной (любой грамотный программист должен в программе разобраться и ее эксплуатировать, модернизировать как под новую задачу, так и под новую версию ОС);

  4. быть приспособлена к выявлению ошибок (достаточно надежна в процессе расчета получать достоверные результаты);

  5. должна быстро разработана и отлажена с минимальными трудозатратами.




0.5. Проектирование программных продуктов (ПП)




0.5.1. Классификация методов проектирования ПП







Неавтоматизированное проектирование алгоритмов и программ используется при разработке небольших по трудоемкости и структурной сложности ПП.

Автоматизированное проектирование используется в крупных фирмах при разработке определенного класса ПП большого коллектива разработчиков.
.Структурное проектирование – это последовательная декомпозиция, целенаправленное разбиение на отдельные составляющие.

Структурное проектирование включает в себя:

  • нисходящее проектирование ("сверху вниз"),

  • модульное программирование,

  • структурное программирование (кодирование).


Информационное моделирование – построение

комплекса взаимосвязанных моделей данных.
Объектно-ориентированный подход основан на:

  • выделении классов объектов;

  • установлении свойств объектов и методов их обработки;

  • создании иерархии классов, наследовании свойств объектов и методов их обработки.

Каждый объект объединяет данные и программу обработки этих данных и относится к определенному классу.

Основная цель ООП - преодолеть следующие недостатки проектирования “сверху вниз”:

- недостаточное внимание к структурам данных,

- слабая связь структур данных с процессами их обработки.

Проектирование алгоритмов и программ – наиболее ответственный этап жизненного цикла ПП.

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

Автоматизированное проектирование алгоритмов и программ возникло с необходимостью уменьшить затраты на проектные работы, сократить сроки их выполнения, создать типовые "заготовки", многократно тиражируемых для различных разработок, координации работ большого коллектива разработчиков
Методология –это подходы к проектированию

Начало развития падает на 60-е годы.

Метод нисходящего проектирования предполагает последовательное разложение общей функции обработки данных на простые функциональные элементы ("сверху вниз").

В основе Информационного моделирования лежит положение об определяющей роли данных при проектировании алгоритмов и программ.

Структурное программирование основано на модульной структуре программного продукта и базовых алгоритмических структурах.

Кроме того, ООП позволяет резко сократить объем и трудоемкость подготовки программ, имеющих дело с множеством связанных друг с другом объектов.

Объектно-ориентированный анализ – это выявление объектов, определение свойств и методов обработки объектов, установление их взаимосвязей.

ООП процесс объектной декомпозиции и представления с использованием моделей данных проектируемой системы на логическом и физическом уровнях.

0.5.2. Этапы создания ПП

0.5

Составление технического задания на программирование.

На этом этапе требуется:

  • определить тип ОС - MS DOS, Windows, Windows NT,

  • оценить необходимость сетевого варианта работы программы,

  • определить необходимость разработки программы,

  • обосновать необходимость работы с БД под управлением СУБД,

  • выбрать методы решения задачи,

  • разработать обобщенный алгоритм решения

комплекса задач и структуры данных,

  • определить требования к интерфейсу пользователя.

Технический проект.

На этом этапе выполняется:

  • разработка детального алгоритма обработки данных,

  • определение состава общесистемного программного обеспечения, включающего базовые средства (ОС, модель БД, электронные таблицы),

  • разработка внутренней структуры ПП, образованной отдельными программными модулями,

  • выбор средств разработки программных модулей.

  1. Рабочая документация (рабочий проект).

На этом этапе осуществляется:

  • разработка программных модулей,

  • программирование или создание программного кода,

  • отладка программного продукта,

  • испытание работоспособности программных модулей и базовых программных средств,

  • подготовка контрольного примера, для проверки соответствия ПП заданию,

  • создание эксплуатационной документации на программный продукт:

  • Описание применения;

  • Руководство пользователя;

  • Руководство программиста (оператора).

  • Обучающей системы (для ПП массового применения)




  1. Ввод в действие.

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

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

которую можно переносить на различные платформы.

Разрабатывают функциональную структуру алгоритма или состав объектов, определяют требования к комплексу технических средств системы.
Пример: для создания MS DOS- приложений может быть использован язык программирования Visual Basic for DOS Standard, Fortran, Visual C++ for Windows. Если необходима переносимость программ на другие ЭВМ, выбирается среда Windows NT.

При разработке программ, работающих в среде Windows, возможно применение технологии OLE, для создания приложений.

Приложение может работать с БД различных СУБД.

- характеристика программного изделия с указанием сферы его применения;

- детальное описание функциональных возможностей и технологии работы с программным продуктом;

- указывает особенности установки программного продукта.

Тиражирование и распространение ПП


0.6. ^ Структура программных продуктов ( ПП ).

В большей степени программные продукты не являются монолитом и имеют конструкцию построения – совокупность программных модулей.

Архитектура ПП представляет собой совокупность и взаимосвязь программных модулей.

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

ПП обладает внутренней структурой, что обеспечивает удобство разработки, программирование, отладку и внесение изменений в ПП. Программные комплексы большой алгоритмической сложности разрабатываются коллективом разработчиков ( 2-15 человек ). Управлять разработкой программ можно при научной основе.

Программный продукт обладает внутренней структурой.

Структуризация программы выполняется для удобства

  • разработки,

  • программирования,

  • отладки,

  • внесения изменения в ПП.


Структуризация ПП преследует следующие цели:

  • Распределить работы по исполнителям, обеспечив их загрузку и требуемые сроки разработки;

  • Построить календарные графики проектных работ и осуществлять их координацию в процессе создания программных изделий;

  • Контролировать трудозатраты и стоимость проектных работ.


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

Среди множества модулей различают:

^ Г о л о в н о й модуль – управляет запуском ПП; (Существует в единственном числе.)

  • У п р а в л я ю щ и й модуль – обеспечивает вызов других модулей на обработку;

  • Р а б о ч и е модули - выполняют функции обработки

  • С е р в и с н ы е модули и библиотеки, утилиты – осуществляют обслуживающие функции.




Каждый модуль оформляется как самостоятельно хранимый файл. Для функционирования ПП необходимо наличие программных модулей в полном составе.

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

Структура ППП многомодульная.
Проектирование интерфейса пользователя

0.7.1. Диалоговый режим

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

Большинство ПП работают в ^ Диалоговом режиме.

Состав диалоговых систем:

  • Меню – пользователю предлагается выбор альтернативных функций обработки из фиксированного перечня;

Меню может содержать вложенные подменю.

  • Действия запрос-ответ – фиксированный перечень возможных значений, выбираемых из списка или ответы типа Да/Нет;

  • Запрос по формату - с помощью ключевых слов, фраз.


Диалоговый процесс управляется согласно созданному сценарию, для которого определяются:

  • Момент начала диалога;

  • Инициатор диалога – человек или ПП;

  • Параметры и содержание диалога – сообщения, состав и структура меню, экранные формы;

  • Реакция ПП на завершение диалога.


Для создания диалогового процесса и интерфейса пользователя используют объектно-ориентированные средства разработки программ (Delphi).

В их составе содержатся:

  • Построители меню (для создания главного меню и вложенного подменю);

  • Конструктор экранных форм (для разработки форматов экранного ввода и редактирования данных).


Диалоговые окна содержат элементы управления:

  • Тексты сообщения;

  • Поля ввода информации пользователя;

  • Списки возможных альтернатив для выбора;

  • Кнопки, переключатели и т.п.


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

Реализуется для ПП, работающих в среде Windows. Обязательный компонент большинства современных ПП.
К нему предъявляются высокие требования с инженерной и художественной стороны разработки.

Строится в виде системы ниспадающих меню с использованием в качестве средства манипуляции мыши и клавиатуры.

С помощью интерфейса пользователь работает с экранными формами, содержащими объекты управления, панели инструментов с пиктограммами режимов и команд обработки.
Требования к графическому интерфейсу:

1. Содержать привычные и понятные пользователю пункты меню, соответствующие функциям обработки;

2. Ориентироваться на пользователя, который общается с программой на внешнем уровне взаимодействия;

3. Удовлетворять правилу "шести" – в одну линейку меню включать не более 6 понятий, каждое из которых содержит не более 6 опций;

4. Сохранять стандартизированное назначение и местоположение на экране графических объектов
Лекция 9

Методы сортировки и поиска информации
1. Сортировака
1   2   3   4   5   6   7   8   9   10   11



Скачать файл (2205.5 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru