1

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

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

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

4

5 回答 5

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;
   }
}
于 2009-06-13T03:40:43.473 回答
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;
}
于 2009-06-13T06:25:04.903 回答
2

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

于 2009-06-13T03:45:05.910 回答
1

如果这个可憎的事情在我的照顾之下,我会提取所有的魔法值并将它们放在一个表格中并遍历表格检查以查看您的 percentScore 属于哪个范围。您可能想要重新检查所有范围,它们似乎没有解决 percentScore 可以假设的所有值。

于 2009-06-13T03:53:55.843 回答
0

此处涉及所有一百个条目,使用包含等级字母代码的数组和 [array objectAtIndex: i] 基于整数等级值的数组偏移量。完毕。

使用 Cocoa,您可以直接在代码中构建这个数组,或者从后备存储 (arrayWithContentsOfFile:) 加载数组并让 Cocoa 整理存储。

您可以通过允许用户通过重写保存的成绩数组来调整成绩范围来对这种特殊设计进行加分,并且代码本身不会改变。

于 2009-06-13T18:39:44.543 回答