Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Вычисление и моделирование




Изменения в использовании процедур и функций

 

1. Возврат значения из функции может происходить с использованием ключевого слова Result.

Result:=

2. Параметры – результаты – с помощью слова out. Такой параметр может использовать внутри процедуры или функции только для присваивания значения (противоположно const).

3. Параметры без типов (со словом const, var, out). Требуют преобразования типов.

4. Передача списка значений как фактического параметра, при формальном параметре – открытом массиве

Sum([1,2,X, p-r]);

Передача вариантного массива –

Procedure Sum(A: Array of const);

5. Значения параметров по умолчанию. Должны располагаться вместе и после параметров для которых не заданы значения по умолчанию.

Procedure Proc(I: integer; j:integer=2; k:integer=5);

Proc(7);

Proc(3,4);

Proc(2,3,8);

6. Перегружаемые процедуры. Когда необходимо выполнять действия над переменными разных типов. Max.

Перегружаемые процедуры и функции имеют одинаковые имена, но отличаются только типом параметров. Директива overload;

Списки переменных должны полностью совпадать за исключением типов.

 

Function Min(a,b:integer):integer; overload;

Function Min(a,b:real):real; overload;

 

function Func(X: Real; Y: Integer): Real; overload;

 

...

function Func(X: Integer; Y: Real): Real; overload;

 

 

Объектно-ориентированное мышление

 

Объектно-ориентированное программирование (ООП) основная методология программирования 90-х годов. Она является продуктом 25 летней практики и включает ряд языков: Simula 67, Smalltalk, Lisp, Clu, Actor, Eiffel, Objective C, C++. Это стиль программирования, который фиксирует поведение реального мира таким способом, при котором детали его реализации скрыты.

 

Почему ООП так популярно:

 

- надежда, что ООП может просто и быстро привести к росту продуктивности и улучшению надёжности программ, помогая тем самым разрешить кризис в программном обеспечении;

 

- желание перейти от существующих языков программирования к новой технологии;

 

- вдохновляющее сходство с идеями, родившимися в других областях.

 

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

 

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

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

 

Новая парадигма

 

ООП часто называют новой парадигмой программирования. Другие парадигмы: директивная (структурное программирование — Pascal, C), логическая — Prolog, функциональное — Lisp, Effel. Парадигмы в программировании определяют, как проводить вычисления, как работа, выполняемая компьютером, должна быть структурирована и организована.

 

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

 

Рассмотрим примеры сложных систем из реального мира.

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

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

У растения нет централизованной части, управляющей остальными. Составные части растения работают независимо в тесном сотрудничестве.

Иерархически устроенные сложные структуры повсюду в природе – например в астрономии. Глактики, звездные системы, звезды и планеты. В деятельности людей – большие компании.

 

Можно выделить пять признаков сложной системы:

1. Являются иерархическими и состоят из взаимозависимых подсистем, которые в свою очередь также могут быть разделены на подсистемы и т.д. — до самого низкого уровня.

2. Выбор элементарных компонентов произволен и зависит от исследователя.

3. Каждая часть системы имеет свою функцию и может рассматриваться независимо от других.

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

5. Система может развиваться в сторону усложнения.

 

Объектно-ориентированный подход предполагает выделение в предметной области объектов — некоторых целостных сущностей, обладающих определённым поведением. Однотипные объекты объединяются в классы, образующие иерархию. Объекты одного класса обладают одинаковым поведением.

 

Примеры.

 

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

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

Итак, первым принципом ОО подхода к решению задачи является способ задания действий.

Действие в ООП инициируется посредством передачи сообщений агенту (объекту), ответственному за действия. Сообщение содержит запрос на осуществление действия и сопровождается дополнительной информацией (аргументами), необходимой для его выполнения. Получатель — это агент, посылается сообщение. Если он принимает сообщение, то на него автоматически возлагается ответственность за выполнение указанного действия. В качестве реакции на сообщение получатель запустит некоторый метод, чтобы удовлетворить принятый запрос (сравните с технологией «клиент–сервер»).

 

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

 

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

 

Второе отличие состоит в том, что интерпретация сообщения (а именно метод, вызываемый после приёма сообщения) зависит от получателя и является различной для различных получателей. Вы можете попросить своего товарища, летящего в город, где живут ваши родственники, поздравить их, и метод, который он изберёт для решения этого запроса, будет отличаться от того, который использовали на почте. Хотя родственники и в этом случае будут поздравлены. Если же Вы попросите коменданта общежития поздравить Ваших родственников, то у неё, вероятно, вообще не найдётся метода для решения этой задачи, а если она и примет сообщение, то выдаст диагностическое сообщение об ошибке.

 

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

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

 

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

 

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

 

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

Работников почты можно представить в виде, например, такой иерархии категорий.

§ Работник почты — это продавец услуг,

o продавец услуг — это просто продавец,

· продавец — это человек,

§ человек — это млекопитающее,

o млекопитающее — это животное,

· животное — это материальный объект.

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

 

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

 

Рис. 1.2. Иерархическое дерево.

 

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

 

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

 

Тот факт, что Ваш друг студент и оператор почты будет реагировать по-разному на просьбу поздравить родственников, является признаком полиморфизма.

 

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

 

Объектно-ориентированное проектирование — проектирование программы, основанное на объектно-ориентированной декомпозиции.

 

ООП – методология программы, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования

 

Характеристики ООП

Всё является объектом.

 

- Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщения — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.

 

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

 

- Каждый объект является представителем класса. Класс описывает общие свойства объектов.

 

- В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.

 

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

Вычисление и моделирование

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

 

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

 

При ООП мы считаем, что вычисление есть моделирование.

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

 

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

Люди строят дома, машины, самолёты, собирая из отдельных деталей, не изготовляя заново для каждого отдельного случая. Можно ли сконструировать ПО таким же образом?

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

Резюме

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

Программы — это совокупность взаимодействующих объектов. Каждый объект отвечает за конкретную задачу. Вычисление осуществляется посредством взаимодействия объектов. Объект получается в результате инкапсуляции состояния (данных) и поведения (операций), во многом аналогично абстрактному типу данных — АТД. Поведение объекта диктуется классом. Данные и поведение представлены в виде классов, экземпляры которых — объекты. Все экземпляры одного класса будут вести себя одинаковым образом в ответ на одинаковые запросы.

 

Объект проявляет своё поведение путём вызова метода в ответ на сообщение. Интерпретация сообщения зависит от объекта и может быть различной для различных классов объектов.

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

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

ООП — это взгляд на программирование, сосредоточенный на данных; в котором данные и поведение жёстко связаны. Для этого необходимо, чтобы объекты определялись вместе с сообщениями, на которые они могут реагировать.

 

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

Таким образом, объектно-ориентированный язык должен обладать свойствами абстракции, инкапсуляции, наследования и полиморфизма.

 

- Инкапсуляция с сокрытием данных — данные объекта скрыты для внешнего наблюдателя; доступ к ним может быть получен только при помощи методов (процедур, описанных в классе).

 

- Абстракция — расширяемость типов — способность добавлять типы, определяемые пользователем для того, чтобы дополнить ими встроенные типы. Один из принципов ООП заключается в том, чтобы типы, определяемые пользователем, должны обладать теми же привилегиями, что и встроенные типы.

 

- Наследование — способность создавать новые типы, повторно используя описание существующих типов.

 

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

 

Принципы Объектно-ориентированного подхода:

 

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

 

- Все объекты являются экземплярами, классов. Все объекты одного класса используют одни и те же методы в ответ на одинаковые сообщения.

 

 

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

 

 

- Принцип полиморфизма. Объекты реагируют на одно и тоже сообщение строго специфичным для них образом.

 

 

ООП в языке Object Pascal

Класс – специальный тип данных, содержащий как данные (поля), так и методы их обработки (процедуры и функции). Общепринято имена классов начинать с буквы T (например, TForm).

Объект – экземпляр класса, переменная соответствующего типа.

В объектном Паскале реализованы три основных принципа ООП.

1. Инкапсуляция – объединение в классе данных и подпрограмм для их обработки. Данные содержатся в полях класса, а подпрограммы для их обработки называются методами. Прямой доступ к полям по правилам ООП нежелателен, поэтому предусмотрены специальные конструкции, называемые свойствами, которые осуществляют чтение и запись в поле с помощью вызова соответствующего метода. Примеры (автомобиль). Кроме этого некоторые поля и методы можно сделать доступными только для методов класса.

2 Наследование – можно эффективно использовать ранее созданные классы, порождая от них потомков. Порождённый класс автоматически наследует поля, свойства и методы своего родителя, но может их изменить или добавить новые. Цепочки наследования могут быть неограниченной длины. Все классы являются потомками класса TObject. Этот класс не имеет полей и свойств, зато его методы позволяют создавать и удалять объекты. Если мы создаём потомка класса TObject, то это можно не указывать.

3. Полиморфизм – потомки могут переопределять методы, определённые в классе, от которого они порождаются.

 

В общем виде класс объявляется в разделе описания типов следующим образом

 

Type <имя класса> = class (<имя класса-родителя>)

<список полей, методов и свойств – членов класса>

end;

 

Если имя класса-родителя не указано, то новый класс будет порождён от стандартного класса TObject, который содержит общие для всех классов Delphi методы.

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

type

TFirsTObject = class;

TSecondObject = class (TObject)

Fist: TFirsTObject;

...

end;

TFirsTObject = class(TObject)

...

end;

Поля

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

Type TStudent = class

Age: Integer;

Name: String;

Birthday: TDateTime;

A: TObject

End;

Var S1, S2: Tstudent;

Begin

......

S1.Age:=18;

S1.Name:=’Петр’;

S2.Age:=19;

S2.Name:=’Наталья’;

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

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

Методы – встроенные в класс процедуры и функции.

Type TStudent = class

Age: Integer;

Name: String;

Birthday: TdateTime;

Function Age: integer;

Procedure ShowInfo;

A: TObject

End;

Для обращения к методам также используются составные имена:

X:= S1.Age;

S1.ShowInfo;

У всех экземпляров одного и того же класса методы общие. Внутри методов можно использовать поля класса без указания имени объекта. Кроме этого внутри метода можно использовать идентификатор Self (англ. сам)– обозначающий текущий объект (чтобы отличить поля от локальных переменных с тем же именем).

Методы объявляются в том же модуле, где описан класс, ниже его описания.

Function Tstudent.Age: integer;

Begin

Result:=round((Today- BirthDay)/365);

End;

Заголовок метода должен в точности соответствовать описанию класса.

Методы можно переопределять в порождённом классе. Для вызова родительского метода из переопределённого используется служебное слово Inherited (англ. унаследованный).

 

Типы методов рассмотрим ниже.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...