Я спросил ChatGPT, зачем мне писать статью об объектно-ориентированном программировании, когда ресурсов достаточно. Из списка причин одна совпадала с моим мотивом: изложить свою точку зрения.

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

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

Парадигмы программирования

В программировании большинство языков имеют свой собственный уникальный набор функций и способов решения технических проблем. Поскольку каждый язык программирования предлагает уникальные функции, возникла необходимость в создании системы, позволяющей различать их. Это привело к созданию термина«парадигма программирования». Цель парадигм программирования — различать и классифицировать уникальные атрибуты каждого языка, облегчая понимание их возможностей и выбор правильного для конкретной задачи.

парадигма (сущ.) — типичный пример или образец чего-либо; шаблон или модель.

Другими словами, парадигма программирования – это стиль или подход к написанию программного обеспечения. Он определяет, как программное обеспечение организовано и построено. Некоторые из парадигм программирования включают в себя:

                         Imperative programming
                         Procedural programming
                         Functional programming
                         Declarative programming
                         Object-oriented Programming

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

Объекты

ориентированный (суффикс) — указывает направление, в котором что-то нацелено

Я понял, что термин объектно-ориентированный передает идею подхода к программированию. Что в данном контексте означает термин «объект»?

предмет (существительное) — материальная вещь, которую можно увидеть и потрогать.

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

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

blueprint(n) — план проектирования или другой технический чертеж.

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

Создание объектов в Python

Первый шаг — начать создавать свой класс в объектно-ориентированном программировании.

Для построения характеристик (атрибутов) объекта мы используем специальный метод Python __init__.

class Car:
    #defining features (attributes/properties)
    def __init__(self, model, year, min_speed, max_speed, odometer, engine_status='off'): 
        self.model = model
        self.year = year
        self.min_speed = min_speed
        self.max_speed = max_speed
        self.odometer = odometer
        self.engine_status = engine_status

Затем мы добавляем поведение (методы) в соответствии с тем, чего мы хотим достичь.

#adding behaviors/functionality (method)
    def start_engine(self):
        if self.engine_status == 'off':
            self.engine_status = 'on'
            print('Engine started.')
        else:
            print('Engine is already running.')

    def get_status(self):
        if self.year <= 2017:
            return "Old"
        else:
            return "New"

    def get_price_range(self):
        status = self.get_status()
        if status == "Old":
            if self.odometer < 50000:
                return "$10,000 - $15,000"
            else:
                return "$5,000 - $10,000"
        else:
            return "$20,000 - $30,000"
    
    def __str__(self):
        return f'Car model: {self.model}\nYear: {self.year}\nMinimum speed: {self.min_speed}\nMaximum speed {self.max_speed}\nEngine status: {self.engine_status}'

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

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

экземпляр (существительное) — пример или единичное появление чего-либо.

Как только наш класс определен, мы можем создавать объекты — экземпляры этого класса. Когда мы создаем объект, мы создаем уникальную копию класса и присваиваем ей имя. Мы можем создать столько объектов нашего класса, сколько нам нужно, каждый со своими уникальными данными и поведением.

car1 = Car('BMW', 2013, 30, 240, 250000 )
car2 = Car('BMW', 2015, 30, 230, 100000)
car3 = Car('Toyota', 2020, 20, 180, 5000)
car4 = Car('Honda', 2016, 25, 200, 150000)

Использование объектов в Python

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

cars = [car1, car2, car3, car4]
# Get list of old and new cars
old_cars = []
new_cars = []

for car in cars:
    if car.get_status() == "Old":
        old_cars.append(car)
    else:
        new_cars.append(car)

answer = str(input("Get the list of cars according to their status: "))

if answer.upper() == 'OLD':
    print("Old cars:")
    for car in old_cars:
        print(f"{car.model}, {car.year}, {car.odometer} km/h - Price range: {car.get_price_range()}")
elif answer.upper() == 'NEW':
    print("\nNew cars:")
    for car in new_cars:
        print(f"{car.model}, {car.year}, {car.odometer} km/h - Price range: {car.get_price_range()}")
else:
    print('You have to type "old" or "new" ')

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

Вывод (набрав «старый»):

Old cars:
BMW, 2013, 250000 km/h - Price range: $5,000 - $10,000
BMW, 2015, 100000 km/h - Price range: $5,000 - $10,000
Honda, 2016, 150000 km/h - Price range: $5,000 - $10,000

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

Заключение

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

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