型による条件分岐について

はてブのコメントにはポリモーフィズムすべきだ、型による分岐したら負けだ、みたいなコメントが散見されるけど、それはJavaなど静的型付けのクラスベースオブジェクト指向言語の話であって、JSはそうではない。TSはクラスベースのような顔をしてるが正体はJSなので、やはりインターフェース継承とメソッドオーバーライドによる多態性で条件分岐を隠蔽するような言語ではない。

qiita.com

Javaのようなクラスベース言語でもサブタイプ多相には限界がある。例えばドメインエラーを型で表現するということはJavaでも一般的に行われると思うけど、Webアプリケーションならば、そのドメインエラーの型によってHTTPステータスコードを切り替えなくてはならないだろう。この分岐をサブタイプ多相でやるとドメイン層のエラーオブジェクトが、自分がどのHTTPステータスコードにマップされるか知ってなくてはならない。HTTPの知識がドメイン層に入ってしまってはドメインとは・・・となってつらい

ドメイン外の挙動を分離するためにDIで制御の反転というテクニックがあるが、エラー処理如きでそれは普通に地獄だし、だったら素直に型でパターンマッチして分岐したほうがシンプルで分かりやすいわけですよ。Scalaではドメイン層の処理結果をEitherで返して、Leftだったら型を見てレスポンスのステータスコードを決定するような処理をコントローラメソッドに書いたりする。Javaでもthrowされた例外クラスの型でcatch対象選べるけど、あれも型による分岐の一種であろう。

ポリモーフィズムが常に万能というわけではないし、JSは関数オブジェクトを用いたり、コールバックとかイベントという仕組みで分岐できるので、あえてポリモーフィズムを使う必要もあまりない。

これは私も不正解にします。

「地球が回る」という回答は、太陽の位置が変化する理由の説明です。すなわち太陽の位置が時間と共に西へ移動するのは何故か?という問いであれば正しいでしょう。しかし、ここで問われているのは影の位置が変化する理由であって、光源の位置が変化する理由ではありません。

  • 地球が自転している→太陽の位置が変化する→影の位置が変化する

が論理の筋立てであるが、

  • 地球が自転している→影の位置が変化する

では論理が1つ飛躍してしまっている。

私は地球が回っていると答える側の子だったのだけど、このような論理の飛躍は私のようなタイプの悪いところです。論理を筋道立てて説明することは科学の学習において重要なポイントなので、自分の判断で途中の説明を省略してしまうのは褒められたことではありません。

まぁ、教師側の採点基準が「学習したことを使って書きましょう」というのは情けない話ではあるが、教科ごとのプロフェッショナルではない小学校教師にそこまで求めるのも酷な話かもしれない。