Групповые функции схожего функционала - PullRequest
0 голосов
/ 25 сентября 2010

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

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

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

Таким образом, в основном вопрос заключается в следующем: какова лучшая практика в подобных ситуациях?


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

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

Ответы [ 2 ]

1 голос
/ 25 сентября 2010

Используйте классы, Люк.

0 голосов
/ 25 сентября 2010

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

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

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

Конечно, если вы хотите перейти на ООП, вы просто обернули бы их всех в класс FileInfo и сохранили там (приватно загруженный?) Дескриптор личного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...