Open3

りあクト 感想

arinc0arinc0

気になったポイント

継承よりも合成

それぞれメリデメがあるのでどちらが優れているという話ではないと思う。

arinc0arinc0
interface Shape {
  readonly name: string;
  getArea: () => number;
}

interface Quadrangle {
  sideA: number;
  sideB?: number;
  sideC?: number;
  sideD?: number;
}

class Rectangle implements Shape, Quadrangle {
  readonly name = 'rectangle';
  sideA: number;
  sideB: number;

  constructor(sideA: number, sideB: number) {
    this.sideA = sideA;
    this.sideB = sideB;
  }

  getArea = () => this.sideA * this.sideB;
}

const rect = new Rectangle(6, 5);
console.log(rect.getArea());

この実装の違和感の言語化

Shape

shape インターフェースは、「図形」という概念を表すものだが全ての図形が面積を持つとは限らない。
線や点も図形だが面積を持たない。

  • Shapeインターフェースはnameだけを持ち、図形の名前だけを持つのが良さそう。
  • 面積が計算できるというインターフェース、AreaCalculable のようなインターフェースがgetArea()を持つのが良さそう。
  • そもそも命名が良くない、PlaneFigureなどであれば面を持つ形状であることを示し面積が計算できることを示すことができそう。

Quadrangle

Quadrangle インターフェースは、「四辺形」という概念を表すものだがsideB以降の辺がnullableである。
四角形という概念は4つの辺を持つことが前提であるため、辺が一つしかない場合はそもそも四辺形とは呼べない。

interface Quadrangle {
  sideA: number;
  sideB: number;
  sideC: number;
  sideD: number;
}
arinc0arinc0

継承より合成が優れているような表現に続いてこの実装を見せられると「本当か?」と思ってしまいそう。