Предыдущая часть:
В первой части я рассказал, что такое объекты, как их создавать, и как с ними работать. Отмечу, что я не имел в виду какой-то конкретный язык программирования. Объект есть объект, его суть везде одинакова. Учите любой язык, и когда доберетесь до объектов, то просто прочитаете пару строчек, как они там делаются, и будете уже всё знать. А бывают языки без объектов? Да, но тогда вы сможете создать вручную структуры, которые работают так же, как объекты.
В этой части хотелось бы осветить тему методов. Если кратко, то методы – это функции. Самые обычные. Но в чём прикол?
Рассмотрим пример, когда банковский счет пользователя представлен как объект. У этого объекта, разумеется, будут какие-то свойства – ну типа номер счета, валюта, сумма на счету. Попробуем так:
Какие операции обычно делают с банковским счетом? Добавить денег или забрать денег. Чтобы добавить на счет 100 долларов, можем ли мы написать вот так?
account.sum += 100;
Конечно. Только в реальности так не делается. Перед тем как положить деньги на счет, нужно проверить несколько условий. А вдруг злой хакер подсунул не число, а строку, чтобы сломать систему? А если число отрицательное? А если оно слишком большое или слишком маленькое? А если нужно взять комиссию за эту операцию? А если счет заблокирован?
Ну и что же делать программисту? Везде, где делаются операции с деньгами, каждый раз проверять эти условия, переписывая их снова и снова? Не дождётесь!
Ленивый программист пишет для этого функцию. Мы уже обсуждали, что функция – это такое окошко, в которое можно передать свои данные и получить оттуда результат.
Ну и допустим он пишет так:
Мы передаём в функцию (суём в окошко) во-первых переменную account, хранящую нужный объект, во-вторых количество денег amount.
Теперь можно всегда вызывать эту функцию. Например, нужно добавить 5 долларов для объекта, который хранится в переменной account, пишем:
add_sum(account, 5);
Детали не важны, важно то, что у нас в программе теперь появилась функция.
Пока она одна, всё зашибись. Но в сложных программах существуют тысячи разных объектов и тысячи разных функций. Представьте, если все функции для всех объектов будут записаны одной простынёй в вашей программе, насколько длинной она станет и насколько неудобно будет в ней что-то искать и редактировать.
А самое главное, эта функция больше ни для чего не нужна, она умеет работать только со счётом, но мозолит вам глаза в коде программы. Возникает желание навести порядок. Как обычно наводят порядок?
Вещи, которые связаны друг с другом, хранят вместе. Например, чайный сервиз содержит достаточно непохожие друг на друга чайник, чашки и блюдца, но так как все они предназначены для одной цели, их хранят вместе, и это гораздо лучше, чем иметь разбросанные везде по отдельности чашки и блюдца.
Логичная идея – хранить функцию, которая связана с объектом, в самом объекте. Сделать функцию таким же свойством объекта, как и все остальные его свойства. И такая функция будет называться "метод". Метод объекта. Если свойства объекта просто присваиваются:
account.sum = 1000;
то методы объекта вызываются так же, как функции:
account.add_sum(5);
Как описать метод в объекте? Просто вставить в него описание функции. В разных языках есть отличия, опять же несущественные. Увидите – и так поймете. В целом, примерно так:
Как видим, у объекта появилось свойство add_sum, и этому свойству мы присвоили не число и не строку, а ссылку на безымянную функцию (потому что имя уже есть у свойства). Заметьте, что в функцию больше не нужно передавать параметр account, потому что она и так уже находится внутри объекта-счёта и через this знает, с чем работает.
Получается, что мы "спрятали" функцию внутрь объекта, и доступ к ней теперь осуществляется только через объект. Мы теперь храним и объект, и функцию вместе, и видим, для чего она, и не спутаем с другой, и не можем случайно вызвать другую функцию с этим объектом. Если функция это окошко, прорубленное в общей стене, то метод объекта это окошко, прорубленное в объекте.
Однако чем удобнее становится программисту, тем больше появляется побочных проблем. И для решения таких проблем приходится изобретать всё новые и новые уровни ООП.
Читайте дальше:
Подборка всех материалов по ООП: