品質の高いJavaScriptを書くために
JavaScript製ソースの品質を上げるために
現在、私は会社でフロントエンド開発に携わっている(ペーペーの)プログラマである。 先輩からコードレビューを受け続ける中、また自分でググったり本を読んだりする中で知った、いくつかのコツを書き溜めておこうと思う。
品質の高いコードとは
開発者側から見た品質と、ユーザ側から見た品質とでは観点が異なる。
開発会社側にとって品質が高いソースコードとは、コストを最小限にするソースコードである。 ウォーターフォールに従うと設計→開発→テスト→保守→運用という流れを追うことになる。 この中で開発担当者は、後工程のテスト, 保守, 運用フェーズ其々のコストを考慮してソースコードを書かねばならない。 一方、ユーザー側からするとサクサク動くことが重要である。 従って以下のような観点となる。
テストがしやすい
テストのしやすさを測るには主に2つの観点がある。
- 疎結合であること
- シンプルであること
疎結合である
シンプルである
詳しくは脚注の参考図書が非常に勉強になる。 具体的にテストが容易なソースコードの事例が多く挙げられている上、「関数の中に、オブジェクトがいくつインスタンス化されているか」など定量的に把握しやすい観点が紹介されており、読んですぐに実践できる点が良い。
保守がしやすい
原則として、実装担当者が保守を担当するとは限らない。そのため、誰が読んでも理解しやすいことが重要である。 保守のしやすさを測る観点は以下の通りである。
コメントをつける
例を挙げておく。プログラマたるものコメントをきちんと残すことは必須である。本やブログにタイトルがあると理解の助けになるのと同様に、ソースコードもコメントに処理の概要が書いてあると理解の助けとなる。
/** @module color/mixer */ /** The name of the module. */ export const name = 'mixer'; /** The most recent blended color. */ export var lastColor = null; /** * Blend two colors together. * @param {string} color1 - The first color, in hexadecimal format. * @param {string} color2 - The second color, in hexadecimal format. * @return {string} The blended color. */ export function blend(color1, color2) {} // convert color to array of RGB values (0-255) function rgbify(color) {} export { /** * Get the red, green, and blue values of a color. * @function * @param {string} color - A color, in hexadecimal format. * @returns {Array.<number>} An array of the red, green, and blue values, * each ranging from 0 to 255. */ rgbify as toRgb }
/** Class representing a point. */ class Point { /** * Create a point. * @param {number} x - The x value. * @param {number} y - The y value. */ constructor(x, y) { // ... } /** * Get the x value. * @return {number} The x value. */ getX() { // ... } /** * Get the y value. * @return {number} The y value. */ getY() { // ... } /** * Convert a string containing two comma-separated numbers into a point. * @param {string} str - The string containing two comma-separated numbers. * @return {Point} A Point object. */ static fromString(str) { // ... } }
詳しくは、以下を参照すると良い。
JSDocコメント - Google JavaScript スタイルガイド - 日本語訳 - アットウィキ
命名がわかりやすい
バイブルを読むべし。
ショートハンドをやたらに使わない
記述量が減る点は良いが、読みにくくなるので省略形はほどほどに。ショートハンドを覚えるのには以下が参考になる。
あなたが知らないJavaScriptの便利すぎるショートハンド19選 - WPJ
条件分岐が多すぎない
ネストの深さは闇の深さと同じなのだそうです。
循環的複雑度といって、一つの処理の中で条件分岐がいくつあるかで複雑さを計れます。 1~10だと、将来的に誤った変更が行われる可能性は5%くらいらしいです。 Project Metrics Help - Complexity metrics
jscheckstyleで循環的複雑度を計れるらしいです。
GitHub - nomiddlename/jscheckstyle: Checkstyle for javascript
体裁が整っている
- インデントは揃っているか
- タブとスペースが混合していないか
ESLintなどを使って体裁はチェックできる。導入すべし。
入門!JavaScriptの構文チェックが捗るESLintの設定と使い方 - WPJ
ESLint - Pluggable JavaScript linter
実行速度が早い
画面の描画が早いこと、イベント一つ一つの処理が早いことが性能を高める。 この辺はテクニックが膨大にありすぎるので、適当にググった参考URLを貼りまくっておく。自分でも全然消化できていないので、少しずつ吸収していきたい。
if文とswitch文の書き分けにいつも迷うのでまとめてみた - Qiita
JavaScript・jQueryの改修・高速化のためのメモ - Qiita
Googleが示すJavaScriptを350倍高速化する秘訣 - ぼちぼち日記
JavaScriptのループはどれが一番高速なのか - Qiita
JavaScriptを高速化する6つのテクニック | マイナビニュース
随時更新予定。