検証メソッドが例外を投げるのはどうなの?
以前書いたのが見つかったのでちょっと書いてみる。(普段は日本語でコーディングはしていませんが。)
以下、日付を検証する部分のソースコード。
[Visual Basic]ここで気になるのが、日として妥当だメソッドです。Publicなメソッドにしたので単体で呼ばれることを意識しなければいけない気がします。で、日が妥当かどうか判断するには年と月が必要になります。そうなるとやっぱり年と月を検証するわけですが、年か月が妥当で無い場合、例外を投げるべきなのでしょうか?それともReturn False でしょうか?Public Class 妥当性検証
Private Sub New()
End Sub
Public Shared Function 日付として妥当だ(ByVal 年 As Integer, ByVal 月 As Integer, ByVal 日 As Integer) As Boolean
Return 年として妥当だ(年) AndAlso 月として妥当だ(月) AndAlso 日として妥当だ(年, 月, 日)
End Function
Public Shared Function 年として妥当だ(ByVal 年 As Integer) As Boolean
Return (DateTime.MinValue.Year <= 年) AndAlso (年 <= DateTime.MaxValue.Year)
End Function
Public Shared Function 月として妥当だ(ByVal 月 As Integer) As Boolean
Return (DateTime.MinValue.Month <= 月) AndAlso (月 <= DateTime.MaxValue.Month)
End Function
Public Shared Function 日として妥当だ(ByVal 年 As Integer, ByVal 月 As Integer, ByVal 日 As Integer) As Boolean
' 指定された年月の最終日は指定された年月の日数と同じなんですよね。
Dim 指定された年月の最終日 As Integer = DateTime.DaysInMonth(年, 月)Return (DateTime.MinValue.Day <= 日) AndAlso (日 <= 指定された年月の最終日)
End Function
End Class
私の考えは例外を投げるべきです。ここでの日として妥当だメソッドは日を検証するメソッドであり、年や月が妥当で無い場合は日を検証出来ない状態(例外)だと思うからです。
なので、日として妥当だメソッドは、
Public Shared Function 日として妥当だ(ByVal 年 As Integer, ByVal 月 As Integer, ByVal 日 As Integer) As Booleanのように実装します。ちなみに日付として妥当だメソッドは内部での各検証メソッドの呼び出しがこの順序である限り、この実装で例外が投げられることはありません。If Not 年として妥当だ(年) Then
Throw New ArgumentOutOfRangeException("年 が 1 未満か、9999 よりも大きい値です。")
End If
If Not 月として妥当だ(月) Then
Throw New ArgumentOutOfRangeException("月 が 1 未満か、12 よりも大きい値です。")
End If
' 指定された年月の最終日は指定された年月の日数と同じなんですよね。
Dim 指定された年月の最終日 As Integer = DateTime.DaysInMonth(年, 月)Return (DateTime.MinValue.Day <= 日) AndAlso (日 <= 指定された年月の最終日)
End Function
皆様はどうなさっていますか?
参考にさせていただいたところ。
@IT:第2回 ソフトウェア開発をシンプルにする考え方のコツ
C# と VB.NET の入門サイト:正しい日付かどうかをチェックする (IsDate)
例外メッセージで数値決め打ちなのは見なかったことにする。