具有类似功能的组功能

时间:2010-09-25 12:24:43

标签: language-agnostic oop grouping

有时我遇到这个问题,你有一组明显属于同一组的功能。这些功能在几个地方都需要,而且经常在一起。

举一个具体的例子:考虑filemtimefileatimefilectime函数。它们都提供类似的功能。如果您正在构建类似文件管理器的东西,您可能需要一个接一个地调用它们以获取所需的信息。这是你想到包装器的那一刻。 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对我给出的具体示例有好处,但它是否扩展到更广泛的问题集?是否可以定义解决方案以使其适用于此域中的大多数其他问题?

2 个答案:

答案 0 :(得分:1)

使用类,Luke。

答案 1 :(得分:0)

我重写了fileXtime函数,接受文件名或文件句柄作为唯一参数。可以重载函数的语言(如C ++,C#等)可以使用此功能;在PHP中,您必须在运行时检查参数的类型。

传递文件名和文件句柄都是多余的,并且可能会进行模糊调用:

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

当然,如果你想要去OOP,你只需将它们全部包装在一个FileInfo类中,并在那里存储一个(延迟加载?)私有文件句柄。