我想知道在O.O.P中處理雙向關聯的最佳方法。我有在Google和SO上找到了多個解決方案,但它們中的每一個似乎都有缺點。語言是不相關的,但讓我們使用PHP來說明我的意思:在OOP中處理雙向關聯的最佳方法
比方說,我有一個簡單的國... [1..1] ..市協:
public class State {
public $cities;
public function add_city($city) {}
}
public class City {
public $state;
public function set_state($state) {}
}
執行#1:
public class State {
public $cities;
public function add_city($city) {
$this->cities[] = $city;
$city->state = $this;
}
}
public class City {
public $state;
public function set_state($state) {
$this->state = $state;
$state->cities[] = $state;
}
}
的兩個問題,實現有:
- 「$統計e「和」$ cities「必須公開(所以任何人都可以在不使用公共函數add_city的情況下添加城市)。大多數語言中沒有「朋友 」的概念。
- 公共函數可以有前加入
執行#2做一些操作:
public class State {
public $cities;
public function add_city($city) {
$this->cities[] = $city;
if ($city->state != $this) {
$city->set_state($this);
}
}
}
public class City {
public $state;
public function set_state($state) {
$this->state = $state;
if (!in_array($this, $state->cities)) {
$state->add_city($this);
}
}
}
一點點優於#1,但 「set_state」 功能必須調用「in_array 「其中必須使用的語言是O(n)(將快速O(1)操作轉換爲O(n)操作。)
實施#3:
public class State {
public $cities;
public function add_city($city, $call_the_other_function = true) {
$this->cities[] = $city;
if ($call_the_other_function) {
$city->set_state($this, false);
}
}
}
public class City {
public $state;
public function set_state($state, $call_the_other_function = true) {
$this->state = $state;
if ($call_the_other_function) {
$state->add_city($this, false);
}
}
}
執行#3是非常有效的,但是是一種「醜」(因爲缺乏一個更好的詞),因爲額外的可選參數的
無論如何,如果任何人有任何想法什麼是「正道「(tm)是,我想知道。
編輯: 如果可能的話我想一個解決方案:
- 不使用另一個類
- 不知道其中的對象創建的順序(即不是「構造」的解決方案)
「正確的方式(tm)」問題是無法用於Stackoverflow的,因爲它們傾向於生成基於意見的答案。請查閱http://stackoverflow.com/help/on-topic以查看您應該不應該詢問的內容。 –
原諒我,但我很困惑你的第一次實施。爲什麼這些變量需要公開? 「朋友」類可以在其他班上使用公共方法,難道不是嗎? – Jacob
除了@TimLewis所說的,或許你的問題會更適合[程序員StackExchange](http://programmers.stackexchange.com/):) – Jacob