この記事は、保守性の高いコード設計シリーズの一部です。プログラミングの初歩から一歩進んで、誰が読んでも理解しやすいコードを書くための具体的なテクニックを紹介します。
こんにちは。プログラミングを始めたばかりの頃は、とにかく動くコードを書くことに集中しがちです。しかし、プロジェクトが大きくなったり、チームで開発したりするようになると、「コードの読みやすさ」が非常に重要になってきます。
今回は、未来の自分や他の開発者を助ける、読みやすいコードの基礎となる「変数」と「メソッド」の扱い方について見ていきましょう。
省略せず、意図が伝わる名前を設計する
まず、以下のコードを見てください。ECサイトの最終的な請求金額を計算するロジックのようですが、何をしているかすぐに理解できるでしょうか?
【Before】これでは意図が分からない…
// 't', 'p1', 'p2', 'd' が何を表すか不明
double t = 0.0;
t = p1 + p2;
t = t - d;
if (t < 0) {
t = 0;
}
p1
やd
といった一文字の変数は、書いた本人でさえ数日後には「これ、何だっけ?」となってしまう原因です。コードは、処理内容を説明する「物語」であるべきです。その物語の登場人物である「変数」に、適切な役割名を与えましょう。
【After】名前だけで処理内容が想像できる!
double finalBillingAmount = 0.0;
double subtotal = productPriceA + productPriceB;
finalBillingAmount = subtotal - couponDiscount;
if (finalBillingAmount < 0) {
finalBillingAmount = 0;
}
いかがでしょうか。productPriceA
(商品Aの価格)とproductPriceB
(商品Bの価格)を足してsubtotal
(小計)を出し、そこからcouponDiscount
(クーポン割引額)を引いてfinalBillingAmount
(最終請求額)を計算している、という処理の流れが一目瞭然になりました。
少し長くなっても、省略せずに意図が伝わる名前を選ぶことが、読みやすいコードへの第一歩です。
変数を使い回さない、目的ごとの変数を用意する
次に、計算の過程で一つの変数を何度も使い回すケースを見てみましょう。
// 'amount'という変数が小計、送料込み合計、最終金額と役割を変えている
double amount = productPriceA + productPriceB;
amount = amount + shippingFee;
amount = amount - couponDiscount;
if (amount < 0) {
amount = 0;
}
この書き方でも計算結果は同じですが、デバッグが困難になるという欠点があります。例えば、最終結果がおかしい時に、どの計算段階で問題が発生したのか(小計の時点か、送料を加えた時点か)を特定しにくくなります。
計算の各ステップで生まれる値には、それぞれ新しい「目的ごとの変数」を用意してあげましょう。
【After】計算の途中経過が分かりやすい!
// 1. 商品の小計を計算する
double subtotal = productPriceA + productPriceB;
// 2. 小計に送料を加える
double totalWithShipping = subtotal + shippingFee;
// 3. そこから割引額を引いて最終請求額を出す
double finalBillingAmount = totalWithShipping - couponDiscount;
if (finalBillingAmount < 0) {
finalBillingAmount = 0;
}
このように、subtotal
(小計)、totalWithShipping
(送料込み合計)、finalBillingAmount
(最終請求額)と、目的ごとに変数を分けることで、ロジックの各ステップが明確になります。これにより、コードが読みやすくなるだけでなく、デバッグもしやすくなるのです。
意味のあるまとまりでメソッド化する
変数名が整理できたら、次はそのロジックを「意味のあるまとまり」で部品化(メソッド化)していきましょう。
メソッド化のメリットは、以下の通りです。
- 再利用性: 同じ計算を色々な場所で使えるようになります。
- 可読性: 長い処理が、意味のある名前のメソッド呼び出しに置き換わるため、コードの全体像を把握しやすくなります。
- テスト性: メソッド単位でテストが書けるため、品質が向上します。
先ほどの請求額計算ロジックを、メソッドを使って整理してみましょう。
【After】ロジックを部品として切り出す
// 小計を計算するメソッド
double calculateSubtotal(double priceA, double priceB) {
return priceA + priceB;
}
// 最終的な請求額を計算するメソッド
double calculateFinalBillingAmount(double subtotal, double shippingFee, double discount) {
double amount = subtotal + shippingFee - discount;
if (amount < 0) {
return 0.0;
}
return amount;
}
これらのメソッドを呼び出す側のコードは、驚くほどシンプルになります。
【After】メソッド呼び出しで、処理の概要が分かる
double subtotal = calculateSubtotal(productPriceA, productPriceB);
double finalBillingAmount = calculateFinalBillingAmount(subtotal, shippingFee, couponDiscount);
このように、「何をやっているか」の詳細はメソッドの中に隠蔽し、呼び出し側では「処理の概要」だけが見えるようにすることで、非常に見通しの良いコードになります。
まとめ
今回は、読みやすいコードの基礎として、以下の3つのテクニックをご紹介しました。
- 意図が伝わる名前を使う: 省略せず、具体的な名前にする。
- 目的ごとに変数を用意する: 変数を使い回さず、計算ステップを明確にする。
- 意味のあるまとまりでメソッド化する: ロジックを部品化し、見通しを良くする。
これらの基本を徹底するだけで、あなたのコードは格段に読みやすくなります。 しかし、データ(変数)とロジック(メソッド)がまだ別々の場所にあります。これらが強く関連し合っている場合、さらに良い設計が可能です。
▼次の記事 次回は、今回整理したデータとロジックを「クラス」という一つの入れ物にまとめることで、さらに堅牢で再利用性の高いコードを設計する方法を解説します。