Центр практического обучения программированию.
  • (044) 237-37-07
  • (063) 237-37-07
Заказать звонок

В чём разница между объектно-ориентированным программированием и объектно-ориентированным проектированием?

В начале пути каждого программиста ждут такие несложные задачи как, например, посчитать 3+2 или напечатать на экране строку «Hello, world!». Их решения являются не менее тривиальными (все последующие примеры написаны на языке Java):

int sum = 3 + 2;

System.out.println(«Hello, world!»);

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

Итак, существует два похожих не только по звучанию, но и по значению понятия: Объектно-ориентированное программирование и Объектно-ориентированное проектирование (в дальнейшем ОО-программирование и ОО-проектирование соответственно). Разберемся в каждом из них.

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

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

Ниже приведен пример определения такого понятия как «Участник форума»:

class User

{

private String accountName; // названиемание аккаунта

private int rating;
// рейтинг пользователя

// конструктор

public User(String name, int rate) {

this.accountName = name;

this.rating = rate;

}

// оставить сообщение

public void leaveMessage(String message) {

// …

}

// выйти из форума

public void logOut() {

// …

}


}



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


User


john
= new

User
(«John1975», 230);


User


eugene
= new

User
(«Fearless», 300);

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

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

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

Для примера возьмем паттерн проектирования под названием Singleton. Этот паттерн гарантирует, что у класса может быть лишь один экземпляр (а не несколько, как было описано выше при определении ОО-программирования), и обеспечивает доступ к этому единственному объекту. Суть работы Singleton’а заключается в том, что сам класс контролирует то, что у него есть только один экземпляр, и запрещает создание новых объектов.

Далее приведен код примера паттерна Singleton:

class SingleObject

{

// единственный экземпляр класса SingleObject

private static SingleObject instance = null;

// конструктор

private SingleObject() {

// …

}

// получение экземпляра класса

public static SingleObject
getInstance() {

if (instance == null) {
instance = new
SingleObject();

}

return instance;

}


}

Класс SingleObject хранит статическую переменную instance, которая является объектом данного класса, а метод getInstance() предоставляет доступ к этой переменной и контролирует, чтобы на протяжении работы программы существовал лишь один объект класса SingleObject.

Пример получения экземпляра класса:

SingleObject
single =
SingleObject
.getInstance();

В результате переменная
single
хранит в себе объект класса
SingleObject.
Вызов SingleObject.getInstance() всегда возвращает один и тот же экземпляр класса.

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


Остались вопросы?
Задать их менеджеру
Задать вопрос менеджеру
Введите свое имя и номер телефона и наш менеджер свяжится с вами!