2010-09-25 136 views
0

有時候我遇到了這個問題,你有一組明顯屬於同一組的功能。這些功能在幾個地方都需要,而且經常在一起。具有類似功能的組功能

舉一個具體的例子:考慮filemtime,fileatimefilectime函數。它們都提供了類似的功能。如果你正在構建一個像文件管理器一樣的東西,你可能需要一個接一個地調用它們來獲取你需要的信息。這是你想到包裝的時刻。 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函數。

tdammeranswer對我給出的具體示例有好處,但它是否擴展到更廣泛的問題集?是否可以定義解決方案,使其適用於該領域中的大多數其他問題?

+0

檢查出這個問題(還有許多其他人標記了面向對象的'或'oop'),以獲得關於這裏已知的衆所周知的問題的豐富背景知識。 http://stackoverflow.com/questions/355796/how-do-you-explain-oo-to-new-programmers – 2010-09-25 15:40:39

+0

我很瞭解一般的面向對象操作。但這不是關於面向對象的,請參閱最新的問題。 – 2010-09-28 07:48:52

回答

0

我會重寫fileXtime函數來接受文件名或文件句柄作爲他們唯一的參數。可以重載函數的語言(如C++,C#等)可以使用此功能;在PHP中,您必須在運行時檢查參數的類型。

同時傳遞文件名和文件句柄是多餘的,曖昧電話可以作出:

$fp = fopen('foo', 'r'); 
$times = file_times('bar', $fp); 

當然,如果你想要去的OOP,你只是包裝他們都在一個FileInfo類,並在那裏存儲(延遲加載?)私有文件句柄。

+0

讓它接受文件名或指針確實更好。謝謝。 – 2010-09-28 07:46:52

+0

在旁註中,PHP已經有一個帶有'SplFileInfo'和'SplFileObject'的FileInfo類,它們也可以訪問文件時間。 – Gordon 2010-10-05 12:00:14

1

使用類,盧克。

相關問題