見出し画像

プログラミング言語でも誤解を生みやすいあいまいな表現がある

「能穿多少穿多少」はイントネーションによって「できるだけ厚着をする」と「できるだけ薄着をする」の2通りの意味があるらしい。

「喜欢一个人」は「好きな人がひとりいる」と「ひとりでいることが好き」の2通りの意味があるらしい。文脈なしにこのフレーズだけ見たら誤解しそう。

自然言語ではあいまいな表現がよくあります。しかし、プログラミング言語では仕様がきっちりと決まっていて、あいまいな表現はないものとされます。

でも、プログラミング言語でのソースコードの表現は、インタープリタやコンパイラが読むだけではなく、そのソフトウェアを保守する人間も読みます。いまや生成AIもソースコードを読みます。そのときに誤解を生みやすい表現がありえます。誤解をしないまでもちょっと考えないと理解できないコードは読む人に負荷を与えるのでよくないです。

チームで保守するコードは書く頻度よりも読む頻度のほうが圧倒的に多いので、人間や生成AIが理解しやすいコードを書きましょう。

JavaScriptのArrayコンストラクタは、引数にArrayの要素を直接指定することもできるし、引数で要素の数を指定することもできちゃいます。2種類の使い方があります。

new Array(5, 6, 7) // => [5, 6, 7]
new Array(5, 6) // => [5, 6]
new Array(5) // => [undefined, undefined, undefined, undefined, undefined]
new Array(5.5, 6.5, 7.5) // => [5.5, 6.5, 7.5]
new Array(5.5, 6.5) // => [5.5, 6.5]
new Array(5.5) // => RangeError: Invalid array length
new Array("5", "6", "7") // => ["5", "6", "7"]
new Array("5", "6") // => ["5", "6"]
new Array("5") // => ["5"]

2種類の使い方の違いは意識していれば明瞭ですが、たまに気づかずに誤解を生みます。

const arr = new Array(
    5,
    6,
    7,
);

上記コードをデバッグの過程でデータを絞るために以下のように編集したらハマります。

const arr = new Array(
    // 5,
    6,
    // 7,
);

コンピュータが人間の意図を理解できなかったという意味で「誤解」です。人間も言語仕様にだまされたという意味で「誤解」です。

こういう事態を防ぐために、要素を直接指定してArrayを作成したい場合は普通は

const arr = [
    5,
    6,
    7,
];

と書きます。リテラル記法(Array literal notation)といいますが、これなら誤解の心配がないです。

プログラムコードは動けばよいのではなく、人間や生成AIが読み取りやすく、保守しやすいコードにすることが必要です。

いいなと思ったら応援しよう!