「リーダブルコード」を改めて読んでみて(その6)

「リーダブルコード」に関する記事の続きです。

今回の記事では第Ⅲ部の中の12−13章の内容に触れていきます。
これで第Ⅲ部は完結です。

第Ⅲ部は「コードの再構成」というテーマで、12−13章では以下の2点にフォーカスしていました。


コードに思いを込める

12章では、「コードに思いを込める」というタイトルで、コードの意図を明確にする方法について言及しています。

突然ですが、誰かに複雑なことを伝える自分を想像してみてください。
誰かに複雑なことを伝えるときは、「簡単な言葉」を使って説明することがほとんどだと思います。特に相手が専門的な知識や背景を知らないほど、その傾向が強いと個人的には感じます。
この「簡単な言葉」を探す過程で、自分の頭が整理され、重要な概念が抽出された状態言語化されます。

コードというのはその人の考えそのものです。そのため、コードもたとえ複雑なロジックであってもできるだけ「簡単な言葉」で書かれているのが理想的です。
コードの意図を明確にする方法として、12章では以下のように書かれていました。

  1. コードの動作を簡単な言葉で、自分よりも知識が少ない人にも分かるように説明する
  2. その説明の中で使っているキーワードやフレーズに注目する
  3. その説明に合わせてコードを書く


以下のPHPの処理は、ユーザにページを閲覧する権限があるかどうかを確認し、権限がなければユーザに権限がない旨を知らせるページに戻します。

<?php
  $is_admin = is_admin_request();
  if ($document) {
    if (!$is_admin && ($document['username'] != $_SESSION['username'])) {
      // 管理者でなく文章の所有者でもない
      return not_authorized();
    }
  } else {
    if (!$is_admin) {
      // 管理者でない
      return not_authorized();
    }
  }

  // 引き続きページのレンダリング
?>


この処理はif文の分岐が複雑になっているので、これをシンプルにしていきます。
今回はアプローチとして「簡単な言葉で説明する」ことで単純化を試みます。

ここで行われるべき処理を簡単に説明すると、以下のようになります。

  • ページの閲覧権限があるのは以下の2種類のユーザ。
    • 管理者
    • 文章の所有者 (文章がある場合)
  • その他のユーザは権限がないので、その旨を知らせるページに戻す。


上記に基づいて処理を整理すると、以下のようになります。

<?php
  if (is_admin_request()) {
    // 管理者 (権限あり)
  } elseif ($document && ($document['username'] == $_SESSION['username'])) {
    // 文章の所有者 (権限あり)
  } else {
    return not_authorized();
  }

  // 引き続きページのレンダリング
?>


空の分岐がありますが、条件としてはこちらの方がシンプルで理解しやすいものになっています。

余談ですが、この2つのコードはド・モルガンの法則で等価であることが説明できます。
以下の2つは同じ条件を意味します。

  1. 「管理者または文章の所有者」でない
  2. 「管理者でない」かつ「文章の所有者でない」


上記の例においては、1.はリファクタリング後のコードの考え方、2.は最初のコードの考え方がそれぞれ該当します。

短いコードを書く

13章では、短いコードを書くというタイトルで、コードを書かない方法について言及しています。
ここでいう「コードを書かない」方法というのは、自前で本当に書く必要のあるコードとそうでないコードを仕分ける方法を指していると解釈しました。

具体例に踏み込んで書くような内容は正直ないと個人的には感じたので、13章に関しては箇条書きで要点だけまとめておきます。

  • 質問と要求を分割する
  • 未使用のコードや無用の機能を削除する
  • 既存のライブラリを使用する



いよいよ次回でこの一連の記事も最終回となります。


一連の記事はこちらです。
tkhs0604.hatenablog.com tkhs0604.hatenablog.com tkhs0604.hatenablog.com tkhs0604.hatenablog.com tkhs0604.hatenablog.com tkhs0604.hatenablog.com