メインコンテンツまでスキップ

読み物:リーダブルコード

Dustin Boswell 、 Trevor Foucher 著、角征典 訳の「リーダブルコード」を読んだ。書かれたのが10年前で一部歴史を感じる部分もあったが大変参考になる本だった。

すぐに実践できるアドバイスも多かったけど、変数の命名や関数の抽出など、アルゴリズムやビジネスロジックを理解していないと良い命名ができない場合もあるよなあと思った。汎用的な知識も必要だ。

10年前に書かれた本であるからこそ見える最近の潮流もあった。例えば、コードの見た目を揃えよう、というアドバイスがあったが今ではその大部分を linter を使って解決できる。人気のあるライブラリは出来上がったコードがきれいになるように設計されている。時代とともにいろんな便利ツールが開発されているし、言語自体もどんどん改善がされてきているんだと感じる。 JavaScript の let と const が出てくる前に書かれた本なので var について書かれているが、今は let と const の動きのほうがわかりやすいのでそれが推奨されている。 最近では JavaScript の this の動きがわかりにくすぎるので無名関数を使って関数型プログラミングっぽく書くのが流行っている。型があるとバグが減るので TypeScript が流行ってる。

こういうのを見ていると、10年後には人間工学に基づいた最も多くの人にとってわかりやすい言語というのが出てこないかなと妄想してしまう。あるいは人間側が意図しているコードを GitHub Copilot のようなツールがブレずに書けるようにするための指示言語のようなものが出てきたりしそう。

最近思うのは、言語の文法的に There's more than one way to do it なのは脳内インタプリタが遅くなるので辛いなあということ。知らない文法ともなればまず調べるところから始めないといけないし。例えば JavaScript のアロー関数で return 省略していい場合とだめな場合があって、全部 explicit に return した方がわかりやすくない?って思う。

function myFunction1(param: string): string { return param }
function myFunction2(param: string): void { console.log(param) }

const confusingFunction1 = () => myFunction1('hello')
const confusingFunction2 = () => { myFunction2('hello') }
const veryBadFunction1 = () => myFunction2('hello')
const veryBadFunction2 = () => { return myFunction2('hello') }

const explicitFunction1 = () => { return myFunction1('hello') }
const explicitFunction2 = () => { myFunction2('hello') }

なので最近は値を返す全てのアロー関数で return を書いている。

あと JavaScript の {} にたくさんの意味があって混乱する。object literals の shorthand syntax が脳内で Python の set と混線してしまうのも混乱の理由の一つな気がする。

let a = 'foo', b = 42, c = {};

let myObject1 = { a, b, c }

let myObject2 = {
someFunction(parameter: string) { console.log(`${parameter}`) }
}

let myObject3 = {
[a]: 'bar',
}

let { a: baz } = myObject1

と、言いつつテンプレートリテラルは使いまくっているので、まあつまりは文法が読みやすいと感じるかどうかは慣れが8割くらいなんだろうという気がしている。