Программирование  •  04 августа 2022  •  5 мин чтения

Как ООП помогает разработчикам писать код быстрее и проще

Программирование неоднородно — существуют принципы и подходы, которые позволяют писать программы по-разному в зависимости от контекста и задачи. Один из таких подходов — объектно-ориентированное программирование.
Николай Федосеев
Яндекс Практикум
Education Mentor,
SDE в PlayCanvas
Лена Шпрингер
Яндекс Практикум
Редактор

Что такое ООП

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

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

Например, нужно написать для интернет-магазина каталог товаров. Руководствуясь принципами ООП, в первую очередь нужно создать объекты: карточки товаров. Потом заполнить эти карточки данными: названием товара, свойствами, ценой. И потом прописать доступные действия для объектов: обновление, изменение, взаимодействие.
Так схематично выглядит программа, написанная по парадигме ООП
Кроме ООП, существуют и другие парадигмы. Из них наиболее распространена функциональная, в которой работают не с объектами, а с функциями. Если использовать функциональную парадигму, чтобы сделать каталог товаров, то начинать нужно не с карточек, а с функций, заполняющих эти карточки. То есть объект будет не отправной точкой, а результатом работы функции. 

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

Структура объектно-ориентированного программирования

В коде, написанном по парадигме ООП, выделяют четыре основных элемента:
1. Объект.
Часть кода, которая описывает элемент с конкретными характеристиками и функциями. Карточка товара в каталоге интернет-магазина — это объект. Кнопка «заказать» — тоже.
2. Класс.
Шаблон, на базе которого можно построить объект. Например, у интернет-магазина может быть класс «Карточка товара», который описывает общую структуру всех карточек. И уже из него создаются конкретные карточки — объекты. 

Классы могут наследоваться друг от друга. Например, есть общий класс «Карточка товара» и вложенные классы, или подклассы: «Карточка бытовой техники», «Карточка ноутбука», «Карточка смартфона». Подкласс берёт свойства из родительского класса, например, цену товара, количество штук на складе или производителя. При этом имеет свои свойства, например, диагональ дисплея для «Карточки ноутбука» или количество сим-карт для «Карточки смартфона».
3. Метод.
Функция внутри объекта или класса, которая позволяет взаимодействовать с ним или другой частью кода. В примере с карточками товара метод может: 

● Заполнить карточку конкретного объекта нужной информацией. 
● Обновлять количество товара в наличии, сверяясь с БД. 
● Сравнивать два товара между собой. 
● Предлагать купить похожие товары.
4. Атрибут.
Характеристики объекта — например, цена, производитель или объём оперативной памяти. В классе прописывают, что такие атрибуты есть, а в объектах с помощью методов заполняют эти атрибуты данными.
Так связаны между собой элементы ООП
Разберём, как выглядят эти структурные элементы в коде, на примере языка Java

Класс — это общая абстракция, которая описывает структуру объектов. Создадим класс “Item” для товара, у которого есть два параметра, то есть атрибута — название и цена. Сделаем это с помощью конструктора класса — метода, который инициализирует объект.
  
	
class Item {
    
    private String name;
    private String price;
    
    public Item(String name, 
String price){
        this.name = name;
        this.price = price;
    }
    
    public void card() {
        System.out.println(this.
name + " стоит " + this.price);
    }
}
        
Здесь мы сразу задаём ещё и метод card, который позволит вывести название и стоимость конкретного товара. А также задаём атрибуты name и price. Теперь создадим подкласс, у которого имя всегда будет «Телефон», а вот цена может отличаться.
  
class Phone extends Item {

    public Phone(String price){
        super("Телефон",price);
    }
}
        
Здесь мы взяли общий класс Item со всеми его атрибутами и методами и создали подкласс, в котором закрепили атрибут name. Теперь, вызывая этот подкласс, мы будем указывать только цену — а имя будет задано автоматически. 

Вызовем подкласс и создадим объект — телефон с конкретной ценой:
  
	
public class Main {  

  public static void main(String 
args[]) { 

    Phone1 = new Phone("30000");

  } 
}
        
И теперь мы с помощью метода card из класса сможем вызывать информацию о конкретном телефоне:
  
	
Phone1.card();
        
Эта строчка кода выведет информацию: «Телефон стоит 30000».

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

Основные принципы объектно-ориентированного программирования

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

Например, метод для внесения данных в карточку товара должен обязательно быть прописан в классе «Карточка товара». А не в классе «Корзина» или «Каталог товаров». 

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

В этом — вся суть объектно-ориентированного программирования. 
Разработчик создаёт: 

