Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 对功能相似的函数进行分组_Language Agnostic_Oop_Grouping - Fatal编程技术网

Language agnostic 对功能相似的函数进行分组

Language agnostic 对功能相似的函数进行分组,language-agnostic,oop,grouping,Language Agnostic,Oop,Grouping,有时我会遇到这样的问题,你有一组显然属于同一组的函数。这些功能在多个地方都需要,而且常常是一起需要的 给出一个具体的例子:考虑函数和函数。它们都提供了类似的功能。如果您正在构建类似文件管理器的东西,您可能需要一个接一个地给他们打电话以获取所需的信息。这是你开始考虑包装的时刻。PHP已经提供了,但是假设我们没有这个函数 我查看了php源代码以了解他们是如何解决这个特定问题的,但我无法真正了解到底发生了什么 显然,如果您有这样一个分组函数的简单实现,比如filetimes,您会希望: functio

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

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

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

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

function filetimes($file) {
    return array(
        'filectime' => filectime($file)
        ,'fileatime' => fileatime($file)
        ,'filemtime' => filemtime($file)
    );
}
function filetimes($file) {
    $fp = fopen($file, 'r');
    return array(
        'filectime' => filectime($file, $fp)
        ,'fileatime' => fileatime($file, $fp)
        ,'filemtime' => filemtime($file, $fp)
    );
}
这会起作用,但会产生开销,因为您必须为每个函数调用打开一个文件指针。(我不知道是否有必要打开一个文件指针,但是为了这个例子,让我们假设一下)

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

我提出的第三个,也可能是最好的解决方案是在
fileXtime
函数中添加一个可选的第二个参数,以提供文件指针。
filetimes
函数将如下所示:

function filetimes($file) {
    return array(
        'filectime' => filectime($file)
        ,'fileatime' => fileatime($file)
        ,'filemtime' => filemtime($file)
    );
}
function filetimes($file) {
    $fp = fopen($file, 'r');
    return array(
        'filectime' => filectime($file, $fp)
        ,'fileatime' => fileatime($file, $fp)
        ,'filemtime' => filemtime($file, $fp)
    );
}
不知何故,这仍然感觉“不对”。有一个额外的参数,只在一些非常特殊的条件下使用

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


编辑
我知道这是OOP发挥作用的典型情况。但首先,并不是所有的东西都需要成为一门课。我总是使用面向对象的方法,但我也总是在全局空间中使用一些函数。
假设我们在这里讨论的是一个遗留系统(带有这些“非oop”部分),并且对
fileXtime
函数有很多依赖关系


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

使用类,Luke。

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

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

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

当然,如果你想使用OOP,你只需将它们都包装在一个
FileInfo
类中,并在那里存储一个(惰性加载的?)私有文件句柄。

查看这个问题(以及许多其他标记为面向对象的”或“OOP”)以了解你在这里遇到的著名问题的丰富背景。我非常了解OOP的一般实践。但这与OOP无关,请参阅更新的问题。让它接受文件名或指针确实更好。谢谢。另一方面,PHP已经有了一个FileInfo类,其中包含
SplFileInfo
SplFileObject
,它们也提供了对filetimes的访问。