minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

タプル

誰しもが感じたことのある Java プログラマの葛藤。
「複数の値を返したい!」
Scala はこれを解決する。

def execute(url : String): (Int, String) =
{
  ...
  (code, value)
}

これは、code と value の組を返す。(Scala では return キーワードは省略できる)
受け取る方は、以下のようにする。

val (code, value) = execute(url)

もしくは…

val cv = execute(url)
val code = cv._1
val value = cv._2

正直 _1 みたいなのは美しくないね。
パターンマッチングを使うと Scala っぽい。

execute(url) match {
  case (200, value) => ...
  case (500, value) => ...
}

ちなみに、execute関数の最後にある文は、以下のコードの省略記法だ。

new Tuple2(code, value)

そう、もちろんタプルも特別な扱いではなく単なるオブジェクトである。

雑記

Java プログラマはこんな事を言うかもしれない。
「タプルなんか使わずに、CodeValue クラスを作ればいいじゃない」
確かにその通りだ。しかしそれ、面倒だとは思わないか?
他にも CodeUrl クラスや UrlValue クラスなど、いずれ山ほどのクラスが必要になるかもしれない。

Scala のモットーは「より手軽に。無駄なコードが無いように」だ(←自分流解釈では)。
確かに、CodeValue クラスを作るのに30秒しか掛からないかもしれない。
しかしその30秒間、自分が今まさにやろうとしていた事を中断してそのクラスを作る作業に没頭しなければならない。
これは開発する上で大きなロスとなる。

「実現したいことをシステムで表現するのに、より短い時間で到達する」ことを目標にすると
この短い時間はバカにはできない。
そして何より、この「わかりきった事をただコード化する」30秒が苦痛ではないだろうか?
もしそう思うなら、君にはまだ成長の余地がある。

Code と Value を一まとめにしたクラスに、何の意味があるというのか。
それは保守する対象にはなり得ない。
複数の値を返すという目的のために、仕方なく作ったクラス。
仕方なくクラスを作るくらいなら、いっそのこと作らない方がいい。

コードを書くこと、それは何かを生み出す(利益)と同時に
それを保守するというマイナス(損益)の働きもあるのだということを、常に頭に入れておこう。
システムの保守費用は、コードの量と連動している。
これは、どんなに言語が進化しても変わらない。