● Класс с определёнными свойствами;
● Подкласс на его основе, который берёт свойства класса и добавляет свои;
● Объект подкласса, который также копирует его свойства и добавляет свои. 

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

Например, в каталоге товаров:

  1. У класса «Карточка товара» есть атрибуты тип товара, название, цена, производитель, а также методы «Вывести карточку» и «Обновить цену».
  2. Подкласс «Смартфон» берёт все атрибуты и методы, записывает в атрибут «тип товара» слово «смартфон плюс добавляет свои атрибуты — «Количество сим-карт» и «Ёмкость аккумулятора».
  3. Объект «Смартфон Xiaomi 11» заполняет все атрибуты своими значениями и может использовать методы класса «Карточка товара».
Наследование хорошо видно в примере кода выше, когда сначала создавали класс, потом подкласс, а затем объект с общими свойствами.
Полиморфизм
Один и тот же метод может работать по-разному в зависимости от объекта, где он вызван, и данных, которые ему передали. Например, метод «Удалить» при вызове в корзине удалит товар только из корзины, а при вызове в карточке товара — удалит саму карточку из каталога. 

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

Этот принцип ООП, как и другие, обеспечивает отсутствие ошибок при использовании объектов.

Преимущества и недостатки ООП

Преимущества

● В парадигме объектов легче писать код. Удобно один раз создать класс или метод, а потом его использовать. Не нужно повторно переписывать десятки строк кода. Можно пользоваться специальными рекомендациями по написанию ООП-кода — SOLID. 
● Читать код гораздо проще. Даже в чужом коде обычно сразу видны конкретные объекты и методы, их удобно искать, чтобы посмотреть, что именно они делают. 
● Код легче обновлять. Класс или метод достаточно изменить в одном месте, чтобы он изменился во всех наследуемых классах и объектах. Не нужно переписывать каждый объект отдельно, выискивая, где именно в коде он расположен. 
● Программистам удобнее работать в команде. Разные люди могут отвечать за разные объекты и при этом пользоваться плодами трудов коллег. 
● Код можно переиспользовать. Один раз написанный класс или объект можно затем переносить в другие проекты. Достаточно однажды написать объект «Кнопка заказа» и потом можно вставлять его в почти неизменном виде в разные каталоги товаров и мобильные приложения. 
● Шаблоны проектирования. Именно на базе ООП построены готовые решения для взаимодействия классов друг с другом, которые позволяют не писать этот код с нуля, а взять шаблон.

Недостатки

● Сложность в освоении. ООП сложнее, чем функциональное программирование. Для написания кода в этой парадигме нужно знать гораздо больше. Поэтому перед созданием первой рабочей программы придётся освоить много информации: разобраться в классах и наследовании, научиться писать публичные и внутренние функции, изучить способы взаимодействия объектов между собой. 
Громоздкость. Там, где в функциональном программировании хватит одной функции, в ООП нужно создать класс, объект, методы и атрибуты. Для больших программ это плюс, так как структура будет понятной, а для маленьких может оказаться лишней тратой времени. 
● Низкая производительность. Объекты потребляют больше памяти, чем простые функции и переменные. Скорость компиляции от этого тоже страдает.
Получается, что основная функция объектно-ориентированного программирования — облегчить написание больших, сложных программ, над которыми трудятся группы разработчиков.

Популярные языки объектно-ориентированного программирования

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

Определённые языки подходят для использования объектно-ориентированного программирования больше, так как предоставляют удобные инструменты для работы с классами и объектами:

 ● Java; 
● Go;
● Python;
● C++;
● JavaScript;
● C#;
● PHP;
● Ruby;
● Scala;
● Kotlin;
● Swift;
● Dart.

Главное об ООП

  1. ООП — это парадигма разработки, набор правил и критериев, по которым пишут код. Её суть в том, что весь код состоит из объектов, которые взаимодействуют друг с другом. Существуют и другие парадигмы, например, функциональное программирование.
  2. В ООП выделяют четыре основных элемента: классы, объекты, методы и атрибуты.
  3. Объектно-ориентированный подход к программированию строится на трёх основных принципах: наследование, инкапсуляция и полиморфизм.
  4. Программы, созданные по принципам ООП, более структурированные, легче читаются и хорошо масштабируются. При этом они сложнее в написании.
  5. В парадигме ООП удобнее всего писать на языках Java, C++, C#, JavaScript и некоторых других.
Поделиться 
Tue Sep 20 2022 19:55:49 GMT+0300 (Moscow Standard Time)