本記事の立ち位置
この記事は「関数型プログラミング?ナニソレ?美味しいの?」と言うオブジェクト指向な人たちに
「食べてみなよ!美味しいから!ほら、一口。」と食べさせて
「あ、美味しいねコレ。店員さーんコレお願いしまーす。」と言わせたい。
そんな立ち位置の記事です。
本題
例として、Javaを使っていきます。
public static int plus10 (int val) {
return val + 10;
}
public static int minus5 (int val) {
return val - 5;
}
int input = 100;
int output = plus10(input);
output = minus5(output);
// output = 105
コードの善し悪しはさておき、いつものJavaって感じですし
100 + (10 - 5) = 100 + 5 = 105
です。簡単ですね。
しかし、
このコードoutput
が3つもあってキモい
そのように思ったあなた、どのようにリファクタリングしますか?
マジックナンバーを止めろとか言う話は脇に置いておくと、メソッドの引数にメソッドを渡すような形になりませんか?
int output = minus5(plus10(100));
「せめて、もうちょっと良いメソッド名にしてよ!」もっともな意見ですね。
public static int plus5(int v) {
return minus5(plus10(v));
}
// int output = plus5(100);
実はこれだけ
と言い切ってもいいでしょう。
さらっと補足すると
今までやったことは、
圏論で言うところの「射の合成」と呼ばれるモノで、
高校数学、高校物理では「ベクトルの合成」とか「力の合成」と呼ばれるようなモノです。