4,9K подписчиков

Введение в ООП. Часть 1: Рукотворный объект

660 прочитали

ООП значит объектно-ориентированное программирование. Из этого названия следует, что мы пишем свои программы таким образом, чтобы они использовали объекты. Но что такое объект и зачем он нужен?

Обычно в учебниках по ООП объясняют примерно так: Вот есть класс Животное, а у него есть подкласс Собака, у неё 4 лапы и она умеет гавкать, но стоп, давайте по порядку и без собак.

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

ООП значит объектно-ориентированное программирование. Из этого названия следует, что мы пишем свои программы таким образом, чтобы они использовали объекты. Но что такое объект и зачем он нужен?

К примеру, мы работаем в своей программе с числом 5. Пусть это будет количество книг. И вот мы написали число 5 в нескольких местах. Потом придёт указание, что книг должно быть не 5, а 10. И тогда нам придется везде исправить число 5 на 10. Но так как в программе могут быть ещё и другие числа 5, то нужно обязательно следить, чтобы исправить именно количество книг, а не какое-то другое число 5. Вообразите программу с миллионом строк.

Так что первое, что программисты для себя изобрели – это константы. Это специальные буквенные обозначения, которые можно ассоциировать с числом или строкой, и поменять потом нельзя. Поэтому они и называются константы – constants, "постоянные", в отличие от "переменных". И вот вы можете завести у себя в программе константу BOOKS = 5 и далее везде, где нужно написать количество книг, вы будете писать не 5, а BOOKS. А если надо будет 5 заменить на 10, то вы замените только одну строчку: BOOKS = 10. Кроме того, вы вместо абстрактной цифры 5 видите нормальное слово BOOKS и всегда понятно, о чём речь. Удобно, правда?

Ну и при чём тут объекты?

А вот вжух, и нужно кроме количества книг хранить каждую отдельную книгу. Как представить книгу в памяти? Конечно, набором её свойств. Например, обложка у неё красная, есть какое-то название, год издания и сколько-то страниц.

Значит, вам нужно в памяти для одной книги выделить 4 переменные: цвет, название, год и количество страниц. Допустим,

var color = 'red';
var title = 'Война и мир';
var year = 2020;
var pages = 1050;

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

Можно ли как-то сгруппировать эти переменные, чтобы они не валялись по отдельности, а имели единую точку доступа?

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

var book = ['red', 'Война и мир', 2020, 1050];

Отлично. Теперь, обращаясь к массиву book, мы обращаемся к единому указателю на все свойства книги. Чтобы получить какое-то свойство, используем адресацию в массиве (начиная с нуля, конечно):

book[0] – это цвет
book[1] – это название
book[2] – это год
book[3] – это количество страниц

Опять плохо. Мы теперь должны помнить, что в массиве book адрес 0 это цвет, 1 это название, и т.д. Так давайте введем константы!

const COLOR = 0;
const TITLE = 1;
const YEAR = 2;
const PAGES = 3;

Теперь можно вполне прилично обращаться к свойствам книги:

book[COLOR] = 'red';
book[TITLE] = 'Война и мир';
book[YEAR] = 2020;
book[PAGES] = 1050;

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

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

Доступ к свойствам такого объекта выглядит так:

book.color = 'red';
book.title = 'Война и мир';
book.year = 2020,
book.pages = 1050;

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

Давайте опять понаблюдаем за транслятором языка, который встретил создание объекта в коде:

"Я вижу, что переменной book присваивается объект. Я вижу, что у объекта есть свойства color, title, year, pages. Я выделю область памяти для них, и во-первых сохраню там информацию о том, какие свойства есть, а во-вторых, значения этих свойств. А адрес этой области памяти запишу в переменную book."

И потом, когда он видит обращение к свойству объекта book.title:

"Я вижу, что написано book.title. Значит, программист считает, что переменная book – это объект, и у него должно быть свойство title. Хорошо, я проверю. В book хранится адрес памяти, где должен лежать объект. Я обращусь к этому адресу. Я нашел там информацию, которая описывает свойства объекта. Там указано, что свойство title действительно существует. И также указано, по какому адресу оно находится. Я обращусь к этому адресу и найду требуемое значение. Это строка с содержимым 'Война и мир'."

Дополнительно это позволяет осуществить проверку правильности доступа. Если вы обратитесь к несуществующему свойству объекта, или вообще не к объекту, проверкой это будет выявлено и возникнет ошибка.

Конечно, ООП на этом не заканчивается, а только-только начинается. Дальше будут возникать и нарастать друг на друге всё более сложные концепции, но ничего – разберемся.

Читайте дальше:

Подборка всех материалов по ООП:

ООП | ZDG | Дзен
dzen.ru