プログラミングでオブジェクト指向やリファクタリングについて色々勉強していたときに知った
「完全コンストラクタ」パターンというデザインパターンを自分なりの解釈で紹介します。
完全コンストラクタパターン
インスタンス生成時にクラスの全てのプロパティに値を設定して
それ以降はプロパティの値が変化しないようにする設計パターンです。
利点
- オブジェクトをイミュータブル(不変)にできる。
- 可読性が高まる。
イミュータブルなので、どこかで知らないうちにオブジェクトの状態が変わることがありません。
関数などのパラメータにオブジェクトを渡して戻ってきても状態が変わっていないことが保証されます。
オブジェクトの状態を変えて使いまわすということができないので安全で可読性も高まります。
欠点
- パフォーマンスが悪くなることがあるかも?
イミュータブルなので「オブジェクトの状態を変えて使いまわす」ということはできず、インスタンスを新たに生成する必要があります。
そのようなことを大量に繰り返すコードを書くとパフォーマンスへの影響が出るかもしれません。
実装例
VB.NETで書きました。
Public Class Person
Public ReadOnly Property LastName As String
Public ReadOnly Property FirstName As String
Public ReadOnly Property Birthday As Date
Public Sub New(lastName As String, firstName As String, birthday As Date)
Me.LastName = lastName
Me.FirstName = firstName
Me.Birthday = birthday
End Sub
Public Function GetFullName() As String
Return Me.LastName & Me.FirstName
End Function
Public Function GetAge() As Integer
Dim age As Integer = Date.Today.Year - Me.Birthday.Year
Return If(Me.Birthday > Date.Today.AddYears(-age), age - 1, age)
End Function
End Class
コンストラクタに引数を持たせて、その引数で全てのプロパティの値を初期化します。
プロパティはReadOnlyにして、setterは用意しません。
こうすることで外部からオブジェクトを操作できないようにして安全性を高めることができます。
コンストラクタで受け取った引数が妥当かチェックし、NGの場合は例外を投げるようにしておけば更に安全性が増すと思います。
クラスのプロパティが多い場合は
GoFのビルダー(Builder)パターンを併用するのが良いようです。
最後に
シンプルで分かりやすい上に有用なパターンだと自分は思います。
覚えて損は無いかと。
以上。