2010-06-02 7 views
9

Если переменная может принимать n значений, мы должны проверить правильность значений или предположить, что если все проверки n-i завершились неудачно, это будет n-е значение.Что является более подходящим способом программирования

Например, если у нас есть переменная, которая хранит гендер как М или F. Использование этого:

If gender = "M" 
    do male_processing 
else 
    do female_processing 
endif 

Или это:

If gender = "M" 
    do male_processing 
else 
    if gender = "F" 
    do female_processing 
    else 
    print "Something has gone wrong Gender has a value " Gender 
    endif 

endif 
+2

При размещении здесь введите свой код правильно и затем отформатируйте его с помощью кнопки 1010 над областью ввода текста. – 2010-06-02 08:13:57

+0

Извините, я понял, что после того, как я попал в submit. Большое спасибо! – Raju

+1

Между тем, в реальном мире пол не является логическим значением. Там много людей с гендерной проблематикой. – TRiG

ответ

1

Для этого типа конструкции я хотел бы использовать оператор switch. Не потому, что он короче (это не так), но это более удобным для чтения (ИМХО):

switch(gender) { 
    case "M": 
    doMaleSpecificStuff(); 
    break; 
    case "F": 
    doFemaleSpecificStuff(); 
    break; 
    default: 
    throw AnyError; 
} 
4

Вскоре - что зависит от того, какой тип переменная. Если это логическое или какое-то перечисление, и нет другого значения, которое может быть возможно (включая null), достаточно простого предложения else.

Вы даже можете добавить простой комментарий как так:

if male: 
    do_male_stuff() 
else: #obviously female 
    do_female_stuff() 

Имея что-то вроде этого просто кажется неправильным:

bool = SOME_BOOLEAN_VALUE 
if bool: 
    do1() 
elif not bool: 
    do2() 
else: 
    huh() #?!?! 

Итог: есть пункт if/else/else if для каждого возможный сценарий, но не более, и сохраните его для чтения.

0

Если возможно третье значение, отличное от M или F, вы должны использовать вторую форму. Если тестируемая переменная имеет тип, который может принимать только значения M и F, вы должны использовать первый.

+0

Не обязательно. Если возможно какое-либо (любое) значение, отличное от M или F, то может быть, что они хотят, чтобы «do_female_stuff()» являлось действием по умолчанию - в этом случае вам, вероятно, по-прежнему нужны только два варианта («M» или * другое *). Тем не менее, вы определенно захотите прокомментировать, что это намеренный дефолт. – hemp

+0

Я очень рад, что вы не указали иллюстрации этого. –

+0

@hemp Очевидно, что из второго примера OP, который должен быть сопоставим с первым, что это не так. – 2010-06-02 08:24:58

2

... или, в мире OO, вы можете создать базовый класс, скажем Gender и расширить его с помощью классов Male и Female. Вместо назначения переменной «M» или «F» переменной вы можете назначить экземпляр класса Male или Female. Затем просто вызовите метод, указанный в базовом классе, например doGenderSpecificStuff(). Нет необходимости в if-elses.

+1

ОП задает вопрос о предложениях if-else. Конечно, это можно сделать способом OO, но это не вопрос. –

+0

Тогда в чем смысл иметь if-else ?? – VoodooChild

+1

@Yuval: Если ОП найдет этот ответ неуместным, я его удалю. Но, пожалуйста, позвольте OP решить. – fish

10

Для этого примера, я бы не использовать, если вообще, я бы либо использовать ПЕРЕКЛЮЧАТЕЛЬ для второго примера

switch (gender) 
    case "M": 
     do male_processing 
     break 
    case "F": 
     do female_processing 
     break 
    default: 
     print "Something has gone wrong Gender has a value " Gender 
endswitch 

или для первого примера, я бы просто рассматривать исключения как ошибку, используя ASSERT

assert (gender = "M" or gender = "F") 
+0

Не все языки могут «переключаться» на все типы переменных ... Однако большинство языков имеют конструкции if-else. –

+3

+1 - не для коммутатора, а только для обработки третьего случая. Вы - ** ДОЛЖНЫ ** относиться к третьему делу - неважно, являются ли это 'ELSE',' DEFAULT', 'ASSERT' или, тем не менее, вы это делаете. Проверьте это. Ваш сторонник/будущий человек будет благодарен вам. – Konerak

1

Если значения Жандр может быть только «M» или «F», то вы можете использовать Assert для сделать это ясно:

Assert(gender = "M" OR gender = "F") 
If gender = "M" 
    do male_processing 
else 
    do female_processing 
endif 
0

При перечислении способов обработки различных возможных форм типа данных, вы должны использовать шаблон соответствия, если ваш язык поддерживает его, или, если он не переключите заявления (сопоставление с образцом бедняка). Основная причина этого заключается в том, что если тип данных будет расширен с более потенциальными формами, во время компиляции вы должны быть предупреждены о неполном сопоставлении шаблонов (или инструкции switch). Таким образом, вы можете спокойно отдыхать, зная, что, если типы данных будут расширены, вы узнаете об этом раньше, чем позже.

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

0

Если есть пользовательский ввод для «F» или «M», вам следует угрожать 3 сценариям, т.е. F, M и другие. Если пользовательский ввод отсутствует, вы можете использовать два и иметь значение bool, т.е. isMale для if, поэтому было бы гораздо читабельнее.

1

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

0

Попробуйте проверить входы и нормализовать как можно скорее, затем вы можете безопасно использовать первый вариант.

Если ваш пользовательский интерфейс позволяет вводить эту переменную как угодно (например, текстовое поле), то в вашем примере вы можете получить «M», «Male», «Man», «Boy» или «Männlich» «как можно более честные материалы для мужчин, прежде чем даже подумать, что кто-то может предложить глупый ответ. Проверяя (и нормализуя) эти значения, прежде чем их использовать, вы можете предложить пользователю более отзывчивую обратную связь.

Если ваш пользовательский интерфейс ограничивает это переключателем, то он нормализуется еще раньше.

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

Если большинство записей, скорее всего, будут соответствовать, а действия, вызываемые различными значениями, являются дешевыми и обратимыми, я бы использовал второй вариант и выбрал исключение, если значение является неуместным.

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