cpp

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

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

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

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

Тут стоит остановиться и сказать одну важную вещь. В языке Go понятия "класс" не существует. Роль классов выполняют структуры, которые, так же как и классы, могут иметь поля и методы. В большинстве случаев это то, что нам обычно и нужно. Иметь экземпляр структуры с набором данных, не зависящих от других экземпляров, и набор методов для управления этими данными. Тем не менее, многие понятия современного ООП в языке Go отсутствуют. Например, нет конструкторов и деструкторов, отсутствует наследование, перегрузка операторов и др. Об этом следует помнить.

После объявления структуры ее название становится новым типом данных. Тем самым пользовательские структуры расширяют возможности языка Go.

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

var t1 time.Time = time.Now()
var t2 time.Time = time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)

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

Чтобы иметь возможность манипулировать моментом времени, структура Time предоставляет множество методов. Например, с помощью метода Format() мы получали дату в виде строки, а с помощью метода UnixNano() — количество наносекунд, прошедших с начала эпохи. При вызове метода его название указывается после названия объекта через точку:

fmt.Println(t1.Format("02.01.2006")) // 26.03.2022
fmt.Println(t2.UnixNano())           // 1647892187000000000

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

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

Что же должно быть представлено в виде структур, а что в виде методов или полей? Если слово является существительным (автомобиль, телевизор, кнопка и т. д.), то оно может быть описано как структура. Метод описывает действие, применяемое к объекту, — например: начать движение, нажать кнопку, изменить цвет и т. д. Поле предназначено для сохранения текущего состояния объекта и его характеристик —например, размера кнопки и ее цвета, признака, нажата она или нет.

В заключение этого краткого обзора следует заметить, что в отличии от языков C# и Java, ООП-стиль программирования в языке Go не является обязательным стилем. В своих программах вы можете использовать только процедурный стиль. И в процедурном и в ООП-стиле есть свои преимущества и недостатки. Какой стиль использовать зависит от конкретной ситуации. Но чем больше будет ваша программа, тем более очевидными будут преимущества ООП-стиля.

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp