Файл: История и развитие методологии объектно-ориентированного программирования. Сферы применения (История и развитие).pdf
Добавлен: 30.03.2023
Просмотров: 172
Скачиваний: 1
В предыдущем примере есть метод типа Console (Console.WriteLine) для вывода сообщений или, например, класс Math имеет методы для вычислений математических функций.
Например:
class Program
{
static double Func( double x) //дополнительный метод
{
return 1 / x; //Возвращаемое значение
}
static void Main() //точка входа в программу
{
Console.Write("a=");
double a=double.Parse(Console.ReadLine());
Console.Write("b=");
double b=double.Parse(Console.ReadLine());
for (double x = a; x <= b; x += 0.5)
{
double y = Func(x); //вызов метода Func
Console.WriteLine("y({0:f1})={1:f2}", x, y);
}
}
В этом примере метод Func содержит параметр х, чтобы он возвращал в метод Main значение выражения (типа double), пере именем метода указывается double, а в теле метода return завершает выполнение и передает управление в точку вызова метода. [3]
Методы объекта можно классифицировать по функциям управления, реализации, доступа и вспомогательным функциям или как:
- селектор (доступ к переменным без их изменения),
- конструктор (создание , инициализация),
- деструктор (разрушение),
- модификатор (изменение состояния),
- итератор (доступ к содержанию в определенной последовательности).
Итак, объекты играют главную роль, имеют свои свойства и методы и объединяются в классы, являясь основными единицами абстракции.
События
В событийном плане объекты могут вести себя по-разному. Например, какая-либо кнопка может быть включена, отключена, в поле видимости, нажата долгим нажатием и т.д., всё это будут разные события.
Например:
private void button1_Click(object sender, EventArgs e)
{
// реакция на событие нажатия кнопки 1
};
(Кожемяченко2часть)
Или, например:
/ "Изменить"/ private void Change_ED(bool Value)
{
Change_B.Enabled = Value;
Change_TSB.Enabled = Value; Change_TSMI.Enabled = Value;
}
/ "Удалить"/1private void Del_ED(bool Value)
{
...;
}
/ "Сохранить"/ private void Save_ED(bool Value)
{
...;
}
Создание методов в классе основной формы для кнопок «изменить», «удалить», «сохранить».[5] Из этого примера понятно, что объекты могут реагировать на события. Класс, в котором будут события, должен уметь его объявить, передать обработчику соответствующие аргументы для включения события и, если необходимо, проанализировать результаты события по значениям выходных данных обработчика. Таким образом, класс-отправителя отсылает сообщение в межмодульное пространство и его получают и обрабатывают объекты классов-получателей.
С программной точки зрения обработчик события это процедура с аргументами, а сообщение для включения события аналогично вызову процедуры.
Сегодня определение класса в объектных языках является аналогом определения типа в СТS, а именно,
- данные, задающие свойства объектов класса;
- методы, определяющие свойства объектов класса;
- события, которые могут происходить с объектами класса [2]
Значит, создание программы предполагает осуществление следующих действий:
- поместить необходимые компоненты на форме (которя сама тоже является компонентом)
- задать им начальные значения свойств
- описать их реакции на события [4]
Фактически, текст программы складывается из описания реакции компонентов на заданные события. То есть программа, написанная с использованием объектно-ориентированной методологии, выглядит как совокупность взаимодействующих объектов. [3]
Можно подытожить, что события выполняют одну из ключевых ролей, являясь аналогом действий, событий реального мира.
Типы данных
Могут быть простыми (скалярными), если их значения неделимы, или сложными, если одно значение данных состоит из множества значений. Типы данных могут быть встроенные и определенные пользователем. Также типы данных могут быть статическими и динамическими . У статических размер отводимой под них памяти известен во время объявления, у динамических - нет, это происходит во время выполнения программы. Типы данных могут быть значимые и ссылочные. У значимых типов значением служит значение переменной по прямому адресу (отводимые под переменную ячейки памяти), а у ссылочных типов все очень интересно – значением является ссылка на объект, находящийся обычно в динамической памяти, называемой «кучей». Интересный момент в том, что такие переменные могут «пользоваться» значениями данных одного объекта. Например, ссылочные переменные x, y, z, соответственно обозначающие «время тренировки», «вес бегуна», «количество выпитой воды», могут обращаться к объекту «бегун№2» класса «спортсмены». [2]
Есть ли принципиальное различие между классом и типом? Можно считать их синонимичным понятиями, если рассматривать класс как хорошо определенный тип данных, а объект как хорошо определенную переменную. Например: integer (относится к числовому типу данных) и string (относится к строковому типу данных) до сих пор называют типами, а относящиеся к ним экземпляры переменными. [2]
Инкапсуляция
Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя. То есть код, управляющий этими данными недоступен для внешнего воздействия и, будучи объединены вместе, код и данные образуют объект.[6]
В объектно-ориентированном программировании связывается процедура и соответствующие структуры данных. Инкапсуляция это свойство объектов, средство реализации доступа к данным только через соответствующие методы, это значит, что в одном объекте связаны данные и процедуры их обработки.
Допустим, в программе есть два массива, один - сроки годности на товар, другой - цена на этот же товар, что является данными. При обращении к этим данным каждый метод будет вызван только с помощью составного имени, указывающего, для обработки каких данных нужен этот метод.
Можно сказать, что инкапсуляция является полезным свойством, уберегающим от смешения и способствующим модульности внутри программы.
Наследование
Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего, с частично или полностью заимствующейся функциональностью . Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс – потомком, наследником или производным классом.
Наследование позволяет создавать новые объекты, используя свойства и характеристики прежних . К родительским элементам (полям, методам, свойствам) можно добавить свои элементы или заменить своими. Класс - потомок благодаря этому будет обладать большими возможностями, чем предок.[3] Также это значит, что подобный или видоизмененный объект может быть использован для другой задачи, это позволяет не выполнять работу или часть работы по созданию объекта повторно. Наследование позволяет создавать иерархические структуры данных. Порожденный тип называется дочерним , а порождающий - родительским.
В.А. Биллиг считает, что мощь ООП основана на наследовании, так как какой-либо класс может использоваться многократно. Действительно, зачем увеличивать количество кода, когда, когда то, что уже построено, можно использовать повторно? К тому же, когда возникает ситуация, когда необходимо расширить возможности класса, принцип наследования дает еще одно преимущество: нам не нужно исправлять хорошо работающий класс, вызывая тем самым кучу несовместимостей, мы просто создаем наследника, дополнив родительский класс новыми возможностями. Потомок может добавить себе поля класса, то есть новые свойства, иначе его создание было бы бесполезным, однако изменить в себе свойства, унаследованные от родительского класса, он не может. [2]
Это похоже на эффект матрешки, если родительский класс сравнить с самой маленькой, исходной, а дочерние - с большими, последующими , при этом можно создавать все большие, в которые помещаются предыдущие.
Наследование может быть одиночным и множественным. При одиночном наследовании класс имеет только один предок (суперкласс), при множественном наследовании класс может иметь любое количество предков (в некоторых языках запрещено). В C# от двух и более классов дочерний класс создать нельзя, кроме исключений.[10]
Таким образом, объект - это экземпляр какого-то класса, от класса зависят свойства и поведение его экземпляров. Поведение объекта зависит от его методов, а состояние от свойств.
Например, экземпляры класса «животное» имеют одинаковые методы : бегать, прыгать , питаться , но экземпляры этого класса могут иметь разные свойства: «пушистый», «гладкошерстный», «дикий», «домашний» и т.д. Чтобы добавить характерное поведение для данного объекта, можно создать наследующий класс, «обогащенный» характерными признаками. Например, наследником класса «животное» может быть класс «животное_травоядное» (приложение, рисунок 9).
Это значит что классы-потомки являются разновидностью родительского класса, и в свою очередь, класс-предок – их обобщением. Также это значит, что к объектам классов-потомков можно обращаться с помощью одного и того же имени, но действия могут выполняться другие, так проявляется полиморфизм. [3]
На основании выше изложенного можно сделать интересный вывод, что наследование в реальной жизни и программировании, хоть и кажется сходным, но, всё-таки далеко не одно и то же, в программировании оно носит гораздо более общий характер.
Полиморфизм
Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Одно и то же имя может соответствовать различным действиям в зависимости от типа объекта. То есть один и тот же программный текст будет исполнен по-разному, в зависимости от того, с каким объектом связана его сущность. Например, для текстовых строк «+» будет выполнять соединение, а для числовых сложение. [6]
В основе полиморфизма семейства классов лежат три механизма:
-одностороннее присваивание внутри семейства классов
-переопределение потомком метода, наследованного от родителя.
-динамическое связывание.
Интересно, что не только потомки могут вызывать методы родительского класса, но и, наоборот, благодаря полиморфизму, методы родительского класса могут вызывать методы потомков способом контрактов. В этом случае метод родителя объявляется виртуальным и, в контракте, не изменяя сигнатуру виртуального метода, потомку можно переопределить реализацию. [2]
В C# использование нескольких методов с одним и тем же именем для реализации одного алгоритма для разных типов данных называется перегрузкой методов. Перегрузка методов используется для того, чтобы компилятор выбрал лучший вариант или выполнил неявные преобразования типов. Это полезно тем, что программисту удобнее помнить имя одного метода, а не нескольких, и не принимать решения о том, какой из них более подходящий, что может сделать за него компилятор. Перегрузка методов как раз и является проявлением полиморфизма. [3]
Например:
class Program
{
static int max(int х) //вариант 1 метода max
{
int y = 0;
while (х > 0)
{
if (х % 10 > y) y = х % 10;
х /= 10;
}
return y;
}
static int max(int х, int y) //вариант 2 метода max
{
if (х > y) return х;
else return y;
}
static int max(int х, int y, int z) //вариант 3 метода max
{
if (х > y && х > z) return х;
else if (y > z) return b;
else return z;
}
static void Main()
{
int х = 1283, y = 45, c = 35740;
Console.WriteLine(max(х));
Console.WriteLine(max(х, y));
Console.WriteLine(max(х, y, z));
}
}
Таким образом, полиморфизм является интересным свойством, способствующим многообразию объектов.
В целом, получается, что суть методологии объектно-ориентированного программирования сводится к определенному видению и планированию своих действий как программиста в создании программных продуктов. Поскольку целью такого программирования является расширение возможностей программных систем и уменьшение повторно используемого кода, оно основано на создании классов объектов со своими полями и методами и это, в соответствующих случаях позволяет применить принципы наследования, полиморфизма, абстракции, инкапсуляции и индивидуальности объектов для исполнения этой цели.
Глава 3.Сферы применения объектно-ориентированного программирования
Возможности ООП, по сравнению с традиционными методами, в значительной степени повышают производительность разработчиков, так как объектно-ориентированные программы не только легче понимать, но и модифицировать, и вносить коррективы. [8]
ООП реализовано в объектно-ориентированных версиях языков С и Pascal ,(Borland Pascal, Object Pascal). Примеры объектно-ориентированных языков: Python; Delphi; Perl 6; C#; Scala; PHP; Objective C; Ruby; C++; Java; [2,3] «Чисто объектными» считаются C#, Smalltalk, Java, Ruby , в них почти любые данные являются объектами, а код- объектом какого-либо класса. «Гибридными» часто называют С++, и Delphi , в них можно программировать и используя, и не используя объектные средства.