前提・実現したいこと
ファイル読み込み→変換→ファイル出力を行うような処理をTempleteMethodパターンで作成しようとしています。
以下の様な処理で考えているのですが、何点か気になる点があり、クラス設計に問題があるのか悩んでいます。
問題点をご指摘いただけないでしょうか。
前提
- Dto1,Dto2やConvertDto1,ConvertDto2の項目は全く違うもので抽象化はできません
気になる点
- パラメータがobject型なので具象クラスを作成する人間が毎回object型を適切な型に変換し、後続の処理を行う必要がある
- Dtoが抽象化できないのでAbstractClassのメソッドのパラメータ・返り値、メンバ変数の定義が
軒並みobject型になってしまい、変数やメソッドの用途がイマイチ分かりづらい
0. そもそもTemplateMethodパターンのサンプルで、抽象メソッドに返り値を持たせる
ようなものをあまり見かけません、ということはTemplateMethodパターンを使うこと自体が間違っている?
処理
C#
1 public abstract class AbstractClass 2 { 3 protected abstract IEnumerable<object> ReadFile(); 4 5 protected abstract IEnumerable<object> Convert(IEnumerable<object> readDtos); 6 7 protected abstract void WriteFile(IEnumerable<object> convertDtos); 8 9 private IEnumerable<object> _readDtos; 10 11 private IEnumerable<object> _convertDtos; 12 13 public void Run() 14 { 15 // ファイルを読み込みDtoに設定 16 this._readDtos = this.ReadFile(); 17 18 // 読み込んだデータを変換 19 this._convertDtos = this.Convert(this._readDtos); 20 21 // ファイル出力 22 this.WriteFile(this._convertDtos); 23 } 24 } 25 26 public class ConcreteClass1 : AbstractClass 27 { 28 protected override IEnumerable<object> ReadFile() 29 { 30 // ファイル読み込み 31 32 // 読み込み内容をDtoの配列で返却 33 34 return IEnumerable<dto1> 35 } 36 37 protected override IEnumerable<object> Convert(IEnumerable<object> readDtos) 38 { 39 // パラメータがobjectなのでDto1に変換しなければならない 40 var dtos = (IEnumerable<Dto1>)readDtos; 41 42 // readDto→convertDto変換処理 43 44 return IEnumerable<convertDto1>; 45 } 46 47 protected override void WriteFile(IEnumerable<object> convertDtos) 48 { 49 // パラメータがobjectなのでConvertDto1に変換しなければならない 50 var dtos = (IEnumerable<ConvertDto1>)convertDtos; 51 52 // ファイル書き込み処理 53 } 54 } 55 56 public class ConcreteClass2 : AbstractClass 57 { 58 protected override IEnumerable<object> ReadFile() 59 { 60 return IEnumerable<dto2>; 61 } 62 63 protected override IEnumerable<object> Convert(IEnumerable<object> readDtos) 64 { 65 var dtos = (IEnumerable<Dto2>)readDtos; 66 67 return IEnumerable<convertDto2>; 68 } 69 70 protected override void WriteFile(IEnumerable<object> convertDtos) 71 { 72 var dtos = (IEnumerable<ConvertDto2>)convertDtos; 73 } 74 }