Skip to content

Instantly share code, notes, and snippets.

@cesare
Last active August 29, 2015 14:00
Show Gist options
  • Save cesare/11343808 to your computer and use it in GitHub Desktop.
Save cesare/11343808 to your computer and use it in GitHub Desktop.
// http://qiita.com/t_uda/items/1969e09a970d71e4cfd6
function hoge(x) {
switch (true) {
case x < 0:
console.log(x + " は自然数ではありません.");
break;
case x === 0:
console.log("ここでは 0 は自然数です.");
break;
case x > 0:
console.log(x + " は正の数です.");
break;
default:
console.log(x + " は数ではないようです.");
}
}
/*
* switch-true-idiom-example.js にはリファクタリングの余地がある。
* 最大の欠点は、せっかく計算した結果を標準出力に出す以外のことができないところだ。
* たとえば、計算結果をファイルに書き出したいとか、もっと大きなデータ構造の一部に入れたいということは普通にあるだろう。
* この欠点を改善するため、値を計算する部分と、標準出力に書き出す部分を分離する。
*/
function hoge(x) {
console.log(_hoge(x));
}
function _hoge(x) {
var result;
switch (true) {
case x < 0:
result = x + " は自然数ではありません.";
break;
case x === 0:
result = "ここでは 0 は自然数です.";
break;
case x > 0:
result = x + " は正の数です.";
break;
default:
result = x + " は数ではないようです.";
}
return result;
}
/*
* switch-true-idiom-example2.js はわざとダサいコードを書いた。
* 本当は var result を冒頭で宣言する必要はない。
* 条件に一致したところで直ちに return すれば、もっと簡潔になる。
*/
function hoge(x) {
console.log(_hoge(x));
}
function _hoge(x) {
switch (true) {
case x < 0:
return x + " は自然数ではありません.";
case x === 0:
return "ここでは 0 は自然数です.";
case x > 0:
return x + " は正の数です.";
default:
return x + " は数ではないようです.";
}
}
/*
* さて、switch-true-idiom-example3.js をよく見てみよう。
* これは if で書くことができるのではないか?
* switch(true) をやめて、すべて if で書き直すとこうなる。
*/
function hoge(x) {
console.log(_hoge(x));
}
function _hoge(x) {
if (x < 0) {
return x + " は自然数ではありません.";
}
if (x === 0) {
return "ここでは 0 は自然数です.";
}
if (x > 0) {
return x + " は正の数です.";
}
return x + " は数ではないようです.";
}
@cesare
Copy link
Author

cesare commented Apr 27, 2014

http://qiita.com/t_uda/items/1969e09a970d71e4cfd6 を再読するに、switch(true) 肯定派の根拠の一つは、「条件式のアラインメントが揃う」という点にあるらしい。つまり x < 0x === 0 x > 0 の位置が揃っているので読み下しやすい、ということなのだろうと思う。

switch-true-idiom-example4.js を見ての通り、if でも同じことはできる。少なくとも、この例においてはそうだ。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment