Я плохо знаком с OOP/PHP. Какова практичность видимости и расширяемости в классах?

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

15
задан Marc Ripley 26 May 2010 в 14:03
поделиться

8 ответов

Все сводится к инкапсуляции. Это означает, что нужно прятать класс изнутри и просто заботиться о том, что он делает. Если вы хотите иметь класс обработки кредитных карт, вам все равно, «как» он обрабатывает кредитную карту. Вы просто хотите иметь возможность пойти: $ creditCardProcessor-> charge (10.99, $ creditCardNumber); и ожидать, что это сработает.

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

Для любого класса у вас есть реализация . Так класс выполняет свой долг. Если это класс по приготовлению смузи, то то, как класс добавляет ингредиенты, какие ингредиенты он добавляет, и т. Д. - все это часть реализации. Внешний код не должен знать и / или заботиться о реализации.

Другой стороной класса является его интерфейс . Интерфейс - это общедоступные методы, которые разработчик класса намеревался вызывать внешним кодом.Это означает, что вы должны иметь возможность вызывать любой общедоступный метод, и он будет работать правильно.

7
ответ дан 1 December 2019 в 01:30
поделиться

Ваши последние два пункта довольно точны - вам не нужно, чтобы несколько разработчиков перепутали ваши вещи. Если вы будете работать над проектом достаточно долго, вы поймете, что забыли многое из того, что делали вначале.

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

В общем, чем больше вы публикуете, тем больше вам нужно беспокоиться о совместимости с другим кодом.

8
ответ дан 1 December 2019 в 01:30
поделиться

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

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

1
ответ дан 1 December 2019 в 01:30
поделиться

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

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

Допустим, у вас есть класс Queue - каждый раз, когда вызывающий абонент добавляет элемент в очередь, может потребоваться увеличить емкость очереди.Из-за базовой реализации установка емкости не является тривиальной, поэтому вы разбиваете ее на отдельную функцию, чтобы улучшить читаемость вашей функции Enqueue . Поскольку вызывающие абоненты не заботятся о емкости очереди (вы обрабатываете ее за них), вы можете сделать метод закрытым: вызывающие абоненты не отвлекаются на лишние методы, вам не нужно беспокоиться о том, что вызывающие абоненты будут делать нелепые вещи. в зависимости от емкости, и вы можете изменить реализацию в любое время, не нарушая код, который использует ваш класс (при условии, что он по-прежнему устанавливает емкость в рамках ограниченных вариантов использования, определенных вашим классом).

8
ответ дан 1 December 2019 в 01:30
поделиться

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

Сокрытие данных делает программу проще для концептуального восприятия и легче для реализации.

5
ответ дан 1 December 2019 в 01:30
поделиться

Все дело в инкапсуляции. Методы - это частные методы, которые выполняют внутреннюю тяжелую работу, в то же время открывая изящные функции, которые облегчают работу. Например, у вас может быть функция $product->insert(), которая использует 4 внутренние функции для проверки объекта базы данных singleton, обеспечения безопасности запроса и т.д. - это внутренние функции, которые не нужно раскрывать и которые, если их вызвать, могут испортить другие структуры или потоки, которые вы, разработчик, поставили на место.

4
ответ дан 1 December 2019 в 01:30
поделиться

ситуация с несколькими разработчиками (не надо не испортить работу других людей), или просто чтобы не испортить свою собственную работу случайно?

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

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

2
ответ дан 1 December 2019 в 01:30
поделиться

Например - метод private/protected может быть частью некоторого класса, который вызывается в другом (публичном) методе. Если эта часть вызывается более публичными методами, это имеет смысл. И все же вы не хотите, чтобы эти методы вызывались где-либо еще.

То же самое и со свойствами класса. Да, вы можете писать общедоступные классы, но что в этом интересного?

0
ответ дан 1 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: