背景
C# + WPFでアプリケーションを作っています。
MessageBox.Show()で表示するメッセージや、ComboBoxのItemSourceで使われるアイテムを今はpublic static readonly
で定義しています。
ただ上記以外にもResourceFileに定義する方法をあることも知り、色々調べてみたのですが、
リテラルをResourceFileに定義する必要性に疑問を抱き質問しました。
詳細
例えば以下のコードで作られたアプリケーションがあるとします。
Xaml
1<Window ...Title="SubWindow" Height="250" Width="400"> 2 <StackPanel Margin="50"> 3 <ComboBox ItemsSource="{Binding ComboBoxItemSource}" SelectedIndex="{Binding ComboBoxSelectedIndex}" SelectionChanged="ComboBox_SelectionChanged"/> 4 <Label Content="{Binding LabelContext}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 5 </StackPanel> 6</Window>
C#
1 public partial class SubWindow : Window 2 { 3 private ViewModelSubWindow mViewModel = new ViewModelSubWindow(); 4 5 public SubWindow() 6 { 7 InitializeComponent(); 8 this.DataContext = mViewModel; 9 } 10 11 private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 12 { 13 mViewModel.LabelContext = DefineWeek.getWeekName(mViewModel.ComboBoxSelectedIndex); 14 } 15 } 16 17 public class ViewModelSubWindow : DataBindingBase //DataBindingBaseは省略 18 { 19 public ViewModelSubWindow() 20 { 21 _comboBoxItemSource = DefineWeek.WeekList.Keys.Select(x => x.ToString()).ToList(); 22 } 23 24 private List<string> _comboBoxItemSource = new List<string>(); 25 public List<string> ComboBoxItemSource 26 { 27 get 28 { 29 return _comboBoxItemSource; 30 } 31 set 32 { 33 _comboBoxItemSource = value; 34 NotifyPropertyChanged(nameof(ComboBoxItemSource)); 35 } 36 } 37 38 private int _comboBoxSelectedIndex = 0; 39 public int ComboBoxSelectedIndex 40 { 41 get 42 { 43 return _comboBoxSelectedIndex; 44 } 45 set 46 { 47 _comboBoxSelectedIndex = value; 48 NotifyPropertyChanged(nameof(ComboBoxSelectedIndex)); 49 } 50 } 51 52 private string _labelContext = ""; 53 public string LabelContext 54 { 55 get 56 { 57 return _labelContext; 58 } 59 set 60 { 61 _labelContext = value; 62 NotifyPropertyChanged(nameof(LabelContext)); 63 } 64 } 65 } 66 67 public class DefineWeek 68 { 69 public static readonly string Sunday = "日曜"; 70 public static readonly string Monday = "月曜"; 71 public static readonly string Tuesday = "火曜"; 72 public static readonly string Wednesday = "水曜"; 73 public static readonly string Thursday = "木曜"; 74 public static readonly string Friday = "金曜"; 75 public static readonly string Saturday = "土曜"; 76 77 public static Dictionary<int, string> WeekList { get; private set; } = new Dictionary<int, string>() 78 { 79 { 0, Sunday }, 80 { 1, Monday }, 81 { 2, Tuesday }, 82 { 3, Wednesday }, 83 { 4, Thursday }, 84 { 5, Friday }, 85 { 6, Saturday } 86 }; 87 88 public static string getWeekName(int pWeekId) 89 { 90 if (WeekList.Count < 1) 91 { 92 return ""; 93 } 94 95 return WeekList.FirstOrDefault(item => item.Key == pWeekId).Value; 96 } 97 }
このアプリケーションは以下のような仕様です。
・仕様1:ユーザがComboBoxおよびLabelの表示内容を追加・削除・編集することはできない
・仕様2:対応言語は日本語のみであり今後変更・拡張される予定はない
・仕様3:DefineWeek
クラスを将来的にDLL化する可能性はある
・仕様4:各クラスと各ファイルが1対1にしなければならない
→ 例)aaa.cs
ファイルにはaaa
クラスしか定義できない。
上記のような場合、DefineWeek
クラスの定数をResourceFileにて定義することもできると思いますが、
以下の理由からResourceFileにするのは不適切かなと考えました。
- 理由1:
DefineWeek.WeekList
のように数値とリテラルをペアで扱いたい上、DefineWeek.getWeekName()
のように数値に基づいてリテラルを取得することがコーディング面から容易である
→ ResourceFileにするとまずDefineWeek.WeekList
のようなDictionalyを作る必要があり、それは冗長だと思っている
→ Dictionalyを作らない場合switch
で都度判別することになり、それも冗長だと思っている
- 理由2:
DefineWeek
にpublic static readonly string Holiday = "祝日";
などが増えたり、既存の曜日が必要なくなった場合を考慮し保守がしやすい - 理由3:
DefineWeek
クラスがDLLになり修正が行われた際、参照側のプログラムをリビルドする必要がなくなると考えている(バージョニング問題の対策)
ですがResourceFileについて調べると、リテラルもResourceFileで定義するのが当たり前なのかと思われるほど、
ResourceFileで定義するサンプルを見かけます。
アイコンなどのイメージ画像やテキストファイルであれば納得もできますが...。
質問
1、上記のようにリテラルをResourceFileに定義しないのは間違いなのでしょうか?(設計自体問題があるというご指摘でも構いません)
2、リテラルをResourceFileに定義しない場合のデメリット、定義する場合のメリットを知りたいです。
ご助言いただけますと幸いです。よろしくお願いします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/11 09:27
2020/01/11 10:04
2020/01/14 00:55