プロジェクトにはifステートメント、ネストされたifステートメント、if-elseステートメントがたくさんあり、それらをswitchステートメントに変更することを考えています。これらの一部には、ネストされたswitchステートメントがあります。コンパイルに関しては、switchステートメントの方が一般的に高速であることを私は知っています。私の質問は、一般的にどちらを使用するのがより好ましいかということです。
2 に答える
ここに重要な違いがあります
switchステートメントは、結果が整数の式を受け取り、それを定数値のcaseステートメントと照合します。Caseステートメントを式にすることはできません...したがって、決定された値のセットから整数の結果を評価する必要がある場合は、switchステートメントが理にかなっています。
IMO、ネストされたswitchステートメントは、おそらくコードに混乱をもたらすでしょう...それは読みやすいだけではありません。
これは、switchステートメントを使用してUIPickerViewコンポーネントの適切なデータソースを返す例です。
- (NSMutableArray *) datasourceForComponent:(NSInteger)component
{
switch (component) {
case HoursPickerComponent:
return _hours;
break;
case MinutesPickerComponent:
return _mins;
break;
case DaysPickerComponent:
return _days;
break;
default:
return nil;
break;
}
}
これは、マジックストリングやファンキーな条件付きロジックを回避するために使用する一般的なパターンです。列挙型はintの結果を返すため、ルーティングと決定ポイントに列挙型を使用することがよくあります。ここで、さまざまなデータソースの列挙型を作成しました。
typedef enum
{
HoursPickerComponent = 0,
MinutesPickerComponent = 1,
DaysPickerComponent = 2
} MedicationPickerComponents;
次に、UIPickerViewコンポーネントのデリゲートコードは次のようになります。
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
return [[self datasourceForComponent:component] count];
}
これは、コードを読みやすくするために決定ポイントのスイッチを使用する方法の良い例だと思います。私はcaseステートメントに多くのロジックを入れていないことに注意してください...このように、このswitchステートメントの意図を見ると簡単にわかります。実行するコードがもっと複雑な場合は、それをメソッドにスタブして、caseステートメントからメソッドを呼び出します。
制御フローが1つまたは2つを超える値を持つ変数の値に依存している場合、スイッチの方が理にかなっており、読み取りと保守が容易になります。ここで引用するソースはありませんが、とにかく同じネイティブコードにコンパイルされると思います。したがって、パフォーマンスや効率の問題ではありません。読みやすくするためにコーディングする必要があると思います。条件が多いほど、複数のifよりもスイッチの方が適しています。