読者です 読者をやめる 読者になる 読者になる

だらだらしてたいなぁ

ずっとゲームしながらだらだらしてたいけど、がんばってブログ書いてみた

scalaをお仕事で使う時の3つの心得

scala プログラミング

・型を書け!
・名前を付けろ!
・合成しろ!

型を書け!

「は?型推論あるのにわざわざ型なんて書かなくていいし!」と思いましたか?
では保守を任されて緊急でソースを理解したい時にこのようなコードだった場合はどうでしょう。

//XXとYYはどこか別の場所で定義されている
class AAA[A <: XX, B <: YY] {
  def f(a:A,b:B) = a.xx + b.yy
}

「戻りの型くらい書いとけ、ばかやろぅ」と言いたくなりましたね。それが普通の反応です。

class AAA[A <: XX, B <: YY] {
  def f(a:A,b:B):String = a.xx + b.yy
}

戻り値の型がある場合と比べて見てください。コードの読みやすさが全く違います。このようにコーディングする際にほんのひと手間掛けるだけで、保守時のコストが大幅に削減出来ます。
保守のコストを削減する事によるメリットは開発全体で見ると計り知れません。開発時はせいぜい一人か二人しかコードを見ませんが、保守は長期に渡って続き複数の人がコードを読むのですから。

名前を付けろ!

scalaだとclosureが使えるのでついつい無名関数を多様しがちです。でも、コーディングしている時はどういう処理か分かっていたとしても、半年後に見た時に覚えていられますか? ぼくは無理です。
無名関数では無く、きちんと名前を付ける事によって、いつ、誰が見ても処理が分かりやすくなります。

//×
saraly map (_ + 5000)
//○
val rentSupport:Int => Int = _ + 5000
saraly map rentSupport

合成しろ!

scalaに慣れてくると、mapをチェーンしたりしてどんどんコードが横長になってきます。ワンライナーで書けるのが楽しいんですよね。気持ちは良く分かります。
だがしかし、mapをチェーンするという事はループが沢山実行され、しかも型も名前も書きません。ダメ過ぎです。mapがチェーンし始めたら、関数合成でmapを最小限に減らしましょう。

//×
Some(140000) map (_ + 5000) map (_ - 80000)
//○
val rentSupport:Int => Int = _ + 5000
val dormFee:Int => Int = _ - 80000
val salaryCalc = rentSupport andThen dormFee
Some(140000) map salaryCalc

まとめ

この心得は、ぼくがscalaをお仕事で使ってきて悟った事を書いています。scalaのコードが分かり難いと言われるのは、型も名前も無いコーディングスタイルが起因しているのではないでしょうか。

またこの記事は、ある程度の人数で開発し保守を行うプロジェクトを前提にしています。プロトタイプのような使い捨てコードで、保守よりも開発スピードを優先する場合は、型も名前もぶっ飛ばしてコーディングしてください。

だって、scalaの語源であるスケーラブルはどのような開発(スタイル)でも柔軟に対応出来ると言う意味でもあるのですからね。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!