Если с использованием публичного типа полей мне все ясно - это то, что объект может предоставить для свободного доступа и модификации, чаще всего это реализуется через геттеры-сеттеры - то разницу между приватными и защищенными я не очень понимаю, точнее, не понимаю, как отделить границы использования одного от другого. Если очень грубо, то класс должен "светить" только необходимые вещи, чтобы не засорять текущую область видимости лишними деталями. И тут я и начинаю плавать: вот, допустим, у меня есть класс, реализующий действия с базой данных:
class SimplePdoWrapper
{
/** @type PDO */
protected $pdo;
}
$pdo - это ресурс, через который посылаются запросы к базе данных. Я должен объявлять его как protected или как private? Как понять, нужно ли предоставлять прямой доступ к этому полю отнаследованному классу? Я отлично понимаю фразу "closed for modification, opened for extension", но как только подожу на практике, у меня начинается ступор: если я скрою эти поля, будет ли это означать ограничение расширяемости?
Ответ
Упрощённо говоря, придерживайтесь следующего правила: объявляйте приватным всё, что можно Вы не должны оставлять поле или метод доступными наследнику «на всякий случай», вы должны понимать, почему без него наследникам не обойтись. Конечно, «open for extension» — это правильно, но в принципе расширение функциональности должно быть возможно не заглядывая в «грязное бельё» текущей имплементации. Если вы строите иерархию классов, вам придётся для начала её спланировать. Вы должны прикинуть, какие непубличные свойства/методы являются важными для расширения (их должно быть по идее совсем немного), а какие не нужны, порождённый класс вполне может обойтись официальными, публичными методами. Прокрутите в голове несколько вариантов расширения. Возможно, с первого раза получится неоптимально, и придётся пересматривать структуру. С практикой придёт опыт.
Комментариев нет:
Отправить комментарий