Найти в Дзене
ZDG

Введение в ООП. Часть 2: Методы объектов

Предыдущая часть:

В первой части я рассказал, что такое объекты, как их создавать, и как с ними работать. Отмечу, что я не имел в виду какой-то конкретный язык программирования. Объект есть объект, его суть везде одинакова. Учите любой язык, и когда доберетесь до объектов, то просто прочитаете пару строчек, как они там делаются, и будете уже всё знать. А бывают языки без объектов? Да, но тогда вы сможете создать вручную структуры, которые работают так же, как объекты.

В этой части хотелось бы осветить тему методов. Если кратко, то методы – это функции. Самые обычные. Но в чём прикол?

Рассмотрим пример, когда банковский счет пользователя представлен как объект. У этого объекта, разумеется, будут какие-то свойства – ну типа номер счета, валюта, сумма на счету. Попробуем так:

Какие операции обычно делают с банковским счетом? Добавить денег или забрать денег. Чтобы добавить на счет 100 долларов, можем ли мы написать вот так?

account.sum += 100;

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

Ну и что же делать программисту? Везде, где делаются операции с деньгами, каждый раз проверять эти условия, переписывая их снова и снова? Не дождётесь!

Ленивый программист пишет для этого функцию. Мы уже обсуждали, что функция – это такое окошко, в которое можно передать свои данные и получить оттуда результат.

Ну и допустим он пишет так:

Мы передаём в функцию (суём в окошко) во-первых переменную account, хранящую нужный объект, во-вторых количество денег amount.

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

add_sum(account, 5);

Детали не важны, важно то, что у нас в программе теперь появилась функция.

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

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

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

Логичная идея – хранить функцию, которая связана с объектом, в самом объекте. Сделать функцию таким же свойством объекта, как и все остальные его свойства. И такая функция будет называться "метод". Метод объекта. Если свойства объекта просто присваиваются:

account.sum = 1000;

то методы объекта вызываются так же, как функции:

account.add_sum(5);

Как описать метод в объекте? Просто вставить в него описание функции. В разных языках есть отличия, опять же несущественные. Увидите – и так поймете. В целом, примерно так:

Как видим, у объекта появилось свойство add_sum, и этому свойству мы присвоили не число и не строку, а ссылку на безымянную функцию (потому что имя уже есть у свойства). Заметьте, что в функцию больше не нужно передавать параметр account, потому что она и так уже находится внутри объекта-счёта и через this знает, с чем работает.

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

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

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

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

ООП | ZDG | Дзен

Наука
7 млн интересуются