面向对象应用程序中的过程依赖关系


Procedural dependencies in an OOP application

尽管有很多类似的问题,但我还没有找到任何这样具体的答案(或至少是一个强烈固执己见的人)

我(此时)决定使用"helper"类,它只是类中静态方法的聚合,例如恰当地命名为String。类本身不可能成为对象实例,也没有理由成为对象实例。

现在我注意到很多人认为这是滥用。我也是这样做的,并且决定维护这种方法只是为了代码组织和(更重要的是)自动加载。
String::keysplode('|', 'apple|banana|coconut', array('a', 'b', 'c'));

这里是keysplode()。它使用给定的分隔符对给定字符串执行explode(),然后对每个元素调用trim()。结果数组与array参数一起传递给array_combine()。结果呢?

array('a' => 'apple', 'b' => 'banana', 'c' => 'coconut');

很棒!幻想!谁在乎呢?

关键是,这个函数真的不属于类。现在它住在'Package'Common'String::keysplode(),虽然这是一个很好的地方,但我可以看到它是如何被认为是"虐待"的。

我有很多这样的函数,它们属于array_*str_*伪名称空间,以及其他地方。进一步的问题是,我的"真正的"类,那些正确利用OOP的类(或者我相信)密切地使用这些函数。

这个"问题",就像它一样,是这样的函数应该去哪里?

当我们创建扩展语言"核心"功能的函数时,我们把这些函数放在哪里?此外,我们如何管理应用程序的其他部分在函数上创建的依赖关系?

将库函数放入静态类中一直是PHP的习惯用法,因为PHP缺乏名称空间,并且静态方法的语法类似于Perl中访问包函数的语法。

既然PHP有了名称空间,那么明确的答案是将这些方法放入名称空间(而不再是静态类)。虽然我认为这将是一个缓慢的过渡(因为很多人还没有使用PHP 5.3,而且很多人使用的是共享主机),但这种调整是显而易见的,希望框架和库开发人员接受这种新的习惯用法(这是具有c#和Perl等名称空间的其他语言的标准)。

<?php
namespace Foo;
function foo () {
    echo 'foo';
}
namespace Bar;
use Foo;
Foo'foo();

在我看来,开发人员正在使用一种精确的语言进行开发,无论是PHP还是其他语言。大多数情况下,用PHP编写的类将在PHP中使用,因此您实际上不需要关心核心函数。使用它们绝对是一种正确的方法,你只需要注意这些函数的变化。

如果你考虑使用其他库的服务,那就完全是另一回事了,但是在这种情况下,你不必担心语言的核心功能。