Подпишитесь на наши новости
Вернуться к началу с статьи up
 

ОБЪЕ́КТНО ОРИЕНТИ́РОВАННОЕ ПРОГРАММИ́РОВАНИЕ

Авторы: А. В. Ильин, В. Д. Ильин

ОБЪЕ́КТНО ОРИЕНТИ́РОВАННОЕ ПРОГРАММИ́РОВАНИЕ (ООП) [англ. object-oriented programming (OOP)], методология разработки программ для компьютерного моделирования систем произвольного назначения, представленных в виде совокупностей объектов, каждый из которых отнесён к определённому классу и наделён наборами данных (атрибутов объекта) и процедур (методов) их обработки, а классы объектов могут быть представлены в виде иерархии наследования атрибутов и методов. Преимущества ООП особенно отчётливо проявляются при создании сложных программных систем, выполняемых коллективами разработчиков: одни могут проектировать функциональное поведение и структуру системы; другие – её составляющие и способы их взаимодействия; третьи – заниматься программной реализацией. При этом разработчикам составляющих и занимающимся программной реализацией необязательно знать о системе в целом, а разработчикам системы в целом – о деталях её составляющих, способах их взаимодействия и программной реализации.

Основные понятия

Объект в ООП – это модель экземпляра определённого класса сущностей моделируемой системы. Класс содержит определение данных и методов, являющихся общими для входящих в него объектов. Он задаётся атрибутами (свойствами класса), описывающими состояние его объектов, совокупностью процедур (методов класса) и правилами доступа извне (из др. частей программы) к атрибутам и методам, определяющими интерфейс класса. В иерархии наследования класс-потомок порождается путём добавления одного или нескольких атрибутов и/или методов к атрибутам и/или методам одного или нескольких классов-родителей. Напр., от класса «точка» с атрибутами «абсцисса», «ордината» и методами создания, чтения и изменения координат может быть порождён класс «цветная точка», объекты которого будут иметь дополнительный атрибут «цвет» и некоторые методы управления этим атрибутом. На языке ООП си++ (C++) объявления классов «точка» (class Point) и «цветная точка» (class ColorPoint) могут быть записаны следующим образом (реализация методов не приводится).

// Ключевое слово public (публичный) означает, что метод или атрибут доступен извне класса;
// ключевое слово protected (защищённый) – что метод или атрибут доступен только внутри
// класса и его «потомков»
class Point
{
public:
// Метод создания («конструктор»), имеющий параметры абсцисса и ордината
Point(double rX, double rY);
// Метод чтения абсциссы
double Get_X();
// Метод чтения ординаты
double Get_Y();
// Метод изменения абсциссы
void Set_X(double rX);
// Метод изменения ординаты
void Set_Y(double rY);

protected:
// Вещественная переменная, представляющая атрибут абсцисса
double m_rX;
// Вещественная переменная, представляющая атрибут ордината
double m_rY;
};
// Префикс m_ принято употреблять для именования атрибутов, иначе называемых
// «членами» (англ. member) класса, чтобы было проще отличать их от других переменных в
// коде реализации методов

class ColorPoint : public Point
{
public:
// Конструктор, имеющий параметры абсцисса, ордината, цвет
ColorPoint(double rX, double rY, long rgbColour);
// Метод чтения цвета
long GetColor();
// Метод изменения цвета
void SetColor(long rgbColor);

protected:
// Целая переменная, представляющая цвет точки – дополнительный атрибут
long m_rgbColor;
};

Объявление класса задаёт тип данных, который может быть использован при определении других классов. Напр., класс “круг” (class Circle) может иметь атрибут “центр” типа “точка” (Point m_center):

class Circle
{
public:
// Метод создания, имеющий параметры центр и радиус
Circle(Point ptCenter, double rRadius);
// Далее объявления некоторых методов для работы с кругом
// …

protected:
Point m_center;
// Вещественная переменная, представляющая радиус
double m_rRadius;
};

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

Объявление класса на С++:

class Point
{
public:
Point(double rX, double rY);
double Get_X();
double Get_Y();
// Метод поворота с параметром «угол»
void Rotate(double rAngle);
protected:
double m_rX;
double m_rY;
};

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

Создание и развитие

С развитием компьютерного моделирования и усложнением моделируемых систем всё более явными становились недостатки методологий разработки программ с использованием процедурно-ориентированных языков программирования [алгола (Algol), фортрана (Fortran) и др.]. Это объясняется отсутствием в них средств, удобных для описания сложных систем, слабой поддержкой повторной применимости ранее разработанных программ и совместных разработок коллективами программистов. Идея уменьшения сложности разработки путём декомпозиции исходной задачи на подзадачи, лежащая также в основе технологий структурного программирования и модульного программирования, в ООП воплощена на более совершенном методологическом уровне. 

В 1967 сотрудники Норвежского вычислительного центра Оле Йохан Даль и Кристен Нюгорд создали язык симула 67 (Simula 67), ставший первым языком ООП. В нём объединение данных и процедур их обработки было названо объектом, а совокупность схожих объектов – классом. Среди последующих языков ООП наиболее удачным признан смолток-80 (Smalltalk-80), созданный в США в конце 1970-х гг. группой сотрудников исследовательского центра «Xerox» «Palo Alto Research Center» (PARC) под руководством Алана Кея. Успех этого языка способствовал развитию и распространению концепции ООП. В начале 1980-х на основе языка си (C) Бьярне Строуструпом (Дания) был создан си++ (C++); в середине 1980-х гг. в компании «Apple» на основе языка паскаль (Pascal) под руководством Лари Теслера (США) и при помощи Никлауса Вирта (Швейцария) разработан «объектный паскаль» (Object Pascal). В начале 1990-х гг. Джеймсом Гослингом (Канада) в компании «Sun Microsystems» (США) был создан язык джава (Java), который стал впоследствии одним из наиболее эффективных средств разработки веб-приложений и приложений для мобильных устройств.

С 1990-х гг. ООП развивается как методологическое основание технологий программирования, ориентированных на значительное повышение производительности совместных разработок коллективами программистов. Непрерывно растёт область применения ООП, прирастает семейство языков, совершенствуются системы программирования, увеличивается число программных продуктов различного назначения, разработанных на языках ООП.

Лит.: Мейер Б. Объектно-ориентированное конструирование программных систем. М., 2005; Буч Г., Максимчук Р. А. Объектно-ориентированное проектирование с примерами применения. М., 2010. Гама Э., Хелм Р. Приемы объектно-ориентированного проектирования. Паттерны проектирования. С.-Петербург, 2016.

Вернуться к началу