2009年2月13日金曜日

.NET 定数ファイルを作成する~その1~

定数ファイル「Constant」に「曜日」に関する定数を作ったとします。
こんな感じでしょうか。
Public Class Constant
Public Const SUN As Integer = 1
Public Const MON As Integer = 2
Public Const TUE As Integer = 3
Public Const WED As Integer = 4
Public Const THR As Integer = 5
Public Const FRI As Integer = 6
Public Const SAT As Integer = 7
End Class

この定数ファイル「Constant」にどんどん定数を作っていくと、
Constantoのインテリセンスから定数を探すのが大変です。


そこでグループ化したいと考えて、簡単に列挙体にしました。
Public Class Constant
Public Enum WeekDay
SUN = 1
MON = 2
TUE = 3
WED = 4
THR = 5
FRI = 6
SAT = 7
End Enum
End Class



よくある事ですが
SUNを指定したとき「1」を取得したい場合と「日曜日」を取得したい場合があると思います。
そこで列挙体をクラスに変え、KeyValuePairで値と名前をセットで宣言するようにしました。
使うときはConstant.WeekDay.SUN.Keyで「1」を取得し、Constant.WeekDay.SUN.Valueで「日曜日」を取得します。
Namespace Constant
Public Class WeekDay
Public Shared ReadOnly SUN As New KeyValuePair(Of Integer, String)(1, "日曜日")
Public Shared ReadOnly MON As New KeyValuePair(Of Integer, String)(2, "月曜日")
Public Shared ReadOnly TUE As New KeyValuePair(Of Integer, String)(3, "火曜日")
Public Shared ReadOnly WED As New KeyValuePair(Of Integer, String)(4, "水曜日")
Public Shared ReadOnly THR As New KeyValuePair(Of Integer, String)(5, "木曜日")
Public Shared ReadOnly FRI As New KeyValuePair(Of Integer, String)(6, "金曜日")
Public Shared ReadOnly SAT As New KeyValuePair(Of Integer, String)(7, "土曜日")
End Class
End Namespace



ところが
SUNを指定したとき「日曜日」とは別に「日」を取得したい場合が出てきました。
そこで値「1」と名前「日曜日」と別名「日」をセットで管理するクラスを作成します。
これで「Sunday」や「Sun」など別名がふえても、プロパティを追加すれば大丈夫です。
NameSpace Constant
Public Class ConstItem
Private _Cd As Integer
Private _Name As String
Private _AliasName As String

Private Sub New
End Sub 

Public Sub New(cd As Integer, name As String)
Me._Cd = cd
Me._Name = name
Me._AliasName = String.Empty
End Sub

Public Sub New(cd As Integer, name As String, aliasName As String)
Me._Cd = cd
Me._Name = name
Me._AliasName = aliasName
End Sub

Public ReadOnly Property Cd() As Integer
Get
Return Me._Cd
End Get
End Property

Public ReadOnly Property Name() As String
Get
Return Me._Name
End Get
End Property

Public ReadOnly Property AliasName() As String
Get
Return Me._AliasName
End Get
End Property

End Class
End NameSpace


NameSpace Constant
Public Class WeekDay
Public Shared ReadOnly SUN As New ConstItem(1, "日曜日","日")
Public Shared ReadOnly MON As New ConstItem(2, "月曜日","月")
Public Shared ReadOnly TUE As New ConstItem(3, "火曜日","火")
Public Shared ReadOnly WED As New ConstItem(4, "水曜日","水")
Public Shared ReadOnly THR As New ConstItem(5, "木曜日","木")
Public Shared ReadOnly FRI As New ConstItem(6, "金曜日","金")
Public Shared ReadOnly SAT As New ConstItem(7, "土曜日","土")
End Class
End NameSpace

使うときはConstant.WeekDay.SUN.Cdで「1」を取得し、Constant.WeekDay.SUN.Nameで「日曜日」を取得し、Constant.WeekDay.SUN.AliasNameで「日」を取得します。


今度はこの定数をコンボボックスのリストアイテムにセットしたい場面が出てきました。
その都度リストを作るのが面倒とのことで、WeekDayクラスにリストを作るメソッドを用意します。
※インスタンス化せずに使える事が前提です。
NameSpace Constant
Public Class WeekDay
Public Shared ReadOnly SUN As New ConstItem(1, "日曜日","日")
Public Shared ReadOnly MON As New ConstItem(2, "月曜日","月")
Public Shared ReadOnly TUE As New ConstItem(3, "火曜日","火")
Public Shared ReadOnly WED As New ConstItem(4, "水曜日","水")
Public Shared ReadOnly THR As New ConstItem(5, "木曜日","木")
Public Shared ReadOnly FRI As New ConstItem(6, "金曜日","金")
Public Shared ReadOnly SAT As New ConstItem(7, "土曜日","土")

Public Shared Function CreateList As List(Of ConstItem)
Dim list As New List(Of ConstItem)
list.Add(SUN)
list.Add(MON)
list.Add(TUE)
list.Add(WED)
list.Add(THR)
list.Add(FRI)
list.Add(SAT)
Return list
End Function
End Class
End NameSpace

コンボボックスにWeekDayリスト設定するときは以下のようにします。
ComboBox1.ValueMember = "Cd"
ComboBox1.DisplayMember = "Name"
’別名の場合
'ComboBox1.DisplayMember = "AliasName"
ComboBox1.DataSource = Constant.WeekDay.CreateList


ところがWeekDayクラスにNone[0]を追加してほしい。しかしNone[0]がないWeekDayもそのまま使いたいとの要望がありました。
仕方がないのでWeekDayクラスを継承してWeekDayHasNoneクラスを作成しました。
NameSpace Constant
Public Class WeekDayHasNone
Inherits WeekDay

Public Shared ReadOnly NONE As New ConstItem(0, "なし")

Public Shared Shadows Function CreateList As List(Of ConstItem)
Dim list As List(Of ConstItem)
list = WeekDay.CreateList
list.InsertAt(0,NONE)
Return list
End Function
End Class
End NameSpace



さらにWeekDayクラスからSUN[1]を削除したものが欲しい。しかしSUN[1]があるWeekDayもそのまま使いたいとの要望がありました。
WeekDayクラスを継承してWeekDayHasNotSunクラスを作成しました。
NameSpace Constant
Public Class WeekDayHasNotSun
Inherits WeekDay

Private Shared Shadows ReadOnly SUN As New ConstItem(1, "日曜日","日")

Public Shared Shadows Function CreateList As List(Of ConstItem)
Dim list As List(Of ConstItem)
list = WeekDay.CreateList
list.RemoveAt(WeekDay.SUN)
Return list
End Function
End Class
End NameSpace




CDから名前を検索できるメソッドがあればいいよね(もちろんインスタンス化せずに)との要望。←今ココ
・・・どうするかなぁ

0 件のコメント: