Что из этого лучше практиковаться?
-
02-10-2019 - |
Вопрос
У вас есть последовательность функций для выполнения. Случай A: Они не зависят друг от друга. Что из этого лучше?
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();
}
Лучше, конечно, значит более ремонторуемым и легче следовать.
Решение
Случай A: 1.
Рассуждение: поскольку ни одна из функций зависит друг от друга, вызывая их в порядке в основном, показывает логическую последовательность событий. Ваша альтернатива, где они называют следующим в конце каждой функции, просто выглядит как код Spaghetti, и трудно, чтобы кто-то читал вашу программу для выполнения.
Случай B: Ничего из вышеперечисленного.
function main() {
return a() && b() && c();
}
Разумные рассуждения: Кажется, вы на самом деле не заботитесь о возвращенном значении, вы просто хотите рано вырваться, если одна из функций возвращает определенное значение. Вы можете вернуть «и» результат всех этих функций, и если какой-либо из этих возврат FALSE, код будет рано. Итак, если возврат FALSE, то B не будет выполнен. Размещение всех из них на одной строке легко прочитать и кратко показывает, что они зависят друг над другом.
Другие советы
Случай A: Первый вариант
Если вы используете второй вариант, вы делаете гораздо сложнее повторно использовать A, потому что вы тянете B и C автоматически.
Случай B: Зависит - сделать a, b и c Возвращать логические значения естественным путем или какое-то другое значение для проверки? У меня все еще не будет позвонить B и B позвонить C, потому что тогда вы ввели ненужную зависимость. Если возвратные значения имеют смысл, я опираюсь на вариант 2 - меньше вложенности - это хорошо.
Во-первых, лучший ответ будет зависеть от нескольких аспектов в контексте, в котором находится код - нет никого правильно ответ, кроме «это зависит».
Тем не менее, принимая ценность лица, случай A:
Вариант 1 показывает вид верхнего уровня алгоритма.
Вариант 2 скрывает это, вызовы B & C скрыты. Это может быть довольно много работы, чтобы обнаружить C было вызвано. Кроме того, сложнее тестировать A & B в изоляции, если они будут вызывать дальнейшие методы. Главный всегда можно проверить, если A, B и C можно издеваться.
Случай B: Общее количество аргументов в течение 1 точка выхода против нескольких точек выхода в способе. Иногда несколько точек выхода могут сделать код более проще, что делает его более ремонтом, в других случаях не очевидно, какое влияние возникло возвращение или что возвращение будет происходить, что делает его менее ремонтом.
Вариант 1 показывает алгоритм явно, но несколько вложенных, если бы можно быстро выйти из-под контроля. В таком случае, я бы определенно имел вариант 2 или некоторый умный логический вариант (да, кори).
Вариант 3 выглядит просто тупой для меня.
Случай A: Первый вариант
Случай B: Второй вариант