前回
リーダブルコード 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; };
関数にできる部分はさっくり関数にしたほうがよい。
メリットは、
- 読みやすい
- 高レベルの目標に集中できる
- 個別にテストしやすい
などがある。
このようにプロジェクトから完全に切り離された汎用コードをたくさん作ることで、
開発もテストも理解も楽になる。
ラッパーを用意して汚いインターフェイスを覆い隠すのもよい。
ほとんどのコードは汎用化できる。一般的な問題を解決するライブラリやヘルパー関数を作っていけば、
プログラムに固有の小さな核だけが残る。
この技法が役に立つのは、プロジェクトの他の部分から切り離された、境界線の明確な小さな問題に集中できるから
である。こうした下位問題に対する解決策は、より緻密で正確なものになる。