Как я могу сделать следующий код сухим? - PullRequest
1 голос
/ 13 июня 2009

Как мне сделать мой следующий код "СУХОЙ" (не повторяй себя)

- (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+"];
}

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

Ответы [ 5 ]

11 голосов
/ 13 июня 2009

В одну сторону (псевдокод, поскольку я не знаю цели 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;
   }
}
4 голосов
/ 13 июня 2009

Как и другие, я бы положил значения в таблицу, а затем просканировал таблицу. Таблица небольшая, вероятно, не стоит создавать еще одну эффективную структуру 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;
}
2 голосов
/ 13 июня 2009

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

1 голос
/ 13 июня 2009

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

0 голосов
/ 13 июня 2009

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

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

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

...