代码之家  ›  专栏  ›  技术社区  ›  Dennis Haarbrink

类似功能的分组功能

  •  0
  • Dennis Haarbrink  · 技术社区  · 15 年前

    有时我会遇到这样一个问题:您有一组显然属于同一组的函数。这些功能在几个地方都是需要的,而且常常是在一起的。

    举一个具体的例子:考虑 filemtime , fileatime filectime 功能。它们都提供了类似的功能。如果您正在构建类似于文件管理器的东西,您可能需要一个接一个地给它们打电话以获取所需的信息。这是你开始考虑包装的时刻。PHP已经提供 stat 但是假设我们没有这个函数。

    我查看了php源代码以了解它们是如何解决这个特定问题的,但我无法真正了解到底发生了什么。

    显然,如果您有这样一个分组函数的幼稚实现,比如 filetimes ,希望:

    function filetimes($file) {
        return array(
            'filectime' => filectime($file)
            ,'fileatime' => fileatime($file)
            ,'filemtime' => filemtime($file)
        );
    }
    

    这是可行的,但会产生开销,因为您必须为每个函数调用打开一个文件指针。(我不知道是否有必要打开一个文件指针,但是为了这个例子,我们假设这一点)。

    另一种方法是复制 fileXtime 函数并让它们共享一个文件指针,但这显然会导致代码重复,这可能比第一个示例中引入的开销更糟糕。

    第三个,也许是最好的,我提出的解决方案是将可选的第二个参数添加到 文件时间 提供文件指针的函数。
    这个 文件时代 然后函数如下所示:

    function filetimes($file) {
        $fp = fopen($file, 'r');
        return array(
            'filectime' => filectime($file, $fp)
            ,'fileatime' => fileatime($file, $fp)
            ,'filemtime' => filemtime($file, $fp)
        );
    }
    

    不知怎么的,这仍然感觉“错误”。这个额外的参数只在一些非常特殊的条件下使用。

    所以基本上问题是:在这种情况下,什么是最佳实践?


    编辑 :
    我知道这是OOP发挥作用的典型情况。但首先:并不是每件事都需要上课。我总是使用面向对象的方法,但在全局空间中我也总是有一些功能。
    假设我们在这里讨论一个遗留系统(有这些“非OOP”部分),并且有很多依赖于 文件时间 功能。

    tdammer answer 对于我给出的具体示例来说是好的,但是它是否扩展到了更广泛的问题集?是否可以定义一个解决方案,使其适用于此域中的大多数其他问题?

    2 回复  |  直到 15 年前
        1
  •  0
  •   tdammers    15 年前

    我重写了filextime函数,接受文件名或文件句柄作为它们唯一的参数。能够超载功能的语言(如C++、C等)可以使用这个特性;在PHP中,您必须在运行时检查参数的类型。

    同时传递文件名和文件句柄是多余的,可能会进行不明确的调用:

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

    当然,如果你想去的话,你只要把它们包起来 FileInfo 类,并存储(延迟加载?)私人文件句柄。

        2
  •  1
  •   Lavir the Whiolet    15 年前

    去上课,卢克。

    推荐文章