我的服务方法签名应该如何?

时间:2011-05-15 20:53:24

标签: php zend-framework service-layer method-signature

我正在使用服务层,直到现在我使用的是ServiceObject(实现了ArrayAccess,Iterator,Countable),但我想知道这是不是一个好主意。

你会这样做:

ArticleService::createArticle($articleData, $userId);

ArticleService::createArticle(ServiceObject $data);

其中$data是:

array(
  'title' => 'Lorem ipsum',
  'body'  => 'Dolor sid amet',
  'userId' => 55,
);

ServiceObject的好处是为每个方法提供一个通用的签名,但有时它看起来不高效,并且它没有被广泛使用,它失去了它的兴趣。

有任何反馈吗?

6 个答案:

答案 0 :(得分:5)

将其更改为:

ArticleService::createArticle($title, $body, $user_id);

这清楚地说明了创建“文章”所需的内容。

像你的$articleData$data那样的'p''选项'数组不可能明智地理解,我会反对它。

将您的想法归结为通用ServiceObject,这实际上是一个非常糟糕的主意。你的动机是高尚的,但这是错误的解决方案。

如果你需要更有说服力,请随意戳。

答案 1 :(得分:2)

我认为这里最好的方法是拥有像

这样的东西
$article = new Article;
$article->title = "Lorem ipsum"
$article->body = "Dolor sit amet"
$article->creator = $userID
ArticleService::createArticle($article)

虽然可能“createArticle”不再是该功能的最佳名称,但是已经创建了Article对象。你可能会有类似ArticleService::publishArticle($article)的东西,虽然我不知道你在做什么。

您想要的是将数据的构造(Article)与其使用(ArticleService)分开。

我真正想说的是不要使createArticle的参数成为通用数组或“ServiceObject”,这两者都是参数列表的无用抽象,使它成为真正代表相关实体的类。 / p>

答案 2 :(得分:0)

我投票支持该对象,因为复杂系统中的代码完成是非常好的事情,也是一些自动验证,因为当您知道对象类型时,您可以以某种方式验证它。但是如果你在createSomething中没有复杂的逻辑,那么数组也可以适合。

答案 3 :(得分:0)

第二种方式更好,你永远不会遇到人们以错误的方式调用你方法的问题!它也更容易阅读和查看所需内容。对于我作为开发人员,很明显我必须传递类型为ServiceObject的对象,然后我开始搜索文档或此类的示例或接口。但在第一个例子中,我必须阅读createArticle的代码,以确定如何处理这两个参数。

第二种方法还可以帮助您保持API /签名的清洁。如果在createArticle中需要一些其他数据,您只需通过ServiceObject传递它们,而无需更改签名!

第一个例子的更好的签名是:

ArticleService::createArticle(array $articleData, $userId);

在这种情况下,$articleData必须是一个数组。这可以防止错误。在PHP函数参数中,只能使用数组和类名进行强制转换。

答案 4 :(得分:0)

没有正确的方式,但在这种特定情况下我会使用ArticleService::createArticle($articleData, $userId);

我认为该文章具有必需的非空属性userId(您从上下文中获取)和可选(不是非常重要)的内容数据,这些数据可能为空。

这样,文章和用户对象之间的连接是显而易见的。可读性略有提高。否则,您需要完全熟悉所需的数据和createArticle方法。

作为证据:当我看到ArticleService::createArticle($articleData, $userId)时,我立刻明白了方法正在做什么以及对输入数据的期望是什么,而第二个让我困惑。

此外,如果缺少userId,此时您将收到错误,而不是在您将其插入数据库时​​,您可能会收到更难跟踪的SQL错误。

另一方面,在ZF中,使用数组作为参数是很常见的,因此您的代码可能会以不同的样式显示。

然而,这主要取决于您的偏好。

答案 5 :(得分:0)

我认为更好的方法是注入一个对象。但为什么ServiceObject存在呢? 你有一个方法createArticle,那么将一个文章对象传递给它是合乎逻辑的,不是吗? 以这种方式组织验证过程更简单,您可以只标记要在注释中验证的字段。

这也是你正在使用的方法问题。如果在服务层中使用数据映射器模式,那么显然应该将对象传递给它。

使用对象,您可以在对象之间建立透明且清晰的通信界面。 使用数组时,不清楚您传输的数据类型,字段类型等等。