2011-01-07 2 views
1

Я хотел бы узнать ваше мнение об использовании взаимозаменяемых операторов return и else в CFScript. Я обычно использую следующий синтаксис:Может возвращать, а также выражения могут быть взаимозаменяемы в CFScript?

if (something) { 
    // Do something 
} 
else { 
    // Do something else 
} 

Недавно мне пришло в голову, я мог бы сделать это вместо:

if (something) { 
    // Do something 
    return; 
} 
// Do something else 

бы дать эти два стиля другого конечного результата? Мне не нравится обертывать код в операторе else. Мое мышление заключается в том, что если оператор if оценивает значение true и возвращает его, код под ним не будет работать. Если он не оценивает значение true, то код ниже этого будет выполняться независимо от того, заключен ли он в оператор else или нет.

Звучит ли это правильно?

+1

Да, если вы используете «возврат», это правильно. Если это одна или две строки кода, я предпочитаю второй метод. Но более того, первый метод более читабельный/интуитивно понятный ИМО. – Leigh

+4

См. Http://stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement для исчерпывающего обсуждения этой идеи на всех языках программирования. Ваш пример # 2 называется «Заявление о защите» Фаулера. – orangepips

+0

@orangepips +1 для потрясающей нити – Leigh

ответ

4

Coldfusion, как и большинство языков предоставляет множество способов выполнения то же самое. Задача программиста - выбрать правильную для ситуации. Конечно, «правильный» может иметь много интерпретаций, но я бы сказал, что правильный путь ясен, краток и масштабируется.

В этом случае нет реальных характеристик или различий в «строках кода». Использование возврата для совершенно другой ветви кода не ясно для моих глаз, однако, использование стиля раннего возвращения для спасения функции из-за недействительных условий (опять же IMO) более понятно. Рассмотрим следующие случаи:

if (not isdefined("url.param1")) { 
    return; 
} 
if (not len(url.param1)) { 
    return; 
} 
if (not refind("[0-9]+", url.param1)) { 
    return; 
} 
doSomethingToValid(url.param1); 

против

if (isdefined("url.param1")) { 
    if (len(url.param1)) { 
    if (refind("[0-9]+", url.param1)) { 
     doSomethingToValid(url.param1); 
    } 
    } 
} 

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

+0

Ник, это именно та ситуация, в которой я оказался. Спасибо, это было очень полезно. – Mohamad

2

два способа записи он будет возвращать те же результаты, но для удобства чтения первый способ является предпочтительным

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