素晴らしき元ネタ
「配列のすべての要素が条件を満たすならtrueを返す」関数を定義するとき、空の配列を渡したらfalseを返すかtrueを返すかが、良いプログラマかどうかの一つの境目だ
筆者のスタンス
true一択派も、仕様による派もどちらの主張も間違いとは言い切れないし、この回答を持って一概に「良くないプログラマ」であるとか、センスの有無を見出すのはちょっと言いすぎだし言葉が強すぎるかなぁ……
もっとHRT(謙虚、尊敬、信頼)意識していこうぜ……
ただし、falseに揃えるのはちょっとアンチパターンだろうとは思う。1
注意
すべての主張を見たわけでもないので、認識の偏りや独自解釈などが含まれているかもしれません。
あくまで、「筆者はほんとになんとなく考えたんだなぁ」ぐらいの優しい気持ちで見ていただけると幸いです。
true一択派の主張を考える
実はtrue一択派も主張が別れている部分があって、
- 仕様云々でなく、単純に「配列のすべての要素が条件を満たすならtrueを返す」という要件の関数を作れってことでしょ?派
- どの仕様でも、trueにすべきでしょ。派
がいるっぽい。
ぶっちゃけ、元のツイートを見ると「どっちとも読めるのでなんとも……」といった感じ。
- (単純に)「配列のすべての要素が条件を満たすならtrueを返す」(という要件の)関数
- 「配列のすべての要素が条件を満たすならtrueを返す」(というフォーマットで書かれた要件の)関数
みたいな感じだろうか。
1番の主張を考える
単純に「配列のすべての要素が条件を満たすならtrueを返す」という要件の関数であれば、異論なくtrueで良いと思う。
まぁ正直いうとこれに関しては、感覚的に「これならtrueで書くなぁ……」ってぐらいのふわっとした感じなので、理由は説明しづらいところ。
頑張って言語化すると「0個の要素を確認して0回判定がtrueとなっているからすべての要素が条件を満たしとる言えるな」ぐらいの認識。2
2番の主張を考える
いろんな要件を考えてみたけど、思いつく限りではどれもtrueがしっくり来る。
それ以外の場合でも、基本的に関数ごとに書き方・考え方が統一されていないのは問題を引き起こす元なので、例外的にfalseとするような形で実装するのは避けたほうが良いと思う。
正直なところ処理的にはfalseが都合が良い場合でも、trueで返す形に設計を見直したほうが良い気がしてる。
仕様による派の主張を考える
この派閥であっても、多くの人は 「(単純に)「配列のすべての要素が条件を満たすならtrueを返す」(という要件の)関数」 を実装する場合、trueにするのではないかなと思う。
なのでこの派閥の主張は、true一択派の「どの仕様でも、trueにすべきでしょ。派」と対比して考えた方が良さそうだ。
この派閥の主張について端的に言うと「いや、そう言ってもfalseの方が良いパターンは存在するんじゃない?」に近いのではと思う。
この考えはわからんでもない。
ここまで色々な要件を考えては見たが無限に存在する要件のうちの数例を見ただけであり、例外がないとも言いきれない。3
そもそも「falseの方が良いパターンが存在しないこと」を証明するのはまさしく悪魔の証明だ。無理である。
まとめ
各主張はそれぞれの視点で一定の正当性があるんじゃないかなと。
まぁ「ほとんどの場合はtrueに倒したほうがいいよ~」ぐらいのふわっとした感じでとどめておいて、もし仮にfalseとしたい場合は特殊な例として対処する感じがちょうどいいところな気がしてる。
とりあえずコメントとかドキュメントに残しておけばトラブルは少なそう。
今回ここまで話が大きくなってしまったのは、
- 「配列のすべての要素が条件を満たすならtrueを返す」関数というやや解釈が分かれてしまう記載
- 「良いプログラマかどうかの一つの境目」というちょっと強めの言い回し
が元なのかなと思う。
誰だって「お前はプログラマの資質がない!」みたいに言われたらムッとするし腹も立つだろう。
とはいえ、元ツイートを批判する気もあまりなくて、議題としてはなかなかそそられる内容だし議論も(傍から見てて)なかなか面白かったと思う。
今回のように議論を呼ぶプログラミング系のツイートは結構好きなので、たまにはこういうのも良いなぁと思いました。まる。4