如何使以下代码干燥?

时间:2009-06-13 03:37:17

标签: objective-c cocoa dry

如何使我的下列代码“干”(不要重复自己)

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

感谢您的提示。我只是想知道你们的想法,因为这个小小的snippit在我的代码中看起来很糟糕。

5 个答案:

答案 0 :(得分:11)

单向(伪代码,因为我不知道目标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;
   }
}

答案 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;
}

答案 2 :(得分:2)

Talljoe展示了一种方法,但这个想法只是将所有分数存储在某种查找表中

答案 3 :(得分:1)

如果这种憎恶在我的照顾下,我会提取所有神奇的值并将它们放在一张表中并遍历表格,检查你的百分数在哪个范围内。你可能想要重新检查你所有的范围,他们不要似乎没有解决百分之百所能承担的所有价值。

答案 4 :(得分:0)

这里涉及所有100个条目,使用包含等级字母代码和[array objectAtIndex:i]的数组,根据整数等级值偏移到数组中。完成。

使用Cocoa,您可以直接在代码中构建此数组,也可以从后备存储(arrayWithContentsOfFile :)加载数组,并允许Cocoa对存储进行整理。

您可以通过允许用户通过重写保存的成绩数组来调整成绩范围,并且代码本身不会发生变化,您可以加上这个特定的设计。