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的访问。