プログラミング言語でも誤解を生みやすいあいまいな表現がある
「能穿多少穿多少」はイントネーションによって「できるだけ厚着をする」と「できるだけ薄着をする」の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が読み取りやすく、保守しやすいコードにすることが必要です。