前提
C#で処理の分岐を各クラス別に記述する事で処理をおこなっています。
ですが、クラスの生成が上手く書く事ができず、この方法がよいのか悩んでおります。
実現したいこと
識別子をwitch文で分岐し、そこからクラスを生成することで処理を分岐されております。
しかし、タスクの種類が多くなるとSwitch文が長くなってしまい、コードが見難くなってしまいます。
また、識別子とクラスの関係が1:1となっておりますので、もっとスマートに実装できそうな気がしておりますが、方法がわかりません。
例えば、
ITaskBase[] TaskTypeArray = { TaskA, TaskB, TaskC, ... };
return new TaskTypeArray[task_type];
みたいな書き方や、
var taskname = "Task" + task_type;
return new taskname;
といった記述で作成する方法はないのでしょうか?
該当のソースコード
C#
1■ 定義 2 3// 抽象クラス 4abstract class ITaskBase 5{ 6 public abstract bool Process(); 7} 8 9// 処理タイプ(A) 10class TaskA : ITaskBase 11{ 12 public override bool Process() 13 { 14 // ...処理... 15 } 16} 17 18// 処理タイプ(B) 19class TaskB : ITaskBase 20{ 21 public override bool Process() 22 { 23 // ...処理... 24 } 25} 26 27// 処理タイプ(C) 28class TaskC : ITaskBase 29{ 30 public override bool Process() 31 { 32 // ...処理... 33 } 34}
C#
1■ 作成する際は、 2 3enum task_type; 4 5switch(task_type) 6{ 7 case A: 8 return new TaskA(); 9 10 case B: 11 return new TaskB(); 12 13 case C: 14 return new TaskC(); 15 16 // ...タスクの種類だけ続く... 17}
> タスクの種類が多くなるとSwitch文が長くなってしまい、コードが見難くなってしまいます。
質問のコードの「// ...処理...」というのはどういうものですか? task_type によって全く処理が異なるコードを書かなければならないのであれば、switch 文を使おうが何をしようが、処理が異なるコードを全部書かざるを得ず、その分コードが長くなるのは避けようがないと思うのですが?
今日退会した例の人かな?
古くからあるデザインパターンのひとつ、Factoryパターンやその類型が参考になりそうに思います。今はもっとモダンなやり方があるのかも知れませんが。
> 「// ...処理...」というのはどういうものですか?
DB操作だったり、XML解析だったり、出力だったり、まったく別の処理内容となっています。
簡易スクリプトのような文字列を読み込んで、それに沿って処理を行おうとしています。
> 今日退会した例の人かな?
はじめまして
初めて登録しましたので、別の方かと…
> Factoryパターンやその類型が参考
ですね、Factoryで言うところ(?)のCreateの実装になります。
>> 「// ...処理...」というのはどういうものですか?
> DB操作だったり、XML解析だったり、出力だったり、まったく別の処理内容となっています。
そういうことだとすると、そもそもの考え方を根本から見直した方が良さそうな気がしますけど。
クラスの中の Process メソッドは「まったく別の処理内容」を行うのに、共通の abstract クラスを継承したクラスを処理に必要な数作って、処理によってクラスを選択してインスタンスを生成し、処理を実行するなんてことは自分的には(たぶん一般的にも)あり得ません。
Dependency injection を考えた方が良さそうな気がします。
質問者さん、その後無言ですが、回答が出ているのでそれらに対するフィードバックを返してください。役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。解決したなら解決に役立った回答にベストアンサーをつけてクローズしてください。
ご指摘ありがとうございます。
クローズする必要があるんですね、了解です。
> クローズする必要があるんですね、了解です。
そうです。
「ベストアンサーをつける」=「スレッドをクローズする」ということになります。
回答2件
あなたの回答
tips
プレビュー