2016-05-02 3 views
0

Ниже приведен фрагмент кода, есть то, что мне не нравится:код запах - прохождение логический контроль аргумент функционирования

function insert(el, child, before){ 
    if (before) { 
    el.insertBefore(child, el.childNodes[0]); 
    } else { 
    el.appendChild(child); 
    } 
} 

Почему не вместо двух отдельных методов, как insertBefore и insertAfter? каковы плюсы и минусы этого и другого подхода?

Update:

Я получил это хороший article объяснить то, что я хотел.

+0

Какова цель этого вопроса? У вас есть код, который вам не нравится? Измени это! – Amit

+0

@Пожалуйста, цель этого вопроса заключается в написании лучшего кода. Определение лучшего понимания и проверки. Я думаю, что вопрос вместе с тегами четко разъясняет намерение. – CodeYogi

+0

Какова цель этой функции? почему бы вам просто не использовать appendChild, например? Является ли эта часть некоторой библиотеки? – Thomas

ответ

2

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

if (something) { 
    foo.insertBefore(bar, foo.childNodes[0])); 
} else { 
    foo.appendChild(bar); 
} 

Вы можете упростить все из них:

insert(foo, bar, something); 

С вашими двумя способами, это стало бы:

if (something) { 
    insertBefore(foo, bar); 
} else { 
    insertAfter(foo, bar); 
} 

который не намного лучше оригинала.

+0

Но он требует, чтобы клиентский код помнил, чтобы передавать этот флаг каждый раз, когда он вызывает этот метод, более того, я бы знал, нужно ли мне вставлять до или после в моем клиентском коде, не нужно иметь условия, разбросанные по всему моему коду. – CodeYogi

+0

Вы использовали бы этот метод только тогда, когда выбор необходимо определить динамически. Это похоже на то, что jQuery имеет как 'hide',' show', так и 'toggle'. Вы используете 'toggle', когда он динамический, и' hide/show', когда он известен априори. – Barmar

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