Objective c 如何使以下代码干燥?

Objective c 如何使以下代码干燥?,objective-c,cocoa,dry,Objective C,Cocoa,Dry,如何使我的以下代码“干燥”(不要重复) -(void)updateleterscore{//NOT DRY…必须修复 如果(百分比分数59.0和百分比分数64.0和百分比分数66.0和百分比分数69.0和百分比分数73.0和百分比分数76.0和百分比分数79.0和百分比分数83.0和百分比分数85.0和百分比分数89.0和百分比分数93.0和百分比分数

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

-(void)updateleterscore{//NOT DRY…必须修复
如果(百分比分数<60.0)
letterLabel.text=[NSString stringWithFormat:@“F”];
如果(百分比分数>59.0和百分比分数<64.0)
letterLabel.text=[NSString stringWithFormat:@“D-”];
如果(百分比分数>64.0和百分比分数<67.0)
letterLabel.text=[NSString stringWithFormat:@“D”];
如果(百分比分数>66.0和百分比分数<70.0)
letterLabel.text=[NSString stringWithFormat:@“D+”];
如果(百分比分数>69.0和百分比分数<74.0)
letterLabel.text=[NSString stringWithFormat:@“C-”];
如果(百分比分数>73.0和百分比分数<76.0)
letterLabel.text=[NSString stringWithFormat:@“C”];
如果(百分比分数>76.0和百分比分数<80.0)
letterLabel.text=[NSString stringWithFormat:@“C+”];
如果(百分比分数>79.0和百分比分数<84.0)
letterLabel.text=[NSString stringWithFormat:@“B-”];
如果(百分比分数>83.0和百分比分数<86.0)
letterLabel.text=[NSString stringWithFormat:@“B”];
如果(百分比分数>85.0和百分比分数<90.0)
letterLabel.text=[NSString stringWithFormat:@“B+”];
如果(百分比分数>89.0和百分比分数<94.0)
letterLabel.text=[NSString stringWithFormat:@“A-”];
如果(百分比分数>93.0和百分比分数<100.0)
letterLabel.text=[NSString stringWithFormat:@“A”];
如果(百分比分数==100)
letterLabel.text=[NSString stringWithFormat:@“A+”];
}
谢谢你的提示。我只想知道你们怎么想,因为这个小家伙在我的代码中看起来很可怕。

一种方式(伪代码,因为我不知道目标C):

等级=[“F”、“D-”、“D”、…]
分数=[60.0,64.0,67.0,…]
对于(i=0;i
单向(伪代码,因为我不知道目标C):

等级=[“F”、“D-”、“D”、…]
分数=[60.0,64.0,67.0,…]
对于(i=0;i
Talljoe展示了一种方法,但想法是简单地将所有分数存储在某种查找表中,我会提取所有神奇的值,并将它们放在一个表中,然后在表中进行迭代检查,以查看您的百分比分数在哪个范围内。你可能想重新检查你的所有范围,它们似乎没有解决percentScore可以假设的所有值。

如果这个讨厌的东西在我的管理下,我会提取所有神奇的值,并将它们放在一个表中,然后在表中反复检查,看看你的percentScore属于哪个范围。您可能需要重新检查您的所有范围,它们似乎没有解决percentScore可以假定的所有值。

与其他人一样,我会将这些值放入一个表中,然后扫描该表。这张桌子很小,可能不值得做一些像树一样更有效的结构

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;
}
typedef结构{
浮动百分比;
NSString*字母等级;
}坡度范围
-(NSString*)LetterGrade for percentage:(浮动)百分比{
GradeRange范围[]={{.minPercent=100,.letterGrade=@“A+”},
...
{.minPercent=66.0,.letterGrade=@“D+”},
{.minPercent=64.0,.letterGrade=@“D”};
NSString*等级=零;
对于(NSInteger i=0;!等级和&i<(范围大小)/范围大小(范围[0]);i+=1){
如果(百分比>=范围[i].minPercent){
等级=范围[i]。字母等级;
}
}
返回等级;
}

与其他人一样,我会将值放入表中,然后扫描表。这张桌子很小,可能不值得做一些像树一样更有效的结构

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;
}
typedef结构{
浮动百分比;
NSString*字母等级;
}坡度范围
-(NSString*)LetterGrade for percentage:(浮动)百分比{
GradeRange范围[]={{.minPercent=100,.letterGrade=@“A+”},
...
{.minPercent=66.0,.letterGrade=@“D+”},
{.minPercent=64.0,.letterGrade=@“D”};
NSString*等级=零;
对于(NSInteger i=0;!等级和&i<(范围大小)/范围大小(范围[0]);i+=1){
如果(百分比>=范围[i].minPercent){
等级=范围[i]。字母等级;
}
}
返回等级;
}

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

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


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

这里涉及到所有一百个条目,请使用包含成绩字母代码和[array objectAtIndex:i]的数组基于整型坡率值偏移到数组中。完成了

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


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

您可以使用地图代替两个数组。我也不知道目标C,但我在这种情况下的倾向是
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;
}