文字列によって処理を振り分けたいのですが、switch分で書くとコードが長くなってしまいます。
コードをスマートにするにはどのようにすれば良いでしょうか。
実装したい機能
キャラクターの動作をシミュレートするアプリケーション。(のようなもの)
データベースで以下のようなテーブルがあり、それらを計算しキャラクターの挙動を変化させる。
キー(string) | 値(float) |
---|---|
WalkSpeed | +10 |
WalkSpeed | +20 |
WalkSpeed | -10 |
AttackSpeed | +5 |
AttackSpeed | +10 |
IsPoison | 1 |
DataUnit
1// テーブルの各行 2public class DataUnit { 3 string Key { get; set; } 4 float Value { get; set; } 5 6 public DataUnit(string key, float value) { 7 Key = key; 8 Value = value; 9 } 10}
Chara
1public class Chara { 2 float walkSpeed = 0f; 3 float attackSpeed = 0f; 4 bool isPoison = false; 5 6 void TestFunc() { 7 List<DataUnit> dataUnits = new List<DataUnit>(); 8 9 // データベースからテーブルデータをdataUnitsへ保存(下記はデバッグ用にデータを生成) 10 dataUnits.Add(new DataUnit("WalkSpeed", 10.0f)); 11 dataUnits.Add(new DataUnit("AttackSpeed", -20.0f)); 12 dataUnits.Add(new DataUnit("IsPoison", 1f)); 13 dataUnits.Add(new DataUnit("WalkSpeed", 12f)); 14 dataUnits.Add(new DataUnit("AttackSpeed", 5f)); 15 16 foreach(var unit in dataUnits) { 17 // Key毎にTestクラスの別々の変数をいじりたい 18 swicth (unit.Key) { 19 case "walkSpeed" 20 walkSpeed += unit.Value; 21 break; 22 23 case "attackSpeed" 24 attackSpeed += unit.Value; 25 break; 26 27 case "isPoison" 28 isPoison |= unit.Value > 0f ? true : false; 29 break; 30 31 // フィールドは増える予定 32 } 33 } 34 } 35 36 void Update() { 37 // キャラクターの動作に反映 38 } 39}
fieldAとfieldBは同じ処理をしていますが、何か共通点はあるのでしょうか。
それとも、処理がたまたま同じなだけでしょうか。
また、fieldA,fieldB,fieldCを初期化するのにdataUnitsは一見不必要に思います。
質問ありがとうございます。
キー"fieldA"の場合は変数fieldAをいじる、
キー"fieldB"の場合は変数fieldBをいじる、
というように処理対象が変わります。
また、処理自体もキー毎に変わります。
質問を編集しました。
fieldA,fieldB,fieldCという変数名を用いていますが、命名が抽象的すぎて、何に使われるか分からないことがスマートさを欠いている原因と思います。
完全に使い道が別物なら、それぞれをオブジェクトとして表現するのが良さそうです。
swichのエリアを簡略化したいっていうことですよね?
無いと思いますよ。
どうしてもクラスを組むかメソッドを組むか、そのままべた書きかっていう違いだけなので。
回答2件
あなたの回答
tips
プレビュー