2009-06-13 11 views
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+"]; 
} 

おかげで(自分を繰り返してはいけない)私の次のコード「DRY」を作ることができます。私はちょうどあなたが何を考えているのか知りたいのですが、このちょっとしたことは私のコードでは大変見えるからです。 (私は客観的Cを知らないので、擬似コード)

+3

主な質問を無視して、なぜあなたは+ stringWithFormat :?を使用していますか?あなたの文字列には書式情報がまったくありませんので、文字列をただちに割り当ててください。例えば letterLabel.text = @ "A"; –

答えて

11

一つの方法:

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; 
    } 
} 
+0

2つの配列の代わりに、マップを使用できます。 – Deinumite

+0

私は客観的なCも知らないのですが、そのような状況での私の傾向は、データをレコードに入れ、2つの値の代わりに1つのレコードの配列しか持たないことです。編集。 –

+0

マップの問題は、それらを順番に移動する方法が必要なことです。私はその記録について同意する。思考は私の心を横切ったが、私はシンプルさに行きました。 – Talljoe

2

Talljoeはそれを行うための一つの方法を示したが、アイデアは、単にルックアップテーブルのいくつかの並べ替えですべての項目を見る保管され

1

この嫌なことが気になっていたら、私はすべての魔法の値を抽出してテーブルに入れ、percentScoreがどの範囲に入るかを調べるためにテーブルのチェックを繰り返します。 percentScoreが想定できるすべての値には対応していないようです。

4

他のものと同じように、私は値をテーブルに入れ、テーブルをスキャンします。テーブルは小さく、ツリーのようなもっと効率的な構造を作る価値はないでしょう。 [:I配列objectAtIndex]整数グレード値に基づいて、配列内のオフセットここで関与百個のエントリのすべてのグレードの文字コードを含む配列を使用して、と

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; 
} 
0

。完了しました。

Cocoaでは、コード内に直接この配列を作成することも、バッキングストア(arrayWithContentsOfFile :)から配列をロードして、Cocoaでストレージを並べ替えることもできます。

保存されているグレード配列を書き換えてグレードの範囲を調整できるようにすることで、この特別なデザインを実現できます。コード自体は変更されません。

関連する問題