Три принципа объектного программирования

      Комментарии к записи Три принципа объектного программирования отключены

Тема №15. Применение языков программирования в решении медицинских задач

Цель: Изучить операторы: ветвления, выбора. Изучить структуру подпрограмм, формирование процедур и функций и обращение к ним. Дать понятие о структуре модуля; класса; объекта. Знакомство с тремя принципами объектно-ориентированного программирования. Дать понятие поля, свойства, события, методов. Изучить компонент ListBox.

Задачи обучения:Формирование умений и навыков создания программ с ветвлениями; создания и использования подпрограмм, описания класса и присваивания объектов.

Основные вопросы темы:

1. Условный оператор и оператор выбора.

2. Структура подпрограммы (функции и процедуры).

3. Структура модуля. Понятие класса.

4. Три принципа объектно-ориентированного программирования.

5. Поля, свойства, события, методы.

6. Компонент ListBox, его основные свойства и методы.

Методы обучения и преподавания: выполнение типовых заданий

Теоретический блок

В 80-годах стали появляться первые коммерческие системы разработки, в которых была реализована новая парадигма программирования, так называемый объектный подход, что позволило резко повысить производительность труда программистов. Подход был основан на понятии объекта, типа данных, в котором сочетаются как свойства, сгруппированные данные (пример – поля в записи), так и методы их обработки (подпрограммы).

Фактически объект стал отражать реальные и даже абстрактные понятия окружающего мира. Например, автомобиль характеризуется такими свойствами, как марка, тип двигателя, наличие колес и руля, а файл – названием и размером. «Методы» автомобиля определяют его способность двигаться в нужном направлении в соответствии со значениями своих свойств: объемом бензина в баке, углом поворота руля. Из файла можно считывать данные, менять их и записывать обратно.

Благодаря этому теперь удается выполнять проектирование программ, основываясь на понятии объекта, что значительно проще и быстрее, чем раньше. Работать с привычными понятиями человеку легче, нежели с абстрактными числами. При этом специалистам удалось выделить большой набор объектов, которые нужны при создании самых разных программ. Эти объекты используются повторно, без расходования времени на их программирование. Именно такой подход и реализован в среде Delphi7.

Операторы

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

Условный оператор

Условия

Один из важнейших операторов Паскаля – условный оператор. Он позволяет изменить порядок выполнения операторов в зависимости от некоторого условия, представляющего собой логическое выражение типа Boolean. Если это значение равно True, то выполняется одна группа операторов, если оно равно False, то выполняется другая группа операторов или не выполняется ничего.

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

Таблица 23.1. Основные операции сравнения данных

Знак операции Название операции
= = Равно Не равно Больше Меньше Больше или равно Меньше или равно

Если используются логические операции or, and и так далее, то связываемые ими проверки заключаются в круглые скобки.

X5

