はじめに
最近「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に興味を持たれた方はとりあえずこれらの記事を見るのがいいかと思います