Scala入門中です。大したことは書けないですが、勉強したことを整理するために備忘録的に書きます。
何か間違っていることや補足したい点があったら優しくマサカリを投げてください。
今回はメンターをやって下さっている方に教わった話を軽くまとめます。
汎用構文を避けたいきもちになった経緯
Scala入門した初期に学ぶforのループ処理やmatchを使ったパターンマッチは、簡単に書けるしあらゆる場面で使える。
とても便利だな〜Scalaわかってきた気がするな〜という気持ちで多用していたら、ある日メンターから「汎用的な構文は場合によっては避けた方が良いという考え方がある」と言われた。
なぜ汎用構文を避けた方が良いのか
汎用構文のデメリット
何をしたいのかをコードを読んで理解しようとした際に、構文自体が汎用的であるが故にちゃんとコードを読まないと理解出来ない。
さらにパターンマッチやループ処理を使いすぎるとネストが深くなってコードの見通しが悪くなることも。
避けることによる嬉しみ
汎用的な構文を避けて、変わりに fold
map
filter
などの意図を明確に表す高階関数を使うとコードを深く読み込まずとも関数の種類でどんなことがやりたいのかなんとなくわかる。
(もちろん関数の知識があることが前提だが)
さらに目的に特化した関数を使っていて処理を自前で組み立てているわけではないのだから、当然コード量も減る。
具体例
パターンマッチをfoldにしてみる
anOptionValue match {
case Some(v) => function(v)
case None => default
}
anOptionValue.fold(default)(function)
Optionのfoldが何をしてくれるのかは以下の通り。
fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B
Returns the result of applying f to this scala.Option's value if the scala.Option is nonempty.
forを変えてみる
※後日更新したい
最後に
汎用的な構文を使うことが必ずしも悪、ということではないと思う。
他によりふさわしい関数が居るならその子を使ってあげようと言う話であって、逆にそういう子がいないときには汎用的な物を使って自前で実装する必要があるという認識。
ということで、そういった関数をちゃんと理解して使っていくことをこれからは積極的にやりたい所存。