如何建模由两个不同实体拥有的对象?

时间:2013-04-09 10:06:08

标签: php oop architecture software-design

假设两个家庭,史密斯和约翰斯有两个同样制造和制造的草坪搬运工,我怎样才能在编程中模拟这种情况?

我的意思是,因为两个草坪搬运工都有单独的序列号,我可以将它们映射到两个不同的物体,这对现实世界的情况是封闭的。

或者我应该只创建一个对象并在两个系列之间共享它,这与现实场景完全不同。

哪种方法可以减少未来的问题并提供可行性?

提前致谢....

2 个答案:

答案 0 :(得分:2)

你应该将你的草坪搬运工作为单独的物体,家庭用品应该拥有一个草坪搬运工。 这是“有一个”的关系,你可以使用组合。因此,家庭物品可以拥有物业草坪搬运工,他们的草坪搬运工将被存放在那里。您可以通过以下家庭对象访问家庭草坪搬运工:

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

家庭不应该扩展草坪搬运工,因为那是“是一种”关系,而草坪搬运工不是一个家庭!它属于家庭,所以家庭“有一个”草坪搬运工。

我认为你应该总是选择现实世界的例子。 阅读:Domain Driven Design

简而言之,DDD是指您尝试使用OOP模仿现实世界。

希望这有帮助!

答案 1 :(得分: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
                )

        )

)

你也可以制作超级建筑,其中割草机也是一个类,继承了机器的所有基础。