2009-06-13 3 views
1

Как я могу сделать мой следующий код "DRY" (Dont Repeat Yourself)Как я могу сделать следующий код сухим?

- (void)updateLetterScore { // NOT DRY... Must fix 
    if (percentScore < 60.0) 
     letterLabel.text = [NSString stringWithFormat:@"F"]; 

    if (percentScore > 59.0 && percentScore < 64.0) 
     letterLabel.text = [NSString stringWithFormat:@"D-"]; 

    if (percentScore > 64.0 && percentScore < 67.0) 
     letterLabel.text = [NSString stringWithFormat:@"D"]; 

    if (percentScore > 66.0 && percentScore < 70.0) 
     letterLabel.text = [NSString stringWithFormat:@"D+"]; 

    if (percentScore > 69.0 && percentScore < 74.0) 
     letterLabel.text = [NSString stringWithFormat:@"C-"]; 

    if (percentScore > 73.0 && percentScore < 76.0) 
     letterLabel.text = [NSString stringWithFormat:@"C"]; 

    if (percentScore > 76.0 && percentScore < 80.0) 
     letterLabel.text = [NSString stringWithFormat:@"C+"]; 

    if (percentScore > 79.0 && percentScore < 84.0) 
     letterLabel.text = [NSString stringWithFormat:@"B-"]; 

    if (percentScore > 83.0 && percentScore < 86.0) 
     letterLabel.text = [NSString stringWithFormat:@"B"]; 

    if (percentScore > 85.0 && percentScore < 90.0) 
     letterLabel.text = [NSString stringWithFormat:@"B+"]; 

    if (percentScore > 89.0 && percentScore < 94.0) 
     letterLabel.text = [NSString stringWithFormat:@"A-"]; 

    if (percentScore > 93.0 && percentScore < 100.0) 
     letterLabel.text = [NSString stringWithFormat:@"A"]; 

    if (percentScore == 100) 
     letterLabel.text = [NSString stringWithFormat:@"A+"]; 
} 

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

+3

Игнорирование основного вопроса, почему на erath вы используете + stringWithFormat :? Ни одна из ваших строк не имеет никакой информации о форматировании вообще, поэтому просто назначьте строку. например letterLabel.text = @ "A"; –

ответ

11

Один из способов (псевдо-код, так как я не знаю, Objective C):

grades = ["F", "D-", "D", ...] 
scores = [60.0, 64.0, 67.0, ...] 

for(i = 0; i < grades.count; i = i + 1) 
{ 
    if(score < scores[i]) 
    { 
    letterLabel.text = [NSString stringWithFormat:@"%@", grades[i]] 
    break; 
    } 
} 
+0

Вместо двух массивов вы можете использовать карту. – Deinumite

+0

Я тоже не знаю цель C, но моя склонность в такой ситуации состоит в том, чтобы поместить данные в записи и иметь только один массив записей вместо двух значений - никоим образом не случайно получить их из синхронизации в редактирования. –

+0

Проблема с картой заключается в том, что вам нужен способ ее перемещения по порядку. Я соглашаюсь на записи. Эта мысль перешла мне в голову, но я пошел с простотой. – Talljoe

2

Talljoe показал один из способов сделать это, но идея просто хранить все результаты в какой-то таблицы поиска

1

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

4

Как и другие, я бы поместил значения в таблицу, а затем просмотрел таблицу. Таблица небольшая, вероятно, не стоит создавать еще более эффективную структуру O(), такую ​​как дерево.

typedef struct { 
    float minPercent; 
    NSString *letterGrade; 
} GradeRange 

- (NSString *)letterGradeForPercentage:(float)percentage { 
    GradeRange ranges[] = {{.minPercent = 100, .letterGrade = @"A+"}, 
          ... 
          {.minPercent = 66.0, .letterGrade = @"D+"}, 
          {.minPercent = 64.0, .letterGrade = @"D"}}; 

    NSString *grade = nil; 
    for(NSInteger i = 0; !grade && i < (sizeof(ranges)/sizeof(ranges[0])); i += 1) { 
     if (percentage >= ranges[i].minPercent) { 
      grade = ranges[i].letterGrade; 
     } 
    } 
    return grade; 
} 
0

Со всеми сотни записей, участвующих здесь, использовать массив, содержащий код класса письмо и [массив objectAtIndex: я] смещение в массиве на основе значения целого класса. Готово.

С помощью Cocoa вы можете либо построить этот массив непосредственно в коде, либо загрузить массив из резервного хранилища (arrayWithContentsOfFile :) и разрешить Cocoa сортировать хранилище.

Вы можете один плюс этот конкретный дизайн, разрешив пользователю корректировать диапазоны оценок, переписав сохраненный класс сортировки, а сам код не изменится.