8️⃣

[読書メモ]オブジェクト設計スタイルガイド 1章2節 with TypeScript

2024/01/28に公開

初めに

オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
https://www.oreilly.co.jp/books/9784814400331/

1.2 状態

プロパティ:オブジェクトの状態を格納するもの。名前と型を持つ。

スコープ

  • private:クラスのインスタンスのみが使用可能。
  • public:あらゆるクライアントがアクセス可能。
  • protected:自身のクラスとサブクラスからアクセス可能

詳細
https://typescriptbook.jp/reference/object-oriented/class/access-modifiers

privateスコープをデフォルトにする

クライアントは明治的に定義されたpublicでのみオブジェクトと対話することで無駄な依存を防げる

class GreetWithName {
  // プロパティ:オブジェクトの状態を格納するもの。名前と型を持つ。
  private name: string; // スコープを限定している

  public hello() {
    console.log("hello" + this.name);
  }

  constructor(name: string) {
    this.name = name; // 可変にする場合は、引数から受け取るようにできる
  }
}

const k = new GreetWithName("K");
k.hello();

ミュータブル:オブジェクトの生存期間中に変更され得る
イミュータブル:インスタンス化後に、一切変更されない

export class Mutable {
  constructor(private _count: number) {}

  public add() {
    this._count++;
  }

  get count() {
    return this._count;
  }
}

class Immutable {
  constructor(private _count: number) {}

  public add(): Immutable {
    return new Immutable(this._count + 1);
  }

  get count() {
    return this._count;
  }
}

const ob1 = new Mutable(0);
ob1.add();
console.log(ob1.count); // 1

const ob2 = new Immutable(0);
const ob3 = ob2.add();
console.log(ob2.count); // 0
console.log(ob3.count); // 1

Discussion