Аргерих Л. О языке РНР. Часть 1. Страница 97


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

Инкапсуляция

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

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

Как уже отмечалось, важно, чтобы пользователям класса ничего не было из­вестно о членах-данных, которые в нем содержатся.

Хотя в РНР вполне допустимо в любой момент изменять члены созданного объекта, такие действия считаются плохой практикой программирования.

Вот пример, иллюстрирующий катастрофические события, которые могут случиться, если модифицировать члены объекта в обход его интерфейса. Предположим, что существует метод, устанавливающий скорость автомоби­ля, с именем который приводит к ошибке, если попытаться установить скорость выше 200 км/ч или меньше 0 км/ч. Допустим также, что конструктор не инициализирует двигатель и ключ, необходимый для за­пуска автомобиля:

$myKey = new^Sey.C'Kejii of my Porsche');

$car = new Car(); $car->engine = new Engine();

$car->speed = 400; $car->start($myKey);

$car->engine = 0; $car->stop();

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




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