『リーダブルコード』有害説
はじめに
世間的に「良書」「名著」と高い評価を受けている(気がする)書籍をぶん殴る記事。
本文
The Art of Readable Code CHAPTER ONEより引用
But a lot of times, it’s a tougher choice. For example, is this code:
return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);better or worse than:
if (exponent >= 0) { return mantissa * (1 << exponent); } else { return mantissa / (1 << -exponent); }The first version is more compact, but the second version is less intimidating. Which criterion is more important? In general, how do you decide which way to code something?
↑を見ると初心者は「少なくともこのどちらかは良い書き方なのだろう」と思ってしまうと思います。このコードをC++と解釈するとして、どちらの書き方もintの幅が32bitだったとしてexponentの値が31以上や-31以下であった場合UBとなってしまうし、何よりこの処理は標準関数にstd::ldexpがあるので自前で実装するのは正しくないのでダメですね。『リーダブルコード』を良書や名著と呼ぶのはちょっと違う気がしています。
『リーダブルコード』が可読性について説明/解説した本であることを理解しコードの内容部分はさらっと流す読み方をすれば問題ないとは思いますが、初心者の読者にそれを要求するのは酷だと思うし誤読される可能性は普通にありますね。参考にすべきでないコードが堂々と掲載されているのは褒められたものではないと思っています。
『リーダブルコード』は書かれている内容は大意で正しいとは思っているので初心者に対してはtrapとなりうる個所は見直して2.0を出してくれると良いと思います。
おわりに
おわりです。
Discussion
かなり根本的な部分でズレている気がする
「前提条件があるコード = 悪」としてしまうとたいていの処理は書けないので、それはコード例が悪いのではなくて「プログラミングをする以上、あらかじめ入力に問題がないかチェックする処理を加える癖をつけろ」というまた一つの作法を教えるべきなのでは
コメントありがとうございます。
すいません、ひょっとして「どちらの書き方も
intの幅が32bitだったとしてexponentの値が31以上や-31以下であった場合UBとなってしまう」のことを言われていますか?この問題は容易に回避可能ですし「たいていの処理は書けない」ということであれば能力の問題だと思います。
あと「何よりこの処理は標準関数に
std::ldexpがあるので自前で実装するのは正しくないのでダメ」とも書いているのでそちらも見てね。わざと別の意味になるように切り取ってつなぎ合わせないでください
私の記事にコメントをしてきたときもそうでしたが、あなたは自分が正しいと主張するためにストローマン論法で相手を無能・低能であると攻撃する、その悪質さに一番大きな問題があります
私が言っているのは、あなたが「このコードはこの条件でしか動かないからダメ」と記事に書いたことに対して、
(コンピュータの仕組み上条件があるのは当然のこと)
(作法を指摘しておきながら一番初歩的な作法にノータッチ)
ということです
しかも、この問題が容易に回避可能だから問題ないとあなたが断言した以上、それを『リーダブルコード』の問題点として取り上げて叩いたあなたの側に問題があることは明白だと思いますが、何か真っ当な反論はありますか?
意味を捻じ曲げたり、話を逸らしたりしないのであればいくらでもお話できますが、ストローマン論法は受け付けておりません
書き方の作法を教えるためのコード例に「同じ機能が既に標準にあるのに実装するなんて! こんな悪質なコードを参考にしてはいけない!!」と主張するわけですね
それをイチャモンと言います
書き方の話をしているのだから、実際にその処理をソフトウェアにおいて必要とした時の最善のツールをおすすめしているわけではないことは、あなた以外のほぼ全てのプログラマにとっては自明の理です
結局この記事全体が終始ストローマン論法であり、有害なのは『リーダブルコード』ではなく、あなたの言説全般だということがはっきりわかる内容でした
ある意味誰を避ければいいか一目でわかる良記事と言えなくもないですね
Geminiと会話してみたので見てみてね。
「バリデーションを書くという作法を別で教えれば十分教育用途として問題ない」を「同時にバリデーションを書いて混乱させるべき」に置き換えるのやめてもらっていいですか
前にも書きましたがストローマン論法がひどいです
Geminiとの会話を続けてみました。会話の途中にジャンプする方法がわからんのでお手数ですが「めんくりさんの新たなコメントの投稿がありましたが」で検索してね。