LoginSignup
4
2

More than 5 years have passed since last update.

はじめに

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

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

(おまけ: Javaにおけるstatic)

What is Static?

とりあえずググってみる

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

IT用語辞典より

うむ、よくわからん。

JavaScriptのstatic

JavaScript的には現時点ではstaticというキーワードはクラスのメソッドにだけつけられます。(2016-11-18現在)
Mozillaさんもそう言っています。

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

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


class Hoge{

  constructor(){
    this.hoge = "dynamic";
  }

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

}

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


class Hoge{

  constructor(){
    this.hoge = "dynamic";
  }

  //これならstaticだね(ニッコリ)
  static hogehoge(fuga, timeString){
    return `${fuga}: ${timeString}`;
  }

}

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

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

なぜstaticは美しいのか

テストしやすい

以上。

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

dynamicなメソッドのテスト

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


/**
 * @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メソッドにしたらこうなります。

/**
 * @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という最近話題になってるらしいプログラミング言語があります。
私は個人的にエリちゃんと呼んでいます。心の中で。

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

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

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

エリちゃんはいいぞ

付録

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

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2