2010-09-25 2 views
0

Иногда я сталкиваюсь с этой проблемой, когда у вас есть набор функций, которые, очевидно, принадлежат к одной и той же группе. Эти функции необходимы в нескольких местах и ​​часто вместе.Групповые функции аналогичной функциональности

Чтобы привести конкретный пример: рассмотрите функции 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) 
    ); 
} 

Как-то это все еще чувствует себя «неправильно». Есть этот дополнительный параметр, который используется только в некоторых особых условиях.

Так что в основном вопрос: что такое лучшая практика в таких ситуациях?


Edit:
Я знаю, что это типичная ситуация, когда ООП вступает в игру. Но сначала: не все должно быть классом. Я всегда использую объектно-ориентированный подход, но у меня также всегда есть некоторые функции в глобальном пространстве.
Предположим, что мы говорим о старой системе здесь (с этими «не-oop» частями), и есть множество зависимостей от функций fileXtime.

tdammeranswer подходит для конкретного примера, который я дал, но распространяется ли на более широкий набор проблем? Можно ли определить решение таким образом, чтобы оно применимо к большинству других проблем в этой области?

+0

Этот вопрос (и многие другие отмечены объектно-ориентированным «или» oop ») для обильного фона по известной проблеме, которую вы здесь нажали. http://stackoverflow.com/questions/355796/how-do-you-explain-oo-to-new-programmers –

+0

Мне хорошо знакомы общие практики ООП. Но это не о ООП, см. Обновленный вопрос. –

ответ

0

Я бы переписал функции fileXtime, чтобы принять либо имя файла, либо дескриптор файла в качестве единственного параметра. Языки, которые могут перегружать функции (например, C++, C# и т. Д.), Могут использовать эту функцию; в PHP вам нужно будет проверить тип аргумента во время выполнения.

Передача как имя файла и дескриптор файла будет излишним, и неоднозначные вызовы могут быть сделаны:

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

Конечно, если вы хотите идти ООП, вы просто обернуть их всех в FileInfo класса, и сохраните там (lazy-loaded?) личный файл.

+0

Это действительно лучше позволить ему принять либо имя файла, либо указатель. Благодарю. –

+0

На стороне sidenote у PHP уже есть класс FileInfo с 'SplFileInfo' и' SplFileObject', которые также предоставляют доступ к файлам. – Gordon

1

Использование классов, Люк.

Смежные вопросы