Должна ли логическая логика быть сделана как можно раньше?

1

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

Опция 1

append(foo1, foo2, boolean) {
   if (boolean) {
      foo1.append(foo2);
   } else {
      foo2.append(foo1);
   } 
}

function (boolean){
   append(foo1, foo2, boolean);
}

или - вариант 2

append(foo1, foo2) {
   foo1.append(foo2);
}

function (boolean){
   if (boolean) {
       append(foo1, foo2);
   }  else {
       append(foo2, foo1);
   } 
}
  • 0
    Вы действительно придираетесь к этому моменту. Возможно, вы сэкономите некоторую память, не передавая третий параметр в функцию, но обработка будет по существу такой же. На самом деле не стоит тратить время, пытаясь решить, что «лучше».
  • 0
    Я бы сказал, что проще, тем лучше. Порядок параметров подразумевается при добавлении, поэтому переключение добавляет источник путаницы.
Теги:
boolean-logic

6 ответов

2

Я думаю, это зависит

Если вы всегда хотите добавить логическое значение к вашей функции добавления, я бы пошел первым.

Но обычно я предлагаю второй вариант, потому что он реализует "общую" функцию добавления.

  • 0
    Я бы не реализовал функцию, которая служит только для переноса нативного (String) метода; Я не вижу добавленной стоимости там. Но с точки зрения двух вариантов, описанных выше, в большинстве случаев они выглядят эквивалентно - не уверены, что он пытается оптимизировать - производительность, ясность / ремонтопригодность, возможность повторного использования и т. Д.
0

На основе вашего примера спросите себя, действительно ли необходимо создать новый метод append() который принимает два экземпляра Foo. Для меня API проще, вызвав метод append() связанный с классом Foo. Сравните использование ниже:

Пример 1

foo1.append(foo2); 

// alternatively
foo2.append(foo1);

Пример 2.

append(foo1, foo2); 

// alternatively
append(true); 

// or 
append(foo1, foo2, true);

В первых примерах цель, к которой добавляется объект, понятна. Во втором примере вы должны либо документировать метод, либо вы должны посмотреть на реализацию, чтобы узнать, что происходит.

0

Почему бы не воспользоваться перегрузкой?

// Used when ordering is unknown or generic append foo2 to foo1 
append(foo1, foo2) {
   foo1.append(foo2);
}


// Used when order is known
append(foo1, foo2, boolean) {
   if (boolean) {
      foo1.append(foo2);
   } else {
      foo2.append(foo1);
   } 
}

Таким образом, вы можете получить гибкость общей функции и точности, учитывая ситуацию, которую вы знаете приложением добавления.

0

Я бы выбрал вариант 2, потому что это более чистая и интуитивно понятная реализация.

Мы должны попытаться создать сигнатуру функции (имя + параметры) таким образом, чтобы она была понятной и четко указывала, что она делает. Один из принципов, которым мы должны следовать для достижения такой ясности, - это сделать функцию " ТОЛЬКО ОДИН ВЕЩЬ". То есть: если функция возвращает значение без какого-либо побочного эффекта, сделайте возвращаемое значение единым целым. Если есть какой-либо побочный эффект, сделайте его только одним побочным эффектом.

Основываясь на рассуждениях выше, вариант 2 является явным победителем. append(A, B) имеет один побочный эффект и может быть повторно использован в гораздо более широком контексте. append(boolean) требует, чтобы вызывающий пользователь решил только одно: добавочный заказ.

0

Я бы пошел с вариантом два, а затем просто удалил пользовательскую функцию добавления, которая служит только для переноса собственного метода String.append, т.е. Для этого нет оснований. Таким образом, вам нужна только одна функция/метод:

// no need to write an append function which does what String.append already does...
function (boolean) 
{
  if (boolean) {
    foo1.append(foo2);
  } else {
    foo2.append(foo1);
  } 
}
0

Второй подход более общий и чистый. Приложение должно выполнять операцию добавления на данные входы. Проверки могут выполняться перед добавлением вызова.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню