0Pricing
TypeScript Academy · レッスン

不変な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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Builderパターンの基礎
  2. 型付きFluentインターフェース
  3. 必須ステップの強制
  4. 不変なBuilder
← TypeScript Academyに戻る