2017-02-18 22 views
1

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

Вот исходный код я написал:

if((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z')){ // cipher uppercase letters 
     bool uppercase = true; 
     if (s[i] >= 'a' && s[i] <= 'z') { // cipher lowercase letters 
      bool uppercase = false; 
     } 
     printf("%c", cipher_letter(s[i], true, k)); 
    } 
    else { // do nothing on non-alphabet letters 
     printf("%c", s[i]); 
    } 

уборщик способ я нашел прямо сейчас это:

if(s[i] >= 'A' && s[i] <= 'Z') { // cipher uppercase letters 
    printf("%c", cipher_letter(s[i], true, k)); 
} 
else if (s[i] >= 'a' && s[i] <= 'z') { // cipher lowercase letters 
    printf("%c", cipher_letter(s[i], false, k)); 
} 
else { // do nothing on non-alphabet letters 
    printf("%c", s[i]); 
} 

Но тогда я должен повторить функцию cipher_letter.

Что было бы еще лучшим способом уладить это?

+0

Что вы пытаетесь сделать вообще? Возможно, дело не в оптимизации вашего решения, а в поиске полностью нового решения. – Downvoter

+0

@Downvoter Я все для этого. Код работает, я просто ищу лучший стиль, или, как вы говорите, лучшее решение в целом. Во второй версии должно быть ясно, что я делаю. –

+0

Если кто-то спрашивает, правильно ли они решены, я не считаю, что они верят в их решение. Я не знаю, правильно ли ваше решение. Поэтому я был бы признателен, если вы сначала изложите свою проблему, а затем продемонстрируете реализацию. В любом случае, ваш вопрос лучше подходит для [Обзор кода] (https://codereview.stackexchange.com). – Downvoter

ответ

4

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

bool isUpper = s[i] >= 'A' && s[i] <= 'Z'; 
bool isLower = s[i] >= 'a' && s[i] <= 'z'; 

if (isUpper || isLower) { 
    printf("%c", cipher_letter(s[i], isUpper, k)); 
} 
else { // do nothing on non-alphabet letters 
    printf("%c", s[i]); 
} 

дополнительные названия также добавить ясности о цели тестирования, помогая понимания для кого-то еще читает код позже (это может включать вас).

Обновлено: Я прошел неправильный bool до cipher_letter; спасибо за улов.

+0

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

1

Для лучшего дизайна, это может быть упрощена в:

if (isalpha(s[i])) 
    putchar(cipher_letter(s[i], isupper(s[i]), k)); 
else 
    putchar(s[i]); 

или даже:

putchar(isalpha(s[i]) ? cipher_letter(s[i], isupper(s[i]), k) : s[i]); 

Я предпочел бы первый, поскольку он выглядит более четким.

В случае эффективности, оба isalpha и isupper вызовы могут быть реализованы с помощью макросов, которые относятся к lookup table массива, такие как __ctype_b_loc (GCC, Clang).