データ指向プログラミングを読んだ。
本書では、データ指向プログラミングと名付けられた、イミュータブルかつ汎用的なデータ構造で表現されたデータと 参照透過かつジェネリックな関数を使ったプログラミング方法を紹介している。
イミュータブルなデータと参照透過なメソッドを使ったプログラミングは普段から実践しており、 それらを使って柔軟なシステムを構築する方法を紹介している本書にはとても興味があった。 が、内容としてはかなりがっかりした。
本書では、データを表現するためにクラスではなくマップを使うことを前提において話が進んでいく。 つまり
data class Hoge(fuga: Int, piyo: String)
val hoge = Hoge(0, "")
を
val hoge = mapOf(
"fuga" to 0,
"piyo" to "",
)
で書こうという内容だった。 この方法は確かに柔軟になるかもしれないが、静的型付けによる安全性を完全に無視しており、かなりがっかりした。
書籍内でもこのことについて触れられていて、以下のように紹介されていた。
| OOP | DOP | |
|---|---|---|
| 安全性 | 高い | 低い |
| 柔軟性 | 低い | 高い |
| 汎用性 | 低い | 高い |
これは各要素を"高い"、“低い"のboolで表現しているDOPが良さそうに見えるだけで、 点数を付けるとDOPの安全性が-5000億くらいでトータだとOOPの方が良さそうだなと感じた (また、表では触れられていないが、フィールドアクセス時に保管が効かないので、コーディング中のストレスがとんでもないことになりそう)。
その他の感想:
+ JSON Schema便利そう
+ データの(デ)シリアライズが簡単なので、REPLが使いやすいのは良い
+ 汎用的な関数を作るという考え方は良さそう
- 複雑なJSON Schemaを書こうとすると辛そう。OOPならSpecificationパターンとか使える
- 色んなところでJSON Schema Validationが挟まりそう
- ポリモーフィズムで、実装忘れを静的に検知できないのが辛い