(I=1) and (I

(a+5b) or BoolFunc

Alf=3

Для некоторых типов данных в Паскале имеются дополнительные операции, позволяющие сформировать более сложные условия. В частности, для множеств определена операция in (зарезервированное слово), которая проверяет, входит ли конкретное значение в множество:

X:=[2,4,6,8,10];

Выражение 2 in X имеет значение True.

Выражение 5 in X имеет значение False.

Такой способ очень удобен тем, что позволяет выполнить проверки более наглядно и компактно. Например вместо того, чтобы писать (I=1) and (I

Выполняются подобные проверки тоже значительно эффективнее.

Оператор if … then …

Условный оператор записывается в такой форме:

if условие then действие;

Слова if (если) и then (то) – зарезервированные.

Действие выполняется только в том случае, если значение равно True. В противном случае ничего не происходит. Действие – это любой оператор Паскаля, или группа операторов, взятых в логические скобки begin/end, или вызов подпрограммы.

Оператор if … then … else …

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

ifусловие

thenдействие_1

elseдействие_2;

Действие_1 будет выполнено, если условие истинно (равно True), действие_2 выполняется, если условие ложно.

if X0 then X:=-1 else X:=+1;

Замечание: Перед ключевым словом else (иначе) точка с запятой не ставится.

Оператор выбора

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

if X=1 then а:=1 else

if X=2 then а:=2 else

if (X=3) or (X=4) then а:=3 else

if X=5 then а:=4 else

if ( X=1) or(X in [8..100]) then а:=5

else a:=0;

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

case выражение of

список-условий_1: действие_1;

список-условий_n: действие_n;

else действие_n+1;

end;

Тип выражения может быть одним из стандартных типов: целым числом, перечислимым типом, символьным типом и так далее. Список условий может содержать произвольные выражения, состоящие из констант и имеющие подходящий тип. В этом списке допускается использовать как обычные константы, так и символы и диапазоны значений. Результат выражения будет поочередно сравниваться с каждым из значений в списках, и при первом совпадении будет выполнено соответствующее действие (оператор или группа операторов, взятых в логические скобки begin/end), а все оставшиеся действия будут пропущены. В случае, когда ни одного совпадения результата выражения с заданными значениями не произошло, выполняется действие, указанное за словом else(если оно имеется), или не выполняется ничего, если слово else внутри оператора выбора отсутствует.

Подпрограмма

Подпрограмма — это небольшая программа, которая решает часть общей задачи. В языке Delphi есть два вида подпрограмм — процедура и функция.

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

Отличие функции от процедуры состоит в том, что с именем функции связано значение, поэтому функцию можно использовать в качестве операнда выражения, например, инструкции присваивания.

Как правило, подпрограмма имеет параметры. Различают формальные и фактические параметры.

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

Параметры используются:

  • для передачи данных в подпрограмму;
  • для получения из результата подпрограммы.

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

Функция

Функция — это подпрограмма, т. е. последовательность инструкций, имеющая имя.

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

В общем виде инструкция обращения к функции выглядит так:

Переменная:= Функция (Параметры);

где:

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

Следует обратить внимание на то, что:

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

Объявление функции

Объявление функции в общем виде выглядит так:

functionИмя (параметр1 : тип1, …, параметрК : типК) : Тип;

Var

// здесь объявления локальных переменных

Begin

// здесь инструкции функции

Имя := Выражение;

end;

где:

  • function — зарезервированное слово языка Delphi, обозначающее, что далее следуют инструкции, реализующие функцию программиста;
  • имя — имя функции. Используется для перехода из программы к инструкциям функции;
  • параметр — это переменная, значение которой используется для вычисления значения функции. Отличие параметра от обычной переменной состоит в том, что он объявляется не в разделе объявления переменных, который начинается словом var, а в заголовке функции. Конкретное значение параметр получает во время работы программы в результате вызова функции из основной программы;
  • тип — тип значения, которое функция возвращает в вызвавшую ее программу.

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

Процедура

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

  • когда подпрограмма не возвращает в основную программу никаких данных. Например, вычерчивает график в диалоговом окне;
  • когда подпрограмма возвращает в вызвавшую ее программу больше чем одно значение. Например, подпрограмма, которая решает квадратное уравнение, должна вернуть в вызвавшую ее программу два дробных числа — корни уравнения.

Объявление процедуры

В общем виде объявление процедуры выглядит так:

procedureИмя (var параметр1: тип1; … var параметрК: типК) ;

Var

// здесь объявление локальных переменных

Begin

// здесь инструкции процедуры

end;

где:

  • procedure — зарезервированное слово языка Delphi, обозначающее, что далее следует объявление процедуры;
  • имя — имя процедуры, которое используется для вызова процедуры;
  • параметр — формальный параметр, переменная, которая используется в инструкциях процедуры. Слово var перед именем параметра не является обязательным. Однако если оно стоит, то это означает, что в инструкции вызова процедуры фактическим параметром обязательно должна быть переменная.

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

Использование процедуры

Разработанную процедуру нужно поместить в раздел implementation, перед подпрограммой, которая использует эту процедуру.

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

Имя(СписокПараметров);

где:

  • Имя — имя вызываемой процедуры;
  • СписокПараметров — разделенные запятыми фактические параметры.

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

Понятие класса

Классический язык Pascal позволяет программисту определять свои собственные сложные типы данных — записи (records). Язык Delphi, поддерживая концепцию объектно-ориентированного программирования, дает возможность определять классы. Класс — это сложная структура, включающая, помимо описания данных, описание процедур и функций, которые могут быть выполнены над представителем класса — объектом.

Вот пример объявления простого класса:

TPerson = class

Private

fname: string[15]; faddress: string[35];

Public

procedureShow;

end;

Данные класса называются полями, процедуры и функции — методами.

В приведенном примере TPerson — это имя класса, fname и faddress — имена полей, show — имя метода.

Примечание Согласно принятому в Delphi соглашению,имена полей должны начинаться с буквы f (от слова field — поле).

Описание класса помещают в программе в раздел описания типов (type).

Когда описывается переменная типа class, для ее полей и свойств в памяти выделяется соответствующий объем (как и для записей), но машинный код, в который транслируются методы класса, наличествует в единственном экземпляре, так как меняться он не может, и хранить несколько одинаковых копий подпрограмм не имеет смысла. Когда объект создается, однократно вызывается специальный метод, называемый конструктором. В нем выполняются различные действия по начальной инициализации полей объекта. Когда объект уничтожается (например, он был описан внутри процедуры как локальная переменная и удаляется из памяти при ее завершении), вызывается другой метод – деструктор, который выполняет различные дополнительные действия по освобождению памяти, если это необходимо. Явно вызывать конструктор и деструктор из программного кода нельзя. Это происходит только автоматически.

Переменная, описанная как класс, фактически является указателем на экземпляр класса. Это сделано для повышения эффективности работы с ним. Однако при использовании таких переменных применять операции работы с указателями (^, @) не надо. Достаточно обычного обращения к ним как к обычным переменным, а к членам класса – как к полям записи, через точку.

Три принципа объектного программирования

Наследование

Чтобы наиболее эффективно повторно использовать ранее созданные классы, одного сочетания данных и методов в единой структуре недостаточно. Например, автомобиль может быть легковым и грузовым, и соответствующие классы будут иметь как общие поля и методы, так и отличия (например, дополнительное свойство «грузовой кузов» и связанный с ним метод «разгрузить»). Однако полностью заново определять новый тип данных, если требуется изменить или добавить несколько новых свойств к старому типу, нерационально. Это плохо еще и потому, что если в метод, имеющийся в обоих классах, потребуется внести исправления, то их придется делать дважды, в двух одинаковых копиях подпрограмм.

Чтобы избежать ненужной работы, в объектном программировании был введен принцип наследования свойств и методов. Программисту достаточно описать один базовый класс (например, «автомобиль»), а классы «легковой автомобиль» и «грузовой автомобиль» основывать на этом базовом классе. При этом будут наследоваться все поля, свойства и методы базового (или родительского) класса, а дополнительно описывать их не требуется.

Цепочки наследования могут быть неограниченной длины. Так, у класса «грузовой автомобиль» могут быть классы-наследники (или дочерние классы) «МАЗ» и «КАМАЗ», обладающие дополнительными специфическими свойствами и методами (это классы, а не объекты; объектом будет конкретный грузовик МАЗ, а не марка этого автомобиля), у класса «кнопка» наследники – «графическая кнопка», «круглая кнопка» и так далее. При этом различные методы для каждого из наследников разрешается переопределять. Например, метод «двигаться» для классов «МАЗ» и «КАМАЗ» будет, хоть и немного, но отличаться: по-разному расходуется горючее (снижается значение соответствующего свойства), по-разному набирается скорость и так далее.

Полиморфизм

Когда будет происходить обращение к переменной, относящейся к классу «КАМАЗ», и вызов унаследованного метода «двигаться», программе придется решить, какой конкретно метод надо вызвать: метод класса «автомобиль», «грузовой автомобиль» или «КАМАЗ». В соответствии с принципом полиморфизма решение принимается в зависимости от типа переменной, вызывающей этот метод. То есть, если переменная описана как относящаяся к типу «КАМАЗ», будет вызван метод «двигаться», определенный именно для КАМАЗа.

Инкапсуляция

Инкапсуляция позволяет разграничить доступ разработчиков к различным полям и свойствам класса, примерно так, как это сделано в модулях Delphi, когда из других модулей видима только интерфейсная часть. Точно так же и внутри классов некоторые поля и методы можно сделать свободно доступными для использования (видимыми) в любом месте программы, а другие поля и методы сделать доступными только внутри текущего модуля и собственных методов класса. Это позволяет скрыть внутри описания различные характеристики и возможности класса, чтобы сосредоточить внимание разработчиков, повторно использующих этот класс, на его важнейших свойств.

Кроме того, желательно не допускать бесконтрольного изменения значений свойств, так как это может привести к нарушению запланированной и сбалансированной взаимосвязи между свойствами. Например, нельзя бездумно изменить значение свойства «текущая скорость», просто записав в него новое число. Надо вызвать соответствующий метод, который учтет изменение потребления бензина и выполнит ряд дополнительных действий. Хорошим стилем программирования считается недоступность всех полей и свойств объекта для прямого изменения. Вместо этого создаются методы, позволяющие получить значение поля и занести в него новое значение. Сами поля помещаются в скрытую часть класса.

События

Помимо этих трех фундаментальных возможностей объектно-ориентированного программирования, в среде Delphi реализована новая характеристика объекта – возможность обработки так называемых сообщений (или событий), получаемых от системы Windows или самой программы. Этот принцип лежит в основе работы всех визуальных компонентов Delphi, которые обрабатывают различные события, возникающие в процессе выполнения программы.

Метод

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

professor. Show;

вызывает применение метода Show к объекту professor. Фактически инструкция применения метода к объекту — это специфический способ записи инструкции вызова процедуры.

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

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

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

Классы и объекты Delphi

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

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

Type

TForm1 = class(TForm)

Private

{Private declarations}

Public

{Public declarations}

end;

Var

Form1: TForm1;

Это описание класса исходной, пустой формы приложения и объявление объекта — формы приложения.

Когда программист, добавляя необходимые компоненты, создает форму, Delphi формирует описание класса формы. Когда программист создает функцию обработки события формы или ее компонента, Delphi добавляет объявление метода в описание класса формы приложения.

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

Компонент ListBox

Значок компонента ListBox находится на вкладке Стандартные (Standard). Добавляется список к форме приложения точно так же, как и другие компоненты, например, командная кнопка или поле редактирования. В таблице 23.2 приведены свойства компонента ListBox.

Таблица 23.2. Свойства компонента ListBox

Свойство Определяет
Name Имя компонента. В программе используется для доступа ксвойствам компонента
Items Элементы списка
ItemIndex Номер выбранного элемента списка. Номер первого элементасписка равен нулю
Left Расстояние от левой границы списка до левой границы формы
Top Расстояние от верхней границы списка до верхней границыформы
Height Высоту поля списка
Width Ширину поля списка
Font Шрифт, используемый для отображения элементов списка
Parent-Font Признак наследования свойств шрифта родительской формы

Наибольший интерес представляют свойства Items и ItemIndex. Свойство Items содержит элементы списка.

Свойство ItemIndex задает номер выбранного элемента списка. Если ни один из элементов не выбран, то значение свойства равно минус единице.

Список может быть сформирован во время создания формы или во время работы программы.

Для формирования списка во время создания формы надо в окне Инспектора объектов (Object Inspector)выбрать свойство Items и щелкнуть на кнопке запуска редактора списка строк (рис.23.1).

В открывшемся диалоговом окне Редактор строк (String List Editor)(рис.23.2) нужно ввести список, набирая каждый элемент списка в отдельной строке. После ввода очередного элемента списка для перехода к новой строке необходимо нажать клавишу . После ввода последнего элемента клавишунажимать не надо. Завершив ввод списка, следует щелкнуть на кнопке ОК.

Глоссарий

На русском языке На казахском языке English
Файл Проекта Жоба Файлы (Project File)
Файл Ресурсов Ресурстарфайлы (Resource File)
Конструктор ??растырушы (Constructor)
Класс(Классовый Тип) Класс Class
Компонент Компонент Component
Инспектор Объектов ОбъектілерИнспекторы (Object Inspector)
Программа Программа Program
Метод ?діс (Method)
Модуль Модуль (Unit)
Наследование М?рагерлік (Inheritance)
Объект Объект (Нысан) (Object)
Палитра Компонентов КомпоненттерПалитрасы (Component Palette)
Поле ?ріс (Field)
Приложения ?осымша (Application)
Свойства ?асиеттер (Property)
Тип Времени Выполнения Іске?осу уа?ытыны? типі (Run-Time Type)
Форма Форма (Form)
Интерфейс Интерфейс(ПайдалануБ?лімі) Іinterface
Компилирование Компиляциялау Compiling
Оператор Орератор Operator
Процедура Процедура(программаішіндегі бір б?лігі/ішкі программа ) Рrocedure
Частный Жеке,дербес Private
Выполнение (Реализовать) Іске асыру, орындау Impelementation
Проект Жоба Project
Событие О?и?а Event

Литература:

1. С. И. Бобровский. Учебный курс Delphi7. Питер, 2006г.

2. Г.Г. Рапаков, С.Ю. Ржеуцкая. Программирование на языке Паскаль. Санкт-Петербург, 2005г.

3. Н.Культин. Учебный курс Delphi. Санкт-Петербург, 2005г.

4. Н.Культин. Delphi в задачах и примерах. Санкт-Петербург, 2005г.

5. Е.Р. Алексеев, О.В. Чесноков. Шаг за шагом. Москва, 2005г.

Контроль

Вопросы:

1. Условный оператор (if ).

2. Оператор выбора (case).

3. Что такое подпрограмма?

4. Что такое формальный и фактический параметры?

5. Что такое функция?

6. Каков общий вид инструкции обращения к функции?

7. Как объявляют функцию?

8. Что такое процедура?

9. Как объявляют процедуру?

10. Какова инструкция вызова процедуры?

11. Три принципа объектного программирования: наследование, полиморфизм, инкапсуляция.

12. Что такое класс?

13. Что такое деструктор и конструктор?

14. Что такое событие?

15. Что такое метод?

16. В какой вкладке палитры компонентов находится компонент ListBox?

17. Что содержит свойство Items компонента ListBox?

18. Назначение свойства ItemIndex компонента ListBox.

Статьи к прочтению:

Почему нельзя тереть и чесать глаза


Похожие статьи: