Скрытие внутренней структуры класса

  • Автор темы Автор темы ChAk
  • Дата начала Дата начала

ChAk

Новичок
Представь объект дом. Есть у него как бы внутренние объекты которые не наследуют его. например провода, они ведь ни чего общего с домом не имеют. Но проводам нужна какая то информацию о доме, например где у него проложены кабель каналы. Что бы дать такую информацию проводам приходиться делать методы дающие эту информацию публичными. Проблема в том что объект человек который будет использовать объект дом видеть объект с кучей доступных ему публичных методов которые для него не предназначены, например та же инфра про кабель каналы. Это само собой плохо так как изначально планировалось, что у объекта дом будет гораздо меньше публичных методов и он будет, что-то вроде черного ящика, а не получается так как внутренним объектам нужна инфра и им не откуда ее получит кроме как через публичные методы дома. Что я делаю не так?
Внутренними объектами здесь я называю экземпляры классов хранящихся внутри базового класса, но ни как не связанные с ним через наследования. В моем примере это провода, которые являются частью дома, но с другой стороны, ни имеет, ни какого отношения к дому.
 
Ты просто делаешь множество классов которые являются представлениями дома с разных сторон - один для кабелей, один для трубы, один для ходить по дому.
Это паттерн Proxy.
 
Пример для наглядности
PHP:
	class Home
	{
		private $wires;
		
		function __construct()
		{
			$this->wires[] = new Wire($this, 5);
			$this->wires[] = new Wire($this, 10);
		}
		
		public function check_length($length)
		{
			return ( ($length <= 7 ) ? TRUE : FALSE );
		}
	}
	
	class Wire
	{
		function __construct($home, $length)
		{
			if ($home->check_length($length) === FALSE)
			{
				echo(" слишком длинный провод для этого дома ");
			};
		}
	}
 
и да, если не отходить от аналогии - дом бы знал только о кабель каналах, т.е. не мешает и более детальная декомпозиция класса
 
Да Proxy решение рабочее, но не совсем то что я ожидал. Ну если другого выхода нет буду испльзовать его
 
ChAk
Ты как раз всеми силами рушишь свой чёрный ящик, твой дом сам может рассказать проводам всё что нужно
PHP:
$oHome = new Home();
$oHome->addWires(new Wires());
class Home {
    public function addWires(Wires $wires) {
        $wires->setLength($this->length); 
    }
}
 
Сверху