Open3
りあクト 感想

気になったポイント
継承よりも合成
それぞれメリデメがあるのでどちらが優れているという話ではないと思う。

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;
}

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