在为MVC应用程序设计api时,使用数组而不是参数列表是否更好?


Is it better to use arrays instead of parameter lists when designing an api for an MVC application?

在编写CRUD MVC应用程序时,您是否建议在为业务层(模型)编写api时使用数组而不是长(甚至短)参数列表?

例如,你会建议哪一个:

1

// Posts::getPosts(20, 0, $category, 'date_added');
static function getPosts($limit = NULL, $offset = NULL, Model_Category $category = NULL, $sort_by = NULL);
2

// Posts::getPosts(array('limit' => 20, 'offset' => 0, 'category' => $category, 'sort_by' => 'date_added'));
static function getPosts(array $options = NULL);`

1似乎更干净,更不容易出现bug,但2似乎更灵活(可以很容易地添加/切换参数,而不改变api)。我只是想找个理由去做。

谢谢

只有一个数组,试图调用你的方法的人不知道它期望的是哪个参数。
他的IDE也帮不上忙…

=>他得去看一下文档——这很费时间。


另一方面,对于第一个解决方案,只需查看方法的声明(当我键入方法名称时,我的IDE确实显示了这一点),我就知道它需要哪些参数。


我同意你的第二个解决方案(命名参数数组)更灵活。

但是,特别是当只有几个参数时,我倾向于选择第一个参数——这正是我写

的原因。

我遵循这个经验法则:

如果

  • 有超过5个参数
  • 参数没有逻辑顺序
  • 参数之间没有明确的逻辑依赖关系
    和/或
  • 大多数参数是可选的

那么可能使用数组模拟关键字参数是个好主意。否则,使用标准参数即可。

同时,考虑使用形参对象来执行复杂的方法调用。

EDIT:我该怎么做?

public static function search(
  $keywords,
  $limit = NULL,
  $offset = NULL,
  Model_Post_Type $type = NULL,
  Model_Category $category = NULL
)

对于参数数组(在支持它们的语言中也称为关键字参数,如Python),我个人倾向于这样做:

public static function search($keywords, $options = array()) {
  $default_options = array(
    'limit' => NULL,
    'offset' => NULL,
    'post_type' =>  NULL,
    'category' => NULL
  );
  extract(array_merge($default_options,$options));
  // search logic, using $keywords, $limit, $offset, $post_type, $category
}

这给你带来了一些好处:

  • $options中的任何内容都是完全可选的。任何必需的参数都应该是参数。
  • 让你完全控制这些选项的默认值,甚至允许在数组初始化器中使用复杂的表达式。
  • 允许您在以后添加新的(可选的)搜索选项,同时保持与现有代码的向后兼容。
  • extract()使键值对变为变量值对,因此方法的其余部分完全忽略了您使用参数数组而不是普通参数的事实。

这可能取决于你需要什么。您使用的参数是否具有逻辑顺序?一个不适用另一个吗?这并不是一个二选一的问题。

由于这种情况的性质,单独的参数可能是最好的方法。不过我想建议的一点是,它应该提供更多有用的默认值。