【问题标题】:How to model an object owned by two different entities?如何为两个不同实体拥有的对象建模?
【发布时间】:2013-04-09 18:21:46
【问题描述】:

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

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

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

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

提前谢谢....

【问题讨论】:

  • 您可以通过创建一个类来执行此操作,该类代表带有所有者字段的草坪搬运工。当您创建此类的实例时,您可以指定所有者,从而正确链接它。初始化后,该类的两个实例将链接到它们各自的所有者。
  • Lawnmover 将是“物理项目”的一个实例,或者任何你想叫它的东西(机器?)。它的蓝图将具有属性;名称、制造商和序列号。这些家庭将由类蓝图“家庭”组成,然后以不同的方式命名(名称=“史密斯”,名称=“约翰”)。家庭蓝图不继承机器实例割草机,这没有意义。您可以给 Family 一个“inventory”数组属性,然后它可以包含割草机的 Machine 实例。

标签: php oop architecture software-design


【解决方案1】:

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

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

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

我认为您应该始终使用真实世界的示例。 阅读:Domain Driven Design

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    这是非常基本的,根据不同的程序员可能不是完美的例子,但这里是;

    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
                    )
    
            )
    
    )
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2015-11-03
      相关资源
      最近更新 更多