品質の高いJavaScriptを書くために

JavaScript製ソースの品質を上げるために

 現在、私は会社でフロントエンド開発に携わっている(ペーペーの)プログラマである。 先輩からコードレビューを受け続ける中、また自分でググったり本を読んだりする中で知った、いくつかのコツを書き溜めておこうと思う。

品質の高いコードとは

開発者側から見た品質と、ユーザ側から見た品質とでは観点が異なる。

開発会社側にとって品質が高いソースコードとは、コストを最小限にするソースコードである。 ウォーターフォールに従うと設計→開発→テスト→保守→運用という流れを追うことになる。 この中で開発担当者は、後工程のテスト, 保守, 運用フェーズ其々のコストを考慮してソースコードを書かねばならない。 一方、ユーザー側からするとサクサク動くことが重要である。 従って以下のような観点となる。

テストがしやすい

テストのしやすさを測るには主に2つの観点がある。

  • 疎結合であること
  • シンプルであること

疎結合である

シンプルである

詳しくは脚注の参考図書が非常に勉強になる。 具体的にテストが容易なソースコードの事例が多く挙げられている上、「関数の中に、オブジェクトがいくつインスタンス化されているか」など定量的に把握しやすい観点が紹介されており、読んですぐに実践できる点が良い。

www.oreilly.co.jp

保守がしやすい

原則として、実装担当者が保守を担当するとは限らない。そのため、誰が読んでも理解しやすいことが重要である。 保守のしやすさを測る観点は以下の通りである。

コメントをつける

例を挙げておく。プログラマたるものコメントをきちんと残すことは必須である。本やブログにタイトルがあると理解の助けになるのと同様に、ソースコードもコメントに処理の概要が書いてあると理解の助けとなる。

/** @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 スタイルガイド - 日本語訳 - アットウィキ

命名がわかりやすい

バイブルを読むべし。

www.oreilly.co.jp

ショートハンドをやたらに使わない

記述量が減る点は良いが、読みにくくなるので省略形はほどほどに。ショートハンドを覚えるのには以下が参考になる。

あなたが知らないJavaScriptの便利すぎるショートハンド19選 - WPJ

条件分岐が多すぎない

ネストの深さは闇の深さと同じなのだそうです。

ネストの深さは闇の深さ - Qiita

循環的複雑度といって、一つの処理の中で条件分岐がいくつあるかで複雑さを計れます。 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つのテクニック | マイナビニュース

随時更新予定。