ユーザー定義の設定に従ってデータを処理するプログラムを作成しています。処理中に、これらのユーザー定義の設定に従って反復する必要がある関連リストがいくつかあります。ユーザーは、これらのリストが繰り返される順序を決定します。
非常に保守しやすいコードを保持しながら、これらのリストを反復するためのアルゴリズムをどのように設計できるか疑問に思っています。ここでの考え方は、各ケースがリストの 1 つの反復を行う巨大なスイッチ ケースを持つ関数に終わらないようにすることです。
例:
処理する必要があるデータがさまざまな種類の食品のリストであるとします。ユーザーは、異なる食品グループが処理される順序を指定する必要があります。食品グループは、さまざまな食品を格納する単純なリストです。
List<string> grains = new List<string> { "Bread", "Pasta", "Cereal", "Rice" };
List<string> vegetables = new List<string> { "Corn", "Pea", "Carrot", "Tomato" };
List<string> fruits = new List<string> { "Apple", "Orange", "Banana", "Pear" };
List<string> meat = new List<string> { "Beef", "Chicken", "Pork", "Turkey" };
List<string> diary = new List<string> { "Milk", "Cheese", "Yogurt", "Cream" };
ユーザーが希望する注文は、別のリストに保存されます。以下に、考えられる順序の 1 つを示します。
List<string> order = new List<string>
{
"grains", //Grains processed first.
"vegetables",
"fruits",
"meat",
"diary" //Dairy processed last.
};
それがどのように機能するかを説明するために、望ましくないスイッチケースを使用します。
foreach(string foodGroup in order)
{
switch(foodGroup)
{
case "grains":
foreach(string foodItem in grains)
{
ProcessFood(foodItem);
}
break;
case "vegetables":
foreach(string foodItem in vegetables)
{
ProcessFood(foodItem);
}
break;
case "fruits":
foreach(string foodItem in fruits)
{
ProcessFood(foodItem);
}
break;
case "meat":
foreach(string foodItem in meat)
{
ProcessFood(foodItem);
}
break;
case "diary":
foreach(string foodItem in diary)
{
ProcessFood(foodItem);
}
break;
}
}
私のアプリケーションでは、case ステートメントには、実際には、例の単純な foreach ループよりも多くのコードが含まれます。このアルゴリズムを設計するより良い方法はありますか? 不要ではありますが、このようなアルゴリズムを設計するスケーラブルな方法もあるのだろうかと思っています (新しい食品グループを追加/削除してもアルゴリズムは壊れません)。