📖

【リーダブルコード】巨大な表現を分割する

に公開

※ 下記のリンクにある本の韓国語版を読んで簡単に整理しました。
https://www.amazon.co.jp/Art-Readable-Code-Practical-Techniques-ebook/dp/B0064CZ1XE

❗ 印象に残った一節

今回の章では、書籍の例から大きく逸脱せずに紹介しているが、筆者が自分で例をアレンジして記述している部分も多い。
アレンジによって読者にとってわかりやすくなると考えており、より特長的な解説になるよう努めている。
危うさはあるが、それでも挑戦したいと思っている。


🧩 説明変数(Explaining Variable)

大きな表現を小さく分解する最も簡単な方法は、「補助変数(説明変数)」 を作ることです。
説明変数は部分式の意味を明確に伝える役割を果たします。

// 一見シンプルなコード
if (fileName.split("\\.")[1].equals("png")) {
    // 何か処理
}

このコードを説明変数を用いて書き換えると、以下のようになります。

String[] parts = fileName.split("\\.");
boolean isPng = parts[1].equals("png");
if (isPng) {
    // 何か処理
}

注意点

このコード例は読みやすさを意識してアレンジされたものですが、実際には バグのあるコード です。
たとえば a.b.png というファイル名のとき、split('.')[1] では "b" を取得してしまいます。

実際に拡張子を取得したい場合は、最後のインデックスを参照すべきです:

String[] parts = fileName.split("\\.");
String extension = parts[parts.length - 1];
boolean isPng = extension.equals("png");
if (isPng) {
    // 処理
}

要約変数(Summarizing Variable)

コードの条件式が短くても、**「意味が明確である」**とは限りません。
要約変数を用いることで、ロジックをより明確に伝えることができます。

// 元のコード
if (req.getUser().getId().equals(document.getOwnerId())) {
    // オーナーの場合の処理
}
if (!req.getUser().getId().equals(document.getOwnerId())) {
    // オーナーでない場合の処理
}
// 要約変数を使ったバージョン
boolean userOwnsDocument = req.getUser().getId().equals(document.getOwnerId());
if (userOwnsDocument) {
    // オーナーの場合の処理
}
if (!userOwnsDocument) {
    // オーナーでない場合の処理
}

コメント

コードが短い=良いコードという意見にはある程度賛成しますが、
中身がわかりづらければ意味がありません
同じ式が何度も使われる場合は特に、変数に抽出した方が可読性が上がり、保守もしやすくなります。


第8章についての所感

第8章では、他にも次のような優れたテクニックが紹介されています。

  • ショートサーキット論理(Short-Circuit Logic)の誤用防止
  • 複雑なロジックの分解
  • 巨大な条件式・文の分割

これらも本当は紹介したかったのですが、簡潔にまとめるのが難しく、泣く泣く割愛しました。
時間があるときに改めて紹介したいと思います。

Discussion