有時候我遇到了這個問題,你有一組明顯屬於同一組的功能。這些功能在幾個地方都需要,而且經常在一起。具有類似功能的組功能
舉一個具體的例子:考慮filemtime
,fileatime
和filectime
函數。它們都提供了類似的功能。如果你正在構建一個像文件管理器一樣的東西,你可能需要一個接一個地調用它們來獲取你需要的信息。這是你想到包裝的時刻。 PHP已經提供了stat
,但假設我們沒有這個功能。
我看了一下php源代碼,以瞭解他們如何解決這個特定的問題,但我無法真正瞭解發生了什麼。
顯然,如果你有一個天真的實現這樣的分組功能的,說filetimes
,想這樣:
function filetimes($file) {
return array(
'filectime' => filectime($file)
,'fileatime' => fileatime($file)
,'filemtime' => filemtime($file)
);
}
這會工作,但招致的開銷,因爲你將不得不打開每個文件指針函數調用。 (我不知道是否有必要打開一個文件指針,但讓我們假設爲了這個例子)。
另一種方法是複製fileXtime
函數的代碼並讓它們共享一個文件指針,但這顯然引入了代碼重複,這可能比第一個示例中引入的開銷更糟糕。
第三,和可能是最好的,解決方案,我想出了是一個可選的第二個參數添加到fileXtime
功能提供一個文件指針。然後
的filetimes
功能應該是這樣的:
function filetimes($file) {
$fp = fopen($file, 'r');
return array(
'filectime' => filectime($file, $fp)
,'fileatime' => fileatime($file, $fp)
,'filemtime' => filemtime($file, $fp)
);
}
不知怎的,這仍覺得「錯誤」。還有一些額外的參數僅用於某些特定的條件。
所以基本上問題是:在這些情況下最好的做法是什麼?
編輯:
我知道,這就是OOP發揮作用的典型情況。但首先,並非所有事情都需要成爲一個班級。我總是使用面向對象的方法,但我也總是在全局空間中有一些功能。
假設我們在這裏討論一個遺留系統(這些'非oop'部分),並且有很多依賴於fileXtime
函數。
tdammer的answer對我給出的具體示例有好處,但它是否擴展到更廣泛的問題集?是否可以定義解決方案,使其適用於該領域中的大多數其他問題?
檢查出這個問題(還有許多其他人標記了面向對象的'或'oop'),以獲得關於這裏已知的衆所周知的問題的豐富背景知識。 http://stackoverflow.com/questions/355796/how-do-you-explain-oo-to-new-programmers – 2010-09-25 15:40:39
我很瞭解一般的面向對象操作。但這不是關於面向對象的,請參閱最新的問題。 – 2010-09-28 07:48:52