Что из этого является лучшей практикой? - PullRequest
1 голос
/ 29 апреля 2010

У вас есть последовательность функций для выполнения. Случай А: они не зависят друг от друга. Что из этого лучше?

function main() {
  a();
  b();
  c();
}

или

function main() {
  a();
}

function a() {
  ...
  b();
}

function b() {
  ...
  c();
}

Случай B: они зависят от успешного завершения предыдущего.

function main() {
  if (a())
    if (b())
      c();
}

или

function main() {
  if (!a()) return false;
  if (!b()) return false;
  c();
}

или

function main() {
  a();
}

function a() {
  ... // maybe return false
  b();
}

function b() {
  ... // maybe return false
  c();
}

Лучше, конечно, значит более легко обслуживаемым и легче следовать.

Ответы [ 4 ]

14 голосов
/ 29 апреля 2010

Дело А: 1.
Обоснование: поскольку ни одна из функций не зависит друг от друга, вызов их по порядку в main показывает логическую последовательность событий. Ваша альтернатива, когда они вызывают следующую в конце каждой функции, просто выглядит как спагетти-код, и кому-то, читающему вашу программу, трудно следовать.

Случай B: ничего из вышеперечисленного.

function main() {
    return a() && b() && c();
}

Обоснование: Кажется, вам не важно возвращаемое значение, вы просто хотите выйти из него пораньше, если одна из функций возвращает определенное значение. Вы можете вернуть «аннедированный» результат всех этих функций, и если какая-либо из них вернет false, код выскочит рано. Таким образом, если a возвращает false, то b не будет выполняться. Размещение их всех в одну строку легко читается и кратко показывает, что они зависят друг от друга.

2 голосов
/ 29 апреля 2010

Случай A: первый вариант

Если вы используете второй вариант, вам будет намного сложнее повторно использовать a, потому что вы автоматически используете b и c.

Случай b: зависит - a, b и c возвращают логические значения естественным образом или какое-либо другое значение для проверки? У меня все равно не было бы вызовов b и b с вызовом c, потому что тогда вы вводите ненужную зависимость. Если возвращаемые значения имеют смысл, я склоняюсь к варианту 2 - меньше вложений - это хорошо.

1 голос
/ 29 апреля 2010

Во-первых, лучший ответ будет зависеть от нескольких аспектов в контексте, в котором находится код - нет ни одного правильного ответа, кроме «это зависит».

Однако, принимая за чистую монету, Дело А:

Вариант 1 показывает представление алгоритма на верхнем уровне.

Вариант 2 скрывает это, вызовы B & C скрыты. Это может быть довольно много работы, чтобы обнаружить C был вызван. Кроме того, сложнее тестировать A & B изолированно, если они затем вызывают другие методы. Main всегда можно проверить, если A, B и C могут быть подделаны.

Дело B: Распространено иметь аргументы по поводу наличия 1 точки выхода против нескольких точек выхода в методе. Иногда несколько точек выхода могут упростить код, что делает его более понятным, в других случаях неясно, какое влияние оказывает возврат или что происходит возврат, что делает его менее обслуживаемым.

Вариант 1 показывает алгоритм явно, но несколько вложенных if могут быстро выйти из-под контроля. В этом случае у меня определенно был бы вариант 2 или какой-нибудь умный логический вариант (да, Кори).

Вариант 3 выглядит для меня просто тупым.

0 голосов
/ 29 апреля 2010

Случай A: первый вариант

Случай B: второй вариант

...