Static is Romantic

# はじめに

最近「staticメソッドはいいねぇ...人類が生み出した文化の極みだよ...」みたいなことを恍惚とした瞳で呟いては「何言ってんだこいつ」という目で見られているので、
`static`はなぜ素晴らしいのか頑張って言語化して伝えたいと思います。

プログラミング言語によって`static`という言葉が意味するところは微妙に違うかと思いますが、
最近もっぱらNode.jsを触っている生粋のJavaScripterである私はJavaScript基準で話します。

(おまけ: [Javaにおけるstatic](http://nobuo-create.net/java-beginner-21/))

# What is Static?

## とりあえずググってみる

> スタティック 【 static 】 静的 
>スタティックとは、あらかじめ与えられた状態などが変化しないことや、状況を通じて一貫して内容が維持されること。対義語は「動的」「ダイナミック」（dynamic）。
> プログラミングの分野では、プログラムの実行中を通じて状態が保持される変数などのことを、生成や破棄を繰り返す変数などと区別して「スタティック変数」などと呼ぶ。

[IT用語辞典](http://e-words.jp/w/%E3%82%B9%E3%82%BF%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF.html)より

うむ、よくわからん。



## JavaScriptのstatic

JavaScript的には現時点では`static`というキーワードはクラスのメソッドにだけつけられます。(2016-11-18現在)
[Mozillaさんもそう言っています。](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes/static)


じゃあ「JavaScriptの`static`なメソッドとは何よ?」ってなりますよね。
業務で使ってるPhpStorm君はクラスのメソッド内に`this`が出てこないと「これ`static`やで」と言ってくれますが、個人的にはそれでは不十分です。

だって例えばこんなの全然`static`じゃないじゃん。

```js

class Hoge{

  constructor(){
    this.hoge = "dynamic";
  }
  
  //PhpStorm君的にはstaticらしい
  static hogehoge(fuga){
    let now = new Date();
    return `${fuga}: ${now.toString()}`;
  }

}

```

いやいや、インプットが一定なのにコールするたびにアウトプットが変わるとか超dynamicですやん。
`static`と言い張るならこれぐらいしないと

```js

class Hoge{

  constructor(){
    this.hoge = "dynamic";
  }
  
  //これならstaticだね(ニッコリ)
  static hogehoge(fuga, timeString){
    return `${fuga}: ${timeString}`;
  }

}

```

というわけで何が言いたいのかといいますと、
**`static`なメソッドとは、インプットに対してアウトプットが定まっているメソッド**ではないかと思うわけです。

異論はあるかと思いますが、以降この記事ではこれを`static`なメソッドの定義としますので悪しからずご了承ください。

# なぜstaticは美しいのか

**テストしやすい**

以上。

ではあんまりなのでもう少し詳しく話します。

## dynamicなメソッドのテスト

例えばこんなクラスがあるとします。

```js

/**
 * @class Fuga
 * @property {boolean} isFuga
 */
class Fuga{
    
    /**
     * 
     * @param {boolean} isFuga
     */
    constructor(isFuga){
        this.setFuga(isFuga);
    }
    
    setFuga(isFuga){
        this.isFuga = isFuga;
    }

    /**
     * 
     * @param {boolean} isFugaFuga
     * @returns {boolean}
     */
    fugafuga(isFugaFuga){
        return this.isFuga && isFugaFuga;
    }
}

```

Fugaクラスのfugafuga()メソッドをテストしたいとします。
この時、インプットであるisFugaFugaがtrue/falseの2通りとメンバ変数であるisFugaがtrue/falseの2通りなので4通りのテストケースが考えられますね。
単体テストで。

## staticなら

staticメソッドにしたらこうなります。

```js
/**
 * @class Fuga
 */
class Fuga{
    
    /**
     * @param {boolean} isFuga
     * @param {boolean} isFugaFuga
     * @returns {boolean}
     */
    static fugafuga(isFuga, isFugaFuga){
        return isFuga && isFugaFuga;
    }
}

```

「いやいや、結局テストケース4通りですやん」と思いましたか？
まあ確かに単体テストの時はdynamicな時と大差ないんですけど、これが結合テストとかになってくると変わるんですよ。

**dynamicなメソッドだと「このメンバ変数どこかで意図せず上書きされたりしてないだろうな」という恐怖との戦いになるんです。**

その点`static`メソッドはインプットの値に気をつければいいので、安心感があるのです。

## staticがもたらすもの

そんな感じで`static`の魅力にとりつかれた私は、メソッドを極力`static`で実装するようになりました。
そうすると、これは経験則ですが、一つ一つのメソッドは小さくなっていきます。

一つ一つが小さくて、インプットに対してアウトプットが決まっているメソッド => やったねテストがしやすいよ!
これは私の精神衛生に大きく寄与しています。
あとちゃんと数えたわけではありませんが、バグの数も減ったかなぁと思います。

という感じでJavaScriptのメソッドをせっせと`static`にしている時に気がついたのです。
**これって今話題の関数型プログラミングに通じるんじゃね?**


# そして僕はエリちゃん(Elixir)に恋をする

**この一言を書きたいがためにこの記事を書きました。**

[Elixir](http://elixir-lang.org/)という最近話題になってるらしいプログラミング言語があります。
私は個人的にエリちゃんと呼んでいます。心の中で。

いわゆる関数型言語というやつで、**メソッドはstaticなものしか書けません**。
ていうか **クラスなんて概念自体存在しません。(モジュールならあるけどね)**。
さらには**while文もfor文も許さない**という生粋のJavaScripterである私には衝撃のストロングスタイル。(関数型言語にはよくあることなんでしょうか...?)

そんな感じで、関数型プログラミングをちゃんとやったことのない私にエリちゃんは高嶺の花なわけですが、
それでも心惹かれるのはstaticなメソッドばかりで構築されてちゃんとテストされたプログラムというのはすごく安心感がありそうだからでしょう。
エリちゃんは最初はとっつきづらいけど、ずっと一緒にいると心を安らかにしてくれるツンデレなのです。多分。

関数型プログラミングというスタイル自体がまだまだ主流にはなりきれてない気がしますし、周りにエリちゃんの話をしても「何それ?」みたいな反応ばかりですが、自分でも勉強しつつ布教していくことで皆の心の安寧に寄与したいと思う今日この頃です。

エリちゃんはいいぞ

# 付録

Elixirに興味を持たれた方はとりあえずこれらの記事を見るのがいいかと思います

- [[翻訳] Elixir - 次に来る大物Web言語](http://qiita.com/HirofumiTamori/items/0dfdbada30c7d8f183fd)
- [Elixir試飲録](https://ubiteku.oinker.me/category/elixir%e8%a9%a6%e9%a3%b2%e9%8c%b2/)
- [最近話題のWeb言語 Elixirのご紹介](http://dev.classmethod.jp/server-side/web_language_topic-elixir_introduction/)