9️⃣

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

2024/01/29に公開

初めに

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

1.3 振る舞い

メソッドを通して、クラス内のプロパティを使用して値を加工したり、プロパティを加工したりできる。

1.4 依存関係

Fooを使うために、Barを必要とする場合は、BarをFooの依存関係と呼ぶ

class Foo {
  constructor(bar: Bar) {} // 依存性の注入
}
class Bar {}

1.5 継承

クラスで一部だけ定義し、他のクラスに拡張させることができる。

インターフェース:メソッドのシグネチャだけを持つもの(TypeScriptは、インターフェースと実装関係がないオブジェクトの型注釈としても利用可能)
https://typescriptbook.jp/reference/object-oriented/interface

抽象クラス:インターフェース+実装を定義する
https://typescriptbook.jp/reference/object-oriented/class/abstract-class

// インターフェース
interface Greet {
  morning(): string;
}

class Ja implements Greet {
  morning(): string {
    return "おは";
  }
}
class En implements Greet {
  morning(): string {
    return "gm";
  }
}
// 抽象クラス
abstract class Greet {
  abstract morning(): string;
  public daytime() {
    return "hello" + this.strong();
  }

  protected strong() {
    // protectedはオーバーライドされる
    return "!";
  }
}

class Ja extends Greet {
  // 親クラスのprotectedにアクセス可能
  morning(): string {
    return "おは" + this.strong();
  }

  // publicはオーバーライドされる
  daytime(): string {
    return "こん";
  }
}
class En extends Greet {
  morning(): string {
    return "gm";
  }

  // protectedはオーバーライドされる
  strong() {
    return "!!!!!!!!!!";
  }
}

const j = new Ja();
console.log(j.morning());

const e = new En();
console.log(e.morning());
console.log(e.daytime()); // 親クラスのdaytime() + 自分のstrong()

Discussion