運の良かったことに、読もうと決めた時にたまたまAmazonで在庫があったため、ポチってすぐに入手出来た。届いたのは初版第2刷。今はもっと増刷かかっているのでは。
読者対象の広い本だと感じました。面白かったです。
著名なライブラリで時々見かけるテクニックで、本書では"「名前付き引数」コメント"というカタログ名が付けられている。本文中ではC++での利用例が載っているのだけど、自分の理解を深めるために別の言語で噛み砕いて考えてみる。
例えばJavaScriptで関数設計に失敗して、呼び出す時の引数順序を他人が読んでもサッパリ伝わらない、というシチュエーション。
function connect(timeout, use_encryption, callback) { } // 呼び出し部分だけ読んでもサッパリ分からない connect(10, true, function() {});
ベストは失敗した設計の引数も受け付けつつ、辞書やオブジェクトといったキーと値のペアで呼べるようにすることなんだろうけど、この手のリファクタリングは引数チェックに防御的なコードが増えたり、テストケースを書き足さなきゃいけないことが多い。
function connect(timeout, use_encryption, callback) { // 次のような呼び出し方法もサポートさせる // connect({timeout: 10, use_encryption: true, callback: function() {}); if (arguments.length === 1 && typeof arguments[0] === "object") { // 従来の実装を通るよう、さらに多くのチェック } // 従来の実装 }
そこでPythonの「名前付き引数」風のコメントで、手っ取り早い改善をして最低限の読みやすさを確保しようというのが、このテクニック。
// Pythonの connect(timeout=10, use_encryption=True, callback=lamda: pass) を模倣 connect(/* timeout_ms = */10, /* use_encryption = */true, /* callback = */function() {});
「仮引数timeoutの命名に失敗している部分は、先にコメント側で単位付きのtimeout_msって名前に直してしまおうぜ!」という指摘にも目から鱗で、この工夫は早速パクりたいと思った。
コメントの改善っていうのは、修正の影響でコンパイルがコケるリスクも無いし、真っ先に手を付けたいなぁ。
最近のツッコミ
参号館 日記(ariyasacca)