JavaScript の Plain Object (ただの) と、関数のみを利用して、Polymorphism を実現したい。
とはいえ Polymorphism の定義は人によって違うので、以下の仕様とルールを満たすものとしたい。
そもそもそれは Polymorphism ではない、あるいは意味をなさない、というような反論があればそれも歓迎。
- この世には Human と Dog の2種類の Animal が存在する。
- Animal はすべて age (年齢, 整数)というデータが紐づく。
- Animal からは normalizedAge という値が計算できる。
- Humanの場合、ageと等しい
- Dogの場合、ageの4倍である
- この世に存在する Animal データセットが与えられる
- JSON の配列である
- 配列の各要素はtype(種類)とageを持つ
- 上記のデータセットから、すべての Animal の normalizedAge の合計を出力せよ
- 結果は main 関数で出力する
- main 関数に if 文 (typeでの分岐)を書いてはいけない
- normalizedAge を計算する関数に if 文 (typeでの分岐)を書いてはいけない
- normalizedAgeにif文を書くということは、他の関数が追加されたときもそこにif文を書かなければならないことを意味する
- これは Polymorphism に反する
1_polymorphism.rb を参照のこと
ありがとうございます。
確かに JS の性質として plain object に関数をはやせるので、それでも良いのですが、個人的にはこの例を見ると逆に class を使ってもいいんじゃないかと思っちゃいました。
例えば itkr2ty さんの例だと getNormalizedage 関数がオブジェクトごとに生成されてしまうので、関数の宣言自体は外に出しておいたほうがパフォーマンス上よいかなと思います。この辺は class を使うと内部的には prototype を使う感じで1つの関数が共通で使われるのでわざわざ気にしなくてもよくなります。
逆の見方をすれば、パフォーマンスは些細な話であり、class を適切に使えない (例: immutable にしておいて欲しい class に setter 系のメソッドが生やされてしまうなど) ことによる技術的負債のほうが許容できないと見る向きもあるかもしれません。