Какой более подходящий способ программирования - PullRequest
9 голосов
/ 02 июня 2010

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

Например, если у нас есть переменная, которая хранит пол как M или 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

Ответы [ 10 ]

10 голосов
/ 02 июня 2010

Для этого примера я бы вообще не использовал IF, я бы использовал SWITCH для второго примера

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")
4 голосов
/ 02 июня 2010

Коротко - это зависит от типа переменной. Если это логическое значение или какое-либо перечисление, и нет другого значения, которое он может иметь (включая 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 для каждого возможного сценария, но не более этого , и сохраняйте его читаемым.

2 голосов
/ 02 июня 2010

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

1 голос
/ 02 июня 2010

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

1 голос
/ 02 июня 2010

Если значения gendre могут быть только 'M' или 'F', то вы можете использовать assert, чтобы прояснить это:

Assert(gender = "M" OR gender = "F")
If gender = "M"
   do male_processing
else
   do female_processing
endif
1 голос
/ 02 июня 2010

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

switch(gender) {
  case "M":
    doMaleSpecificStuff();
    break;
  case "F":
    doFemaleSpecificStuff();
    break;
  default:
    throw AnyError;
}
0 голосов
/ 02 июня 2010

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

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

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

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

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

0 голосов
/ 02 июня 2010

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

0 голосов
/ 02 июня 2010

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

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

0 голосов
/ 02 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...