如何使我的下列代码“干”(不要重复自己)
- (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在我的代码中看起来很糟糕。
答案 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对存储进行整理。
您可以通过允许用户通过重写保存的成绩数组来调整成绩范围,并且代码本身不会发生变化,您可以加上这个特定的设计。