はじまる

適当な事を適当に書く

プログラミング言語における継承について

Golang には継承がない、という指摘について少し調べたメモ

元ネタ

なぜGo言語 (golang) はよい言語なのか・Goでプログラムを書くべき理由

Goには継承はありません。 そもそも継承はプログラミング言語にあまり必要ない機能だと思います。 継承が本当に有益なこともありますが、経験上大半のケースでは設計を手抜きするために継承が使われていて、結果長い目で見た際のreadabilityやmaintainabilityが著しく劣化してしまっていることが多いと思います。Composition over inheritanceやリスコフの置換原則のような基本的な原則が守られておらず(そもそも多くの人は名前すら知らない)、単に一部のコードをクラス間で共有するために継承が使われていて可読性が著しく低いコードもよく目にします。

そのため、そもそもプログラミング言語が継承をサポートしないというのは非常に良いデザインだなと思います。継承が非常に有益な場合も稀にあるもの分かりますが、大規模プロジェクトにおいては正しく使われない害のほうが確実に大きいです。

Composition over inheritance

継承をもちいた場合の構成、というくらいの意味

Composition over inheritance - Wikipedia

リスコフの置換原則

一般的なやつ

リスコフの置換原則 - Wikipedia

T 型のオブジェクト x に関して真となる属性を q(x) とする。このとき S が T の派生型であれば、 S 型のオブジェクト y について q(y) が真となる。

  • オブジェクト x がある
  • オブジェクト x の型は T である
  • オブジェクト x は 属性 q(x) をもつ
  • q(x) の導出は true である

型S が 型T の subtypeであるとき、以下も成り立つ

  • オブジェクト y がある
  • オブジェクト y の型は S である
  • q(y) の導出は true である