Иногда я сталкиваюсь с этой проблемой, когда у вас есть набор функций, которые явно принадлежат к одной группе.Эти функции необходимы в нескольких местах и часто вместе.
Чтобы привести конкретный пример: рассмотрим 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 ' ответ подходит для конкретного примера, который я привел, но распространяется ли он на более широкий набор проблем?Можно ли определить решение таким образом, чтобы оно подходило для большинства других проблем в этой области?