2015-07-10 3 views
0

я просто пишу этот простой кусок кода:Условный оператор на основе функции наилучшей практики

-(void)goToStep:(int)step{ 
    self.step1.hidden = YES; 
    self.step2.hidden = YES; 
    self.step3.hidden = YES; 
    self.step4.hidden = YES; 

    if(step == 1) 
     self.step1.hidden = NO; 
    if(step == 2) 
     self.step2.hidden = NO; 
    if(step == 3) 
     self.step3.hidden = NO; 
    if(step == 4) 
     self.step4.hidden = NO; 
} 

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

-(void)goToStep:(int)step{ 
    if(step == 1){ 
     self.step1.hidden = NO; 
    self.step2.hidden = YES; 
    self.step3.hidden = YES; 
    self.step4.hidden = YES; 
    } 
if(step == 2){ 
     self.step2.hidden = NO; 
    self.step1.hidden = YES; 
    self.step3.hidden = YES; 
    self.step4.hidden = YES;} 
    if(step == 3){ 
     self.step3.hidden = NO; 
    self.step2.hidden = YES; 
    self.step1.hidden = YES; 
    self.step4.hidden = YES;} 
    if(step == 4){ 
     self.step4.hidden = NO; 
    self.step2.hidden = YES; 
    self.step3.hidden = YES; 
    self.step1.hidden = YES;} 
} 

В качестве альтернативы, с помощью переключателя, будет ли какая-либо разница?

Какой способ лучше? Thanks

+1

Кто говорит, что один путь должен быть лучше другого? Подумайте, какой стиль облегчит долгосрочное обслуживание, не «скрывая» логику как-то. –

+1

Hah, ifs without braces, второй пример очень хорошо показывает, какую странную вещь вы получаете, если не начинаете использовать фигурные скобки. – luk2302

+0

Hah, я всегда использую фигурные скобки для многострочных ifs ...... Во всяком случае, при редактировании на странице я должен пропустить тех, кто спешил – DevilInDisguise

ответ

2

Второй вариант багги, он не делает то, что делает первый.

Лучший способ пойти - это то, что наиболее читаемо (и если ему не нужна избыточная логика, тем лучше).

Я предлагаю:

-(void)goToStep:(int)step { 
    self.step1.hidden = step != 1; 
    self.step2.hidden = step != 2; 
    self.step3.hidden = step != 3; 
    self.step4.hidden = step != 4; 
} 

Или итерацию по коллекции:

NSArray *buttons = @[self.step1, self.step2, self.step3, self.step4]; 
[buttons enumerateObjectsUsingBlock:^(UIButton *button, NSUInteger idx, BOOL *stop) { 
    button.hidden = idx != (step - 1); 
}]; 

Или над словарем с номером в качестве ключей ... много способов. :)

+1

За исключением того, что ваша логика обратная - см. Мой ответ. – matt

+0

Уже исправлено. ;) – Eiko

+0

@Eiko Какова аргументация семантики, когда вы делаете: x = y! = 1; по сравнению с «x =! (y == 1)». Это просто потому, что! = Является оператором as is * или /, когда = когда-либо только назначение? – DevilInDisguise

3

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

self.step1.hidden = (step != 1); 
self.step2.hidden = (step != 2); 
// ... 

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

+0

Я бы сказал, что я охватываю каждый случай в коде, который я предоставил. Я понимаю, почему ваш взгляд выглядит более гладким. Btw, step1-4 также объявляются как выходы – DevilInDisguise

0

другой подход без if - else

// assuming that all steps are hidden by default 
    NSArray *steps = @[step1, step2, step3, step4]; 
    int currentStep = 0; 
    step1.hidden = NO; 

    - (void)goToStep:(int)step{ 
    step--; // adjust zero-based index 
    if (currentStep != step) { 
     steps[currentStep].hidden = YES; 
     steps[step].hidden = NO; 
     currentStep = step; 
    } 
    } 
0

Вашего первого примера и второго примера ведет себя по-разному. Во втором примере шаги 2, 3 и 1 всегда будут установлены в hidden = YES, когда функция завершится, потому что последние три оператора находятся за пределами if-блока и поэтому будут всегда выполняться.

Способ, которым я обычно занимаюсь такими ситуациями, состоит в том, чтобы поместить все 4 вида в массив (скажем, мы называем это «self.steps»). Тогда ваша функция будет:

-(void)goToStep:(int)step { 

     for(UIView *stepView in self.steps) { 
      [stepView setHidden:YES]; 
     } 

     [[self.steps objectAtIndex:step] setHidden:NO]; 
    } 
Смежные вопросы