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

ChAk

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

tz-lom

Продвинутый новичок
Ты просто делаешь множество классов которые являются представлениями дома с разных сторон - один для кабелей, один для трубы, один для ходить по дому.
Это паттерн Proxy.
 

ChAk

Новичок
Пример для наглядности
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(" слишком длинный провод для этого дома ");
			};
		}
	}
 

tz-lom

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

ChAk

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

AmdY

Пью пиво
Команда форума
ChAk
Ты как раз всеми силами рушишь свой чёрный ящик, твой дом сам может рассказать проводам всё что нужно
PHP:
$oHome = new Home();
$oHome->addWires(new Wires());
class Home {
    public function addWires(Wires $wires) {
        $wires->setLength($this->length); 
    }
}
 
Сверху