⛰️

(改訂版)三項演算子は本当に読みにくいのか。TypeScript で分かった 後置 else if メソッド の効果

に公開2

Discussion

shoheikunishoheikuni

主旨は理解できる。
しかしif無しにelseという言葉が出てくるのが変だし英文法的にも変だ。
elseIfではなくbutIfにするとよいのでは。

// The value will be A. But if x == 0, then it will be B.
const  value =_( "A" ).butIf( x == 0 ).then( "B" );

また、メソッドチェーンでelseIfを繋げられるのが変なので、まだ改良できそう。

// ナニコレ
const  value =_( "A" ).elseIf( x == 0 ).elseIf(y == 0).elseIf(z == 0).then("B");
otnotn

三項演算子は本当に読みにくいのか
(中略)
いやいや、三項演算子は読みにくいだろう、と思われた方は多いと思います。

という記述に新鮮な驚きを感じました。自分で今までそんなことを思ったことないし、周りでそう言ってる声も聞いた事がない。QAサイトにCを勉強中の人の「?って記号はどういう意味ですか?」的な質問を見て、「演算子くらい全部覚えろよ」と思ったことはありますが。つまり「どの言語でも、その言語に慣れてない人に読みにくい構文はいろいろあるよね」の中の1つで、その言語の初心者を脱した人であればそんなこと言わないだろうと。

Cの三項演算子の起源はおそらくAlgol60のif式x = if 条件 then 値1 else 値2;で、AlgolからCまでの言語数代を経てどこかで記号にしたいが為にそうしたのでしょう。ifに該当する記号がないのは「無くても構文解析できるから」と言う理由で、読みやすさ観点ではなかっただろうと思います(特に調べておらず推測です)。

Pythonの条件式は読みにくいというのには同意です。これはおそらくPerlの後置if(if修飾子)をヒントにしたのでしょうが、Perlの後置ifは式ではないので値を持たない。また式にする段階で else を追加したかったので変な形になってしまったのかと思います。Cのような記号の構文にしたくなかったのなら、最初に戻ってAlgolのif式と同じ形式にすれば大変分かり易いと思います。が、Pythonの設計思想はプログラムの書きやすさ・読みやすさより重視されているようなので、おそらく何らかの設計思想に従ってAlgolのif式の形式は採用できなかったのではないかと思っています(特に調べておらず推測です)。

つまり、後置ifもどきを、if式/3項演算子の代替に使ったPythonの方針は失敗だったのではないかと思います。まあ、Python設計者からすると成功なのでしょうが。繰り返しですが、普通にif/then/elseにしなかった理由が分からない。
Rubyだと、C風のx = 条件 ? 値1 : 値2も使えるし、Algol風のx = if 条件 then 値1 else 値2 endも使えるし、またPerlと違って後置ifも値を持つのでx = (値 if 条件)も可能です(代入と後置ifの優先度の関係で括弧が必要)。後置ifは条件が偽の時の値はnil固定なので使える場面が限定的ですが。

TypeScriptは深いところまで知らないので、その部分はほとんど読み飛ばしてますが、三項演算子のような制御構造を持った構文を「引数を全部評価してからメソッドを呼び出す」ことで代替するのは、お書きのように使える場所が限定されるので、嬉しい人は少ないのではないかと思います。また、「主従関係」というのは三項演算子を使うケースのごく一部だと思うし。
三項演算子の一部だけ書き換えるなら、全部三項演算子のままの方がずっと良いと思います。