不変なBuilder
より安全に組み合わせられるよう、新しいBuilderインスタンスを返します。
「不変なBuilder」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
可変性と不変性
これまでのビルダーはthisを変更して返していました。一方、不変ビルダーは各ステップで新しいビルダーインスタンスを返し、元のインスタンスを変更しません。これにより、より安全に組み合わせられます。
共有された変更の問題
コードの2つの部分が同じ可変ビルダーを保持している場合、一方でセッターを呼び出すと、両方に影響します。不変ビルダーなら、このようなエイリアスによる予期せぬ変更を完全に避けられます。
const base = makeMutableBuilder().url("/x");
// If base is shared, later .method() calls mutate everyone's copy.新しいインスタンスを返す
不変セッターは現在の状態をコピーし、新しいフィールドを追加して、新しいビルダーを構築します。元のビルダーは変更されません。
class IB<S> {
constructor(private readonly d: Record<string, unknown> = {}) {}
with<K extends string, V>(k: K, v: V): IB<S & Record<K, V>> {
return new IB<S & Record<K, V>>({ ...this.d, [k]: v });
}
}スプレッドによる構造的共有
スプレッドの{ ...this.d, [k]: v }は既存のエントリをコピーし、1つのキーを上書きします。変更されていない値は参照によって共有されるため、コピーのコストを抑えられます。
const a = new IB<{}>().with("url", "/x");
const c = a.with("method", "GET");
// a still only has url; c has url and method.元のオブジェクトは決して変更されない
各ステップで新しいオブジェクトが生成されるため、以前のビルダーから分岐しても安全です。構築途中のベースを複数の場所で再利用できます。
const base = new IB<{}>().with("url", "/api");
const get = base.with("method", "GET");
const post = base.with("method", "POST");
console.log("base untouched; get and post diverge");内部状態をreadonlyにする
内部データにreadonlyを付けると意図が明確になり、クラス内部で誤ってその場で書き換えることを防げます。先に進む唯一の方法は、新しいインスタンスを作成することです。
class IB<S> {
constructor(private readonly d: Readonly<Record<string, unknown>> = {}) {}
}型付きの不変ビルド
状態パラメーターは引き続き引き継がれるため、不変性を基盤としながら、これまでとまったく同じようにbuild()を制限できます。
interface Out { url: string; method: string }
class IB<S> {
constructor(private readonly d: Record<string, unknown> = {}) {}
with<K extends string, V>(k: K, v: V): IB<S & Record<K, V>> {
return new IB<S & Record<K, V>>({ ...this.d, [k]: v });
}
build(this: IB<{ url: string; method: string }>): Out { return this.d as Out; }
}
const out = new IB<{}>().with("url", "/u").with("method", "GET").build();
console.log(out.url);より安全な組み合わせ
不変ビルダーは値と同じように組み合わせられます。受け渡し、新しいビルダーの派生、共有状態が後続の呼び出しで書き換えられる心配が不要です。これは、不変データがあらゆる場面でもたらすメリットと同じです。
再利用可能なプリセット
よく使う開始点を一度作成し、そこから何度も分岐できます。コピーオンライトのセッターにより、それぞれの分岐は独立しています。
const jsonBase = new IB<{}>().with("header", "application/json");
const usersReq = jsonBase.with("url", "/users");
const ordersReq = jsonBase.with("url", "/orders");
console.log("two independent requests from one base");コストに関する考慮事項
各ステップで新しいオブジェクトが割り当てられます。一般的な設定の構築では無視できるコストであり、構造的共有によってコピーも浅く保たれます。非常に頻繁に実行されるループでなければ、違いはほとんど現れません。
可変ビルダーと不変ビルダーのまとめ
可変ビルダーはやや高速で単純ですが、不変ビルダーは共有や理解がより安全です。ビルダーを受け渡したり、プリセットとして再利用したりする場合は、不変ビルダーを優先してください。
簡単な確認
このレッスンの簡単な確認です。
まとめ
不変ビルダーは、{ ...this.d, [k]: v }による構造的共有を使い、各ステップで新しいインスタンスを返します。thisは決して変更されません。元のインスタンスが保持されるため、安全な組み合わせや再利用可能なプリセットが実現でき、追加の割り当てコストもわずかです。
よくある質問
「不変なBuilder」レッスンは無料ですか?
はい。「不変なBuilder」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「不変なBuilder」で何を学びますか?
より安全に組み合わせられるよう、新しいBuilderインスタンスを返します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「不変なBuilder」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Builderパターンの基礎
- 型付きFluentインターフェース
- 必須ステップの強制
- 不変なBuilder