Лучше ли использовать массивы вместо списков параметров при разработке API для приложения MVC? - PullRequest
0 голосов
/ 26 июля 2011

При написании приложения 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 кажется намного чище и менее подвержен ошибкам, но 2 кажется ПУТИ более гибким (может легко добавлять / переключать параметры без изменения API). Просто ищу причины пойти в любую сторону.

Спасибо

Ответы [ 3 ]

4 голосов
/ 26 июля 2011

Имея только массив, парень, который попытается вызвать ваш метод, не знает, какие параметры он ожидает.
И его IDE тоже не сможет помочь ...

=> Он должен будет прочитать документацию - на это нужно время.


Нас другой стороны, с первым решением, просто глядя на объявление метода (и моя IDE отображает, что когда я набираю имя метода) , я знаю, какие параметры он ожидает.


Я согласен, что ваше второе решение (массив именованных параметров) гораздо более гибко.

Но, особенно когда параметров всего несколько, я склонен предпочестьПервый - по той причине, что я написал.

1 голос
/ 26 июля 2011

Я придерживаюсь этого правила:

Если

  • , то есть более 5 аргументов
  • логический порядок аргументов отсутствует
  • нет четкой логической зависимости между аргументами
    и / или
  • , большинство аргументов являются необязательными

Тогда это , вероятно, aхорошая идея использовать массив для имитации аргументов ключевых слов.В противном случае просто используйте стандартные аргументы.

Также рассмотрите возможность использования объекта параметра для выполнения сложных вызовов методов.

РЕДАКТИРОВАТЬ: Что бы яделать с этим?

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() превращает пары ключ-значение в пары переменная-значение, поэтому остальная часть метода полностью игнорирует тот факт, что вы используете параметрмассив и ненормальные аргументы.
1 голос
/ 26 июля 2011

Это, вероятно, зависит от того, что вам нужно. У параметров, которые вы используете, есть логический порядок? Один неприменим без другого? На самом деле это не один для другого.

Из-за природы этого случая отдельные аргументы, вероятно, являются наилучшим маршрутом. Однако я хотел бы предположить, что он обеспечивает более полезные значения по умолчанию.

...