完全コンストラクタパターン【デザインパターン】

プログラミングでオブジェクト指向やリファクタリングについて色々勉強していたときに知った
「完全コンストラクタ」パターンというデザインパターンを自分なりの解釈で紹介します。

完全コンストラクタパターン

インスタンス生成時にクラスの全てのプロパティに値を設定して
それ以降はプロパティの値が変化しないようにする設計パターンです。

利点

  • オブジェクトをイミュータブル(不変)にできる。
  • 可読性が高まる。

イミュータブルなので、どこかで知らないうちにオブジェクトの状態が変わることがありません。
関数などのパラメータにオブジェクトを渡して戻ってきても状態が変わっていないことが保証されます。
オブジェクトの状態を変えて使いまわすということができないので安全で可読性も高まります。

欠点

  • パフォーマンスが悪くなることがあるかも?

イミュータブルなので「オブジェクトの状態を変えて使いまわす」ということはできず、インスタンスを新たに生成する必要があります。
そのようなことを大量に繰り返すコードを書くとパフォーマンスへの影響が出るかもしれません。

実装例

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)パターンを併用するのが良いようです。

最後に

シンプルで分かりやすい上に有用なパターンだと自分は思います。
覚えて損は無いかと。
以上。

タイトルとURLをコピーしました