假設兩個家庭Smiths和Johns有兩個同樣製造和生產的草坪搬運工,我怎麼能在編程中對這個場景進行建模?如何建模由兩個不同實體擁有的對象?
我的意思是,這兩個草坪搬運工將有單獨的序列號我可以將它們映射到兩個不同的對象,這是關閉的現實世界的情況。
或者我應該只創建一個對象,並將其與兩個完全不同於真實世界場景的家族共享。
哪種最佳做法可以減少未來的問題並提供可行性?
在此先感謝....
假設兩個家庭Smiths和Johns有兩個同樣製造和生產的草坪搬運工,我怎麼能在編程中對這個場景進行建模?如何建模由兩個不同實體擁有的對象?
我的意思是,這兩個草坪搬運工將有單獨的序列號我可以將它們映射到兩個不同的對象,這是關閉的現實世界的情況。
或者我應該只創建一個對象,並將其與兩個完全不同於真實世界場景的家族共享。
哪種最佳做法可以減少未來的問題並提供可行性?
在此先感謝....
你應該有你的割草機作爲單獨的對象和家庭對象應擁有自己的割草機。 這是「有-A」的關係,你可以使用組合。因此,家庭對象可以擁有物業的草坪搬家,他們的草坪搬家將被存放在那裏。你可以通過家庭訪問對象家庭割草機這樣的:
$family = new Family();
$family->lawnMover->start();
家庭不應擴大割草機,因爲這是「是」的關係,割草機是不是一個家庭!它屬於家庭,所以家庭「有一個」草坪先生。
我認爲你應該總是與現實世界的例子。 閱讀:Domain Driven Design
簡而言之,DDD是當你試圖模仿使用OOP的現實世界。
希望這會有所幫助!
這是非常基本的,根據不同的程序員可能不是一個完美的例子,但在這裏;
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
)
)
)
你也可以做一個超一流的施工,其中割草機將是一個類也繼承了機器的所有基礎知識。
您可以通過創建一個類來代替具有所有者字段的草坪搬運工。當您創建此類的實例時,您可以指定所有者並正確鏈接它。初始化時,將有兩個與其各自所有者鏈接的類的實例。 – Kami 2013-04-09 10:11:04
Lawnmover將成爲「物理項目」的一個實例,或者任何你想稱之爲(機器?)的實例。它的藍圖將具有屬性;名稱,製造商和序列號。這些家庭將根據班級藍圖「家庭」製作,然後以不同的名稱命名(名稱=「Smiths」,名稱=「Johns」)。家庭藍圖不會繼承機器實例割草機,這是沒有道理的。您可以爲系列賦予一個「庫存」數組屬性,該屬性可以包含割草機的機器實例的一個實例。 – 2013-04-09 10:11:37