0

假设如果两个家庭 Smiths 和 Johns 有两个相同品牌和制造的割草机,我如何在编程中为这种场景建模?

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

或者我应该只创建一个对象并在与现实世界场景完全不同的两个家庭之间共享它。

哪个是可以减少未来问题并提供可行性的最佳实践?

提前致谢....

4

2 回答 2

2

您应该将割草机作为单独的对象,而家庭对象应该拥有割草机。这是“具有”关系,您可以使用组合。因此,家庭对象可以拥有属性草坪移动器,他们的草坪移动器将被存储在其中。您可以通过这样的家庭对象访问家庭草坪搬运工:

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

家庭不应该扩展割草机,因为那是“是”的关系,割草机不是家庭!它属于家庭,因此家庭“拥有”割草机。

我认为您应该始终使用真实世界的示例。阅读:领域驱动设计

简而言之,DDD 是当您尝试使用 OOP 模拟现实世界时。

希望这可以帮助!

于 2013-04-09T10:17:46.180 回答
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
                )

        )

)

您还可以创建一个超类构造,其中割草机也是一个类,继承机器的所有基础知识。

于 2013-04-09T10:21:46.130 回答