📖
【リーダブルコード】巨大な表現を分割する
※ 下記のリンクにある本の韓国語版を読んで簡単に整理しました。
❗ 印象に残った一節
今回の章では、書籍の例から大きく逸脱せずに紹介しているが、筆者が自分で例をアレンジして記述している部分も多い。
アレンジによって読者にとってわかりやすくなると考えており、より特長的な解説になるよう努めている。
危うさはあるが、それでも挑戦したいと思っている。
🧩 説明変数(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