🏵️

完全コンストラクタパターンの紹介

2023/06/06に公開

完全コンストラクタとは

「コンストラクタで全てのプロパティの値が確定し、そこから変化しない」 実装のこと。

"コンストラクタ後にそこから変化しない"ということなので、完全コンストラクタではsetterなどは用意しません。

普通のコンストラクタでは何が問題なのか

ずばりオブジェクトの安全性。
普通のコンストラクタだと、下記のような問題と付き合っていくことになる。

1. プロパティがパブリックな場合

外部から完成されたオブジェクトを変化できてしまう

user.id = 100;

2. setterメソッドがある場合

こちらも、外部から完成されたオブジェクトを変化できてしまう

user.setId(100);

3. 実はinitialize()などのメソッドを呼ばないといけない場合

initialize()などの初期化メソッドを呼ばないと、プロパティが初期値であったりnullであったりする

user = new User();
console.log(user.id); // null
user.initialize();
console.log(user.id); // 100

完全コンストラクタの長所

  • 可読性 & 保守性が高まる

完全コンストラクタはイプロパティの値が変化することがないため、setterなどのメソッドを通して値が変化したかどうかを気にしなくてよい。意図しないタイミングで値が変化することもなく、シンプルな実装になり、可読性と保守性の向上につながる。

  • テストしやすい

インスタンス化してしまえば、メソッドの実行結果は同じものを返すため、テストも非常に行いやすい。

完全コンストラクタの短所

毎回インスタンスを生成するため負荷がかかる。
一部の値を更新するためだけでも、setterなどがないのでコンストラクタを実行しなければならないため、コードの冗長に繋がる。

短所への対応策の一つとして、Builderパターンを併用するのを考慮してもいいかもしれません。

まとめ

完全コンストラクタを活用すると、値の更新や副作用を気にする必要がなくなる。
オブジェクトの安全性が上がり、可読性や保守性の高いコードを実装することができる。

一度試してみるのはいかがでしょう。

参照

https://ngmt83.hatenablog.com/entry/2019/03/07/090000

https://qiita.com/il-m-yamagishi/items/cae4b1016e2142ac1c41

https://note.com/pharmax/n/n86393eb17d55#dcb8b399-ae02-401e-aa85-ddac95432f7e

Discussion