『リーダブルコード』を学習する7

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

序文

リーダブルコード学習7日目。
結構イケそうなアイデアを思いついた今がきっと一番楽しい。

GitHub

github.com

進捗

  • 10章 無関係の下位問題を抽出する
    (学習時間:3時間)

コード実装部分(一部)

  • 汎用的な処理を別の関数に切り出す

\CodeExample\10章 無関係の下位問題を抽出する\10-1 入門的な例:findClosestLocation()\find-closest-location.js

// 高レベルのコードと低レベルの問題が混在している

// 与えられた緯度経度に最も近い'array'の要素を返す。
// 地球が完全な球体であることを前提としている。
const findClosestLocation = function (lat, lng, array) {
  let closest;
  let closest_dist = Number.MAX_VALUE;
  for (let i = 0; i < array.length; i += 1) {
    // 2つの地点をラジアンに変換する
    const lat_rad = radians(lat);
    const lng_rad = radians(lng);
    const lat2_rad = radians(array[i].latitude);
    const lng2_rad = radians(array[i].longitude);

    //「球面三角法の第二余弦定理」の公式を使う
    const dist = Math.acos(Math.sin(lat_rad) * Math.sin(lat2_rad) +
      Math.cos(lat_rad) * Math.cos(lat2_rad) *
      Math.cos(lng2_rad - lng_rad));
    if (dist < closest_dist) {
      closest = array[i];
      closest_dist = dist;
    }
  }
  return closest;
};

/*******************
 改善例
********************/
// 高レベルのコードと低レベルの問題が混在している
// 与えられた緯度経度に最も近い'array'の要素を返す。
// 地球が完全な球体であることを前提としている。
const findClosestLocation = function (lat, lng, array) {
  let closest;
  let closest_dist = Number.MAX_VALUE;
  for (let i = 0; i < array.length; i += 1) {
    const dist = sphericalDistance(lat, lng, array[i].latitude, array[i].longitude);
    if (dist < closest_dist) {
      closest = array[i];
      closest_dist = dist;
    }
  }
  return closest;
};

const sphericalDistance = function (lat1, lng1, lat2, lng2) {
  // 2つの地点をラジアンに変換する
  const lat_rad = radians(lat);
  const lng_rad = radians(lng);
  const lat2_rad = radians(array[i].latitude);
  const 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(lng2_rad - lng_rad));
}
  • その他実装部分

github.com

実行結果

ねえよ

感想

今日は下位の関数や汎用的な処理を別の関数に切り出す考え方について。

この内容は学習前に私が期待していた内容のひとつでもある。
実際のコードを書くにあたって、どこまでを別の関数に切り出すかはいまだに迷うことが多い。

結論から言うと、残念ながら特に新しい知見を得ることはできなかった。

  • 下位問題を処理しているコードは抽出しましょう
  • 汎用的な処理をしているコードは抽出しましょう

という原則は分かるのだが、実際にコードを書く場面ではそれほど明確に判断できる場合は多くないように思う。

判断に迷った時に基準となるような、具体的な指針(たとえば何行以上の処理は原則切り分けるとか)が得られることを期待していたのだが、やはりケースバイケースで考えていくしかないのだろうか。

カロリーメイトください。

BGM

アグレッシ部 / KREVA

www.youtube.com