2013-04-09 2 views
0

Допустим, если две семьи, Смитс и Джонс имеют два газонокосилки того же производства и производства, как я могу моделировать этот сценарий в программировании?Как смоделировать объект, принадлежащий двум различным объектам?

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

Или я должен просто создать только один объект и разделить его между двумя семьями, который полностью отличается от сценария реального мира.

Какая из лучших практик может уменьшить проблемы в будущем и обеспечить выполнимость?

Заранее спасибо ....

+1

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

+0

Lawnmover будет экземпляром «Физического элемента» или того, что вы хотите назвать (Machine?). Это проект будет иметь свойства; имя, производитель и серийный номер. Семьи будут сделаны из класса «Семья», а затем названы по-разному (name = «Smiths», name = «Johns»). План семьи не наследует машинный экземпляр Газонокосилки, что не имеет смысла. Вы можете предоставить семье свойство «инвентарь» Array, которое затем может содержать экземпляр экземпляра Machine the Lawnmower. – 2013-04-09 10:11:37

ответ

2

Вы должны иметь ваш газон движитель как отдельный объект, и семейный объект должен владеть газоном движителем. Это отношение «has-a», и вы можете использовать композицию. Таким образом, объект семейства может иметь свойство газонокосилки, где будет храниться их газонокосилка. И вы можете получить доступ к семейной лужайке движителя через семейный объект, как это:

$family = new Family(); 
$family->lawnMover->start(); 

семья не должен распространяться газон движителя, так что «есть-» отношения и газон движитель не семья! Он принадлежит семье, поэтому семья «имеет» - газонокосилку.

Я думаю, вы всегда должны идти с примерами реального мира. Дополнительная информация: Domain Driven Design

Короткий DDD - это когда вы пытаетесь имитировать реальный мир, используя ООП.

Надеюсь, это поможет!

1

Это очень простой и, возможно, не идеальный пример в соответствии с различными программистами, но здесь идет;

class Family { 
    public $name; 
    public $inventory = array(); 

    public function __construct($name = '') { 
     $this->name = $name; 
    } 

    public function add_inventory_item($object) { 
     if (is_object($object)) { 
      $this->inventory[] = $object; 

      return TRUE; 
     } 
     else { 
      return FALSE; 
     } 
    } 
} 

class Machine { 
    public $name; 
    public $manufacturer; 
    public $serial_number; 

    public function __construct($name = '', $manufacturer = '', $serial_number = '') { 
     $this->name = $name; 
     $this->manufacturer = $manufacturer; 
     $this->serial_number = $serial_number; 
    } 
} 

$fam_smiths = new Family('Smiths'); 
$fam_johns = new Family('Johns'); 

$lawnmower_a = new Machine('Lawnmower A', 'Some company A', '1234'); 
$lawnmower_b = new Machine('Lawnmower B', 'Some company B', '5678'); 

if ($fam_smiths->add_inventory_item($lawnmower_a)) { 
    echo 'Lawnmower A added to family Smiths\' their inventory.<br /><br />'; 
} 
else { 
    echo 'Lawnmower A doesn\t have the correct strucure.<br /><br />'; 
} 

if ($fam_johns->add_inventory_item($lawnmower_b)) { 
    echo 'Lawnmower B added to family Johns\' their inventory.<br /><br />'; 
} 
else { 
    echo 'Lawnmower B doesn\t have the correct strucure.<br /><br />'; 
} 

echo '<pre>'; 
print_r($fam_smiths); 
print_r($fam_johns); 
echo '</pre>'; 

Выход

Lawnmower A added to family Smiths' their inventory. 

Lawnmower B added to family Johns' their inventory. 

Family Object 
(
    [name] => Smiths 
    [inventory] => Array 
     (
      [0] => Machine Object 
       (
        [name] => Lawnmower A 
        [manufacturer] => Some company A 
        [serial_number] => 1234 
       ) 

     ) 

) 
Family Object 
(
    [name] => Johns 
    [inventory] => Array 
     (
      [0] => Machine Object 
       (
        [name] => Lawnmower B 
        [manufacturer] => Some company B 
        [serial_number] => 5678 
       ) 

     ) 

) 

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

Смежные вопросы