by shigemk2

当面は技術的なことしか書かない

リーダブルコード 10 無関係の下位問題を抽出する

前回
リーダブルコード 9 変数と読みやすさ - by shigemk2

var findClosestLocation = function(lat, lng, array) {
    var closest;
    var closest_dist = Number.MAX_VALUE;
    for (var i = 0; i < array.length; i += 1) {
        // 2つの地点をラジアンに変換する
        var lat_rad = radians(lat);
        var lng_rad = radians(lng);
        var lat2_rad = radians(array[i].latitute);
        var lng2_rad = radians(array[i].longitude);
        
        // 「球面三角法の第二余弦定理」の公式を使う
        var dist = Math.acos(Math.sin(lat_rad) * Math.sin(lat2_rad) +
                             Math.cos(lat_rad) * Math.cos(lat2_rad) *
                             Math.cos(lat2_rad - lng_rad));
        if(dist < closest_dist) {
            closest = array[i];
            closest_dist = dist;
        }
    }
    return closest;
};

コード量が多いので、「2つの地点の球面距離を算出する」部分をメソッドにしてみる。

var spherical_distance = function (lat1, lng1, lat2, lng2) {
    // 2つの地点をラジアンに変換する
    var lat_rad = radians(lat);
    var lng_rad = radians(lng);
    var lat2_rad = radians(array[i].latitute);
    var lng2_rad = radians(array[i].longitude);

    // 「球面三角法の第二余弦定理」の公式を使う
    return Math.acos(Math.sin(lat_rad) * Math.sin(lat2_rad) +
                         Math.cos(lat_rad) * Math.cos(lat2_rad) *
                         Math.cos(lat2_rad - lng_rad));

};

var findClosestLocation = function(lat, lng, array) {
    var closest;
    var closest_dist = Number.MAX_VALUE;
    for (var i = 0; i < array.length; i += 1) {
        var dist = spherical_distance(lat, lng, array[i].latitute, array[i].longitude);
        if(dist < closest_dist) {
            closest = array[i];
            closest_dist = dist;
        }
    }
    return closest;
};

関数にできる部分はさっくり関数にしたほうがよい。
メリットは、

  • 読みやすい
  • 高レベルの目標に集中できる
  • 個別にテストしやすい

などがある。

このようにプロジェクトから完全に切り離された汎用コードをたくさん作ることで、
開発もテストも理解も楽になる。

ラッパーを用意して汚いインターフェイスを覆い隠すのもよい。

ほとんどのコードは汎用化できる。一般的な問題を解決するライブラリやヘルパー関数を作っていけば、
プログラムに固有の小さな核だけが残る。
この技法が役に立つのは、プロジェクトの他の部分から切り離された、境界線の明確な小さな問題に集中できるから
である。こうした下位問題に対する解決策は、より緻密で正確なものになる。