constructor には何を書くべきであり、何を書くべきではないのか
#opendraft
published at: Qiita.iconconstructor には何を書くべきであり、何を書くべきではないのか - QiitaSummer498.icon
Abstract
constructor の役割は「インスタンスが利用可能になるために必要な初期状態を作ること」に限定することが望ましい。
# constructor に書くべきこと
- クラスのインスタンスが初期状態として最低限必要なプロパティの初期化・設定
- 依存性注入(Dependency Injection)により外部から渡されるオブジェクトや設定値の保持
## プロパティの初期化
クラスが正常動作するために最低限必要な状態を、引数から受け取った値、またはデフォルト値で設定する。
## 依存性の注入(DI)
外部のオブジェクトやサービスを受け取って内部に保持する。テスト容易性・疎結合性のために重要。
# constructor に書くべきでないこと
- 複雑なロジックやビジネスロジックの実行(メソッドとして別に切り出す)
- グローバルな状態の変更や副作用を伴う処理(副作用の少ない設計にすべき)
## 複雑なビジネスロジックや条件分岐処理
constructor はインスタンス生成のための設定に専念するべきであり、ロジックを大量に含めると読みやすさ・保守性が低下する。
ビジネスロジックは専用のメソッドやファクトリメソッドに分離すべき。
## グローバルな状態変更や副作用のある処理
グローバルな副作用を constructor で引き起こすと、テストやデバッグが難しくなる。
これを避けるため、constructor は純粋にインスタンス自身に関することに集中すべき。
誤りを取り除いておく
# constructor に書くべきでないこと
- 非同期処理や長時間かかる処理(ネットワークアクセス、ファイルアクセスなど)
## 非同期処理(ネットワークアクセスやファイルアクセス)
constructor は本質的に同期処理なので、非同期処理を constructor に書くと設計が複雑化しエラー処理も難しくなる。
代替案として、非同期初期化は別の専用のメソッドや static メソッドを作るべき。
JSでは非同期処理はコンストラクター内に書けないbsahd.icon
厳密には、コンストラクターがPromiseを返したりとかはできない
コンストラクターは生成したインスタンス以外は返せないので、コールバックなどの別チャネルでやる必要がある
コールバックでやるとか頑張ればできる
逆に言うと頑張らないとできないってことやねSummer498.icon
code:js
class AsyncConstructor{
constructor(cb){
fetch(/* URL */).then((res)=>{
return res.json();
}).then((json)=>{
this.data = json;
cb(this);
})
}
}
https://qiita.com/Summer498/items/00f63924b85e53e3760a#constructor-に書くべきでないこと
この悪い例だとdataの準備完了が外部から簡単に受け取れない
ひーんSummer498.icon
同期XHRという手もあるぞbsahd.icon
GPT くん派手に間違えてて草Summer498.icon