Термин объектно-ориентированное программирование (или ООП) существует примерно с конца 1950-х годов. С момента своего создания он стал чрезвычайно популярной парадигмой программирования и является ключевой функцией многих языков программирования, таких как: C++, Java, Python и Ruby, и это лишь некоторые из них. В этой статье мы кратко дадим ему определение, рассмотрим некоторые из его ключевых особенностей, его 4 основных принципа… и, возможно, несколько забавных примеров, связанных с D&D!

Краткое изложение объектно-ориентированного программирования

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

  • Классы. Класс подобен плану чего-либо. В нем изложены все общие функции каждого его экземпляра (мы рассмотрим такие экземпляры далее). В программировании это означает, что атрибуты и методы, определенные в классе, будут присущи всем экземплярам класса. Примером этого, относящимся к царству животных, может быть перечисление качеств млекопитающего. К ним относятся теплокровные, с мехом и обычно рождающие живых детенышей. Все они были бы присущи классу млекопитающих, и хотя отдельные млекопитающие могут иметь больше или меньше каждого из них… и, возможно, иногда дополнительные черты, характерные для этого отдельного млекопитающего, все они имеют эти общие черты. Попытка сослаться на D&D заставила бы меня провести сравнение с пустым листом персонажа для создания персонажа:

  • Объекты. Объект — это экземпляр класса. Другими словами, это конкретный и индивидуальный пример, созданный по образцу класса. Вернемся к нашим двум аналогиям, которые мы использовали… Если бы мы сделали персонажа по имени Алекс, который был бы человеком, он бы получил +1 ко всем основным характеристикам d&d и унаследовал бы черты теплой крови и волос от класса млекопитающих.
  • Атрибуты. Атрибут — это конкретный член данных внутри класса или объекта. Причина, по которой я говорю и класс, и объект, заключается в том, что если атрибут одинаков во всех экземплярах класса, он может быть установлен в самом проекте класса и, таким образом, является атрибутом класса. Если он различается среди экземпляров класса, значение атрибута должно быть установлено при создании экземпляра объекта. Эти атрибуты могут быть любого типа данных или структуры данных. Возвращаясь к нашему человеку Алексу, примером атрибутов могут быть вышеупомянутые основные характеристики d&d, которые все являются целыми числами.
  • Методы: метод — это поведение или процедура, которую может выполнять класс или объект. Примером метода класса может быть то, что все млекопитающие (включая Алекса) могут выполнять задание по еде. Примером метода, определенного в объекте (или экземпляре, который, таким образом, называется методом экземпляра), может быть то, что, поскольку ловкость Алекса равна 14, они получают модификатор +2 к спасброскам ловкости.

4 ключевых принципа ООП

Все примеры объектно-ориентированного программирования разделяют основы полиморфизма, инкапсуляции, наследования и абстракции. Давайте разберем это:

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

в этом примере каждый экземпляр класса символов будет иметь атрибуты firstName и lastName. У каждого из них также будут полиморфные методы приветствия и fullName, которые возвращают разные вещи на основе атрибутов экземпляров firstName и lastName. В этом конкретном примере будет возвращено приветствие alex:

>alex.greeting
'Hello, my name is Alex Smith.'

В то время как приветствие Криса вернется:

>chris.greeting
'Hello, my name is Chris Johnson.'
  • Инкапсуляция. Это закрытые методы, которые можно вызывать только внутри самого экземпляра или класса. На данный момент я упускаю из виду хороший пример инкапсуляции в отношении D&D. Но более реальным примером было бы, если бы у вас был экземпляр класса Person, выполняющий метод с именем open_bank_account. Внутри метода open_bank_account вам нужно будет получить значения дня рождения экземпляра человека, номера социального страхования и различных других частных атрибутов. Это вещи, которые вы не хотите, чтобы любой, кто взаимодействует с человеком, получал в свои руки или просматривал, однако вам все равно нужно получить их значения, чтобы выполнить общедоступный метод открытия банковского счета. Таким образом, эти атрибуты доступны только внутри объекта, в котором они определены.
  • Наследование – практика наследования одним классом методов и данных от другого в иерархическом порядке. Например, если у вас есть родительский класс транспортного средства, дочерним классом транспортного средства может быть класс грузовика. У грузовика есть все, что определяется транспортным средством: 4 колеса, двигатель, лобовое стекло и т. д., но у него также есть кузов и, возможно, сцепное устройство для прицепа. Пример с D&D может быть в случае типов существ. Например, все монстры в D&D имеют стандартные основные характеристики, но существа типа нежить наследуют эти характеристики, а также обычно имеют иммунитет к яду и, по крайней мере, сопротивление некротическому урону.

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

Заключение

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