У меня есть два способа закодировать функцию 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);
}
}
Я думаю, это зависит
Если вы всегда хотите добавить логическое значение к вашей функции добавления, я бы пошел первым.
Но обычно я предлагаю второй вариант, потому что он реализует "общую" функцию добавления.
На основе вашего примера спросите себя, действительно ли необходимо создать новый метод 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);
В первых примерах цель, к которой добавляется объект, понятна. Во втором примере вы должны либо документировать метод, либо вы должны посмотреть на реализацию, чтобы узнать, что происходит.
Почему бы не воспользоваться перегрузкой?
// 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);
}
}
Таким образом, вы можете получить гибкость общей функции и точности, учитывая ситуацию, которую вы знаете приложением добавления.
Я бы выбрал вариант 2, потому что это более чистая и интуитивно понятная реализация.
Мы должны попытаться создать сигнатуру функции (имя + параметры) таким образом, чтобы она была понятной и четко указывала, что она делает. Один из принципов, которым мы должны следовать для достижения такой ясности, - это сделать функцию " ТОЛЬКО ОДИН ВЕЩЬ". То есть: если функция возвращает значение без какого-либо побочного эффекта, сделайте возвращаемое значение единым целым. Если есть какой-либо побочный эффект, сделайте его только одним побочным эффектом.
Основываясь на рассуждениях выше, вариант 2 является явным победителем. append(A, B)
имеет один побочный эффект и может быть повторно использован в гораздо более широком контексте. append(boolean)
требует, чтобы вызывающий пользователь решил только одно: добавочный заказ.
Я бы пошел с вариантом два, а затем просто удалил пользовательскую функцию добавления, которая служит только для переноса собственного метода 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);
}
}
Второй подход более общий и чистый. Приложение должно выполнять операцию добавления на данные входы. Проверки могут выполняться перед добавлением вызова.