2009-09-02 2 views
0

Я использую CodeIgniter, и у меня есть модель, которая извлекает, скажем, все рецепты, где вы можете установить смещение и предел. Должен ли я распространять эту функцию для получения одного рецепта? Это хорошая практика?Должен ли я выполнять многоцелевые функции?

ответ

2

Ваша цель должна заключаться в том, чтобы свести к минимуму дублирование кода и максимизировать понятность. Эти два часто расходятся. Вы можете в конечном итоге с минимальным дублированием кода, но иметь 12 необязательных параметров для функции. Итак, некоторые общие советы:

  • Рассмотрите возможность упаковки общей функциональности в третью функцию, а затем две функции могут оба вызвать это по мере необходимости;
  • Использование объекта или массива аргументов, если функция имеет более 3-4 параметров;
  • Уничтожение кода должно быть сведено к минимуму, а не полностью устранено. Иногда самое четкое решение предполагает некоторое дублирование кода;
  • Назначение функции или объекта должно быть четким. Если все, что он делает, полностью изменяется в зависимости от параметра, то вы, вероятно, будете путать людей.

С вашего конкретного случая, я полагаю, вы хотите, чтобы в конечном итоге что-то вроде:

function get_recipes($offset, $limit) { 
    // execute query and get resource 
    $ret = array(); 
    while ($row = mysql_fetch_assoc($rs)) { 
    $ret[] = build_recipe($row); 
    } 
    return $ret; 
} 

function get_recipe($id) { 
    // execute query and get row object 
    return build_recipe($row); 
} 

function build_recipe($row) { 
    // construct a recipe object from the row 
} 
+0

На самом деле я объединил get_recipe и get_recipes. если идентификатор установлен, а остальные параметры равны нулю, он возвращает только одно поле и т. д., нормально? – alimango

+0

Я думаю, что это потенциально немного запутанно, но трудно сказать без особых деталей. Как правило, я предпочитаю схему, подобную той, которую я сделал, которая имеет четко названные функции (хотя эти три могут быть названы лучше), которые используют функциональную декомпозицию для уменьшения дублирования. – cletus

+1

Я согласен с cletus в разделении 'get_recipe' с' get_recipes'. Это будет проще для того, кто будет поддерживать ваш код, чтобы понять ваш код. – Randell

1

В общем, для ясности, функция должна выполнять одну задачу. Однако «получение N строк» ​​- единственная задача - даже когда N == 1; поэтому я бы сказал, что этот случай квалифицируется, т. е. функция НЕ действительно «многоцелевая»!)

Смежные вопросы