🦉

【初心者プログラマー必見】綺麗なコードを書くためのたった5つのコツ

2024/06/08に公開

本記事の目的

プログラミングを書く中で、コードの読みやすさと綺麗さは、メンテナンス性やチームの生産性に直結します。
ちょっとした意識で少しでも良いコードを書けるようになることが目的です。

コツ:1 適切な名前づけを行う

コード内の変数やメソッドに適切な名前を付けることは、コードの可読性に大きな影響を与えます。良い名前は、その変数やメソッドの役割を明確に伝えるものです。

変数名とメソッド名

命名の際には出来るだけ省略せずに、使用する変数やメソッドが何を表しているかを記載し、読み手がわかりやすい命名を心がけることが大切です。

良い例

def calculate_total(price, quantity)
  price * quantity
end

悪い例

def calc(p, q)
  p * q
end

日本語を使った名前付けの例

時には、適切な名前がすぐに思い浮かばないことがあります。その場合、日本語でいくつかの候補を挙げ、その中から選択するのも一つの方法です。

例えば、ユーザーのアカウント情報を取得するメソッドを考えてみましょう。以下にいくつかの候補を挙げます。

get_user_info
fetch_user_details
retrieve_account_data

日本語で考えると次のようになります。

ユーザー情報を取得する (get_user_info)
ユーザーの詳細を取得する (fetch_user_details)
アカウントデータを取得する (retrieve_account_data)

このように日本語での意味を明確にし、最も適した名前を選ぶことができます。

良い例

def fetch_user_details(user_id)
  # ユーザーの詳細を取得するロジック
end

悪い例

def get_info(id)
  # 不明瞭なメソッド名
end

適切な名前付けにより、コードを読む人がその意図をすぐに理解できるようになります。特にチームでの開発においては、名前の意味が明確であることが非常に重要です。

コツ:2 早期リターンを活用する

早期リターンは、条件分岐が多い場合にコードのネストを減らし、シンプルに保つための効果的な手法です。これにより、コードの読みやすさが向上します。

早期リターンのメリット

ネストの削減: 深いネストはコードの可読性を低下させます。早期リターンを使用することで、条件を満たさない場合に早めに関数から抜け出し、主な処理ロジックをフラットに保つことができます。
フローの明確化: 関数の初期段階で異常な状態をチェックし、早めにリターンすることで、正常な処理の流れが明確になります。

良い例

def validate_user(user)
  return p 'Invalid user' unless user
  return p 'User not active' unless user.active?

  p 'User is valid'
end

悪い例

def validate_user(user)
  if user
    if user.active?
      p 'User is valid'
    else
      p 'User not active'
    end
  else
    p 'Invalid user'
  end
end

コツ:3 ビジネスロジックをViewに書かず、Modelに書く

アプリケーションのビジネスロジックを適切な場所に配置することは、コードの可読性、再利用性、保守性を高めるために重要です。MVC(Model-View-Controller)アーキテクチャでは、ビジネスロジックはモデルに含めるべきです。

なぜビジネスロジックをモデルに書くべきか

分離の原則: Viewはデータの表示に専念し、ビジネスロジックはModelが担当することで、コードの責任分担が明確になります。
再利用性: ビジネスロジックがModelに含まれていれば、同じロジックを複数のViewやControllerから再利用できます。
テストの容易さ: ビジネスロジックがModelに集約されていると、単体テストが容易になります。ViewやControllerのテストは複雑になりがちですが、Modelのテストは比較的単純です。

悪い例: Viewにビジネスロジックを書く

以下は、ビジネスロジックがViewに書かれている悪い例です。

(View)

<% if user.purchases.sum(&:amount) > 1000 %>
  <p>You are a premium customer!</p>
<% else %>
  <p>You are a regular customer.</p>
<% end %>

この例では、ユーザーの購入金額の合計に基づいてプレミアム顧客かどうかを判定するビジネスロジックがビューに含まれています。

良い例: Modelにビジネスロジックを書く

ビジネスロジックをモデルに移動し、ビューはデータの表示に専念します。

(Model)

# Modelの例(user.rb)
class User < ApplicationRecord
  def premium_customer?
    purchases.sum(&:amount) > 1000
  end
end

(View)

<% if user.premium_customer? %>
  <p>You are a premium customer!</p>
<% else %>
  <p>You are a regular customer.</p>
<% end %>

コツ:4 DRY(Don't Repeat Yourself)の原則を守る

DRY(Don't Repeat Yourself)は、同じロジックや処理を繰り返さないことを意味します。これにより、コードの再利用性が高まり、保守性が向上します。

簡単な例:ユーザーのフルネーム生成
例えば、ユーザーのフルネームを生成し、表示とログに出力するコードがあるとします。
複数箇所で同一の記載が増加してきたら、時と場合によりますが、一つにまとめることは出来ないか検討します。

悪い例

def display_user_full_name(user)
  full_name = "#{user.first_name} #{user.last_name}"
  puts full_name
end

def log_user_full_name(user)
  full_name = "#{user.first_name} #{user.last_name}"
  logger.info(full_name)
end

良い例

以下は、DRYの原則に従ってリファクタリングした例です。

def full_name(user)
  "#{user.first_name} #{user.last_name}"
end

def display_user_full_name(user)
  puts full_name(user)
end

def log_user_full_name(user)
  logger.info(full_name(user))
end

コツ:5 マジックナンバーを避ける

マジックナンバーとは、コード内で具体的な数値や文字列が直接使われていることを指します。これらを排除し、意味のある名前を付けることで、コードの可読性と保守性が向上します。

簡単な例:ディスカウントの計算
例えば、商品の価格に対して割引を適用するコードがあるとします。

悪い例

以下は、マジックナンバーを直接使用している例です。

def calculate_discounted_price(price)
  discounted_price = price - (price * 0.1) # 10%の割引
  discounted_price
end

この悪い例では、割引率が直接数値として書かれており、何を意味するのかが分かりづらいです。

良い例

以下は、マジックナンバーを定数に置き換えた例です。

DISCOUNT_RATE = 0.1

def calculate_discounted_price(price)
  discounted_price = price - (price * DISCOUNT_RATE)
  discounted_price
end

良い例では、DISCOUNT_RATEという定数を使用して割引率を明示しています。これにより、コードの意図が明確になり、後から見たときにも理解しやすくなります。

さらに良い例:複数の定数を使用する

場合によっては、複数のマジックナンバーを使用することがあります。これらもすべて定数に置き換えることで、コードがさらに分かりやすくなります。

DEFAULT_TAX_RATE = 0.1
DISCOUNT_RATE = 0.1

def calculate_final_price(price)
  price_with_tax = price + (price * DEFAULT_TAX_RATE)
  discounted_price = price_with_tax - (price_with_tax * DISCOUNT_RATE)
  discounted_price
end

この例では、税率と割引率の両方を定数に置き換えています。これにより、どの数値が何を意味しているのかが明確になり、変更が必要な場合でも簡単に対応できます。

まとめ

この記事では、コードを綺麗に保つための5つのコツを紹介しました。適切な名前付け、早期リターンの活用、ビジネスロジックをModelに書くこと、DRYの原則を守ること、マジックナンバーを避けることです。他にもまだまだたくさんあると思いますが、これらのコツを実践することで、よりクリーンで効率的なコードを書くスキルを向上させることができます。クリーンなコードは、長期的なプロジェクトの成功に欠かせない要素です。今後の開発に役立てていきましょう。

参照

https://github.com/rubocop/ruby-style-guide

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
リファクタリング(第2版): 既存のコードを安全に改善する (OBJECT TECHNOLOGY SERIES)

Discussion