1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【リーダブルコード】初心者エンジニアが読み解く「巨大な式をスッキリ分割する」テクニック - 第8章

Posted at

こんばんは!マル太です。

前回は、リーダブルコードの第7章「制御フローを読みやすくする」についてまとめました。
今回は、第8章「巨大な式を分割する」について、私なりに解釈し、まとめていきます。

巨大な式があるとなぜ良くない?

プログラムを書いていると、ついつい式が長くなってしまいがちです。
ただし、巨大な式は、まるでジャングルの中をさまようように、コードが読みにくくなってしまいます。

例えば、こんな式があったら、どうでしょうか?

qiita.rbJava
if (年齢 >= 20 && (職業 == "会社員" || 職業 == "公務員") && 年収 >= 300万円) {
  // ローンを承認する
}

この式は、年齢、職業、年収の3つの条件を組み合わせて、ローンを承認するかどうかを判断しています。
でも、ぱっと見ただけでは、どんな条件でローンが承認されるのか、分かりにくいですよね?

式を分割して、コードをスッキリさせよう!

巨大な式を分割すると、コードが読みやすくなるだけでなく、バグも減りやすくなります。
式を分割するためのテクニックを、紹介していきます。

1. 説明変数を使う
複雑な条件式を、分かりやすい名前の変数に置き換えてみましょう。

Java
boolean 大人である = 年齢 >= 20;
boolean 安定した職業 = 職業 == "会社員" || 職業 == "公務員";
boolean 高収入 = 年収 >= 300万円;

if (大人である && 安定した職業 && 高収入) {
  // ローンを承認する
}

このように、「大人である」、「安定した職業」、「高収入」といった変数を使うことで、コードがまるで文章を読んでいるように理解しやすくなりますね。

2. 要約変数を使う
長い計算式を、短い変数名でまとめてみましょう。

Java
// 分割前
int 合計金額 = 単価 * 数量 * (1 + 税率);


// 分割後
double 税込み単価 = 単価 * (1 + 税率);
int 合計金額 = 税込み単価 * 数量;

「税込み単価」という変数を使うことで、計算式が2つに分かれ、それぞれが何を計算しているのかが明確になりました。


3. ド・モルガンの法則を使う
ド・モルガンの法則とは、
条件式を、より分かりやすい形に変換する法則です。

!(A && B)!A || !B と同じ
!(A || B)!A && !B と同じ

例えば、「AさんとBさんが 両方 来ない」ということは、「Aさんが来ない または Bさんが来ない」ということと同じ意味ですよね。
これが、!(A && B)!A || !B と同じ、という意味です。

4. 短絡評価の悪用は避ける
短絡評価とは、条件式の一部を評価せずに結果が決まる仕組みのことです。
便利ですが、使いすぎるとコードが分かりにくくなるので、注意が必要です。

5. 複雑なロジックはシンプルに
複雑な条件分岐や計算式は、できるだけ分割して、シンプルに表現しましょう。
複雑なコードは、バグの原因になりやすいので、分かりやすく整理することが大切です。

6. 巨大な文もは改行で分割
1行が長すぎる文は、複数の行に分割して読みやすくしましょう。

7. 式を簡潔にするには?
APIの設計を見直したり、適切なデータ構造を使うなど、さまざまな方法で式を簡潔にすることができます。

※APIの設計って?
APIとは、ソフトウェアの機能を外部から利用するためのインターフェースのことです。
APIの設計が分かりやすければ、コードもシンプルになります。

例えば、ユーザー情報を名前で検索するAPIがあるとします。

このAPIをgetUserByName()という名前にすると、「ユーザーを取得する」という動作と「名前で検索する」という条件が混ざってしまい、少し分かりにくいです。

そこで、findUserByName()という名前に変更すると、「名前でユーザーを検索する」というAPIの目的がより明確になります。

APIの名前が具体的で分かりやすくなると、そのAPIを使う側のコードもシンプルになります。

例えば、getUserByName()を使う場合は、以下のようなコードになるかもしれません。

Java
User user = getUserByName("田中太郎");
if (user != null) {
  // userが見つかった場合の処理
} else {
  // userが見つからなかった場合の処理
}

一方、findUserByName()を使う場合は、以下のようなコードになります。

Java

User user = findUserByName("田中太郎");
// userが見つかった場合の処理

findUserByName()は、ユーザーが見つからなかった場合はnullを返さないと想定できるので、nullチェックが不要になり、コードが簡潔になりました。


まとめ

巨大な式を分割することで、コードが読みやすくなるだけでなく、バグも減りやすくなります。

今回紹介したテクニックを活用して、分かりやすいコードを書きましょう。

次回は、第9章「変数と読みやすさ」についてまとめます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?