ここでは読みやすいコードについて書こうと思います。
又文中の内容でAPIとライブラリ理解は必須と行っても過言ではないと言えます。
コードの基本
命名規則
命名のポイントは以下のようになります。
- 具体的単語を選ぶ・・・getなど何をしているか❓
- 汎用な名前を避ける・・・sum(合計)など用途を限定した変数にする。
- 情報を含める・・・update_nameのように更新したなど情報を含める。
- 誤解のないように・・・pageと付けたのに何の関連性もないと混乱するため
- 開発者の期待に合わせる。・・・チームでやる場合全体の意向にそう形にする
コードのレイアウト
- 整列(縦位置揃え)・・・縦の位置を揃えることです。スペースを使って=(イコール)などの位置を揃えることで可読性を高めることができます。
- 一貫性(コードの記述フォーマットを設定)・・・似たようなコードのフォーマットを揃えることです
- ブロック化(近似内容でまとめる)・・・同じ系統の変数などをまとめてグループ化することです。
コメント
- 「Why」をコメントする・・・何故書いたかの理由
- 他の開発者へのメモを残す・・・引付きや機能についての説明のため
- 実際の例を記入する・・・改善例や動作例を書く
リファクタリング
処理の内容を変えずに冗長なコードを削除や改善することです。
読み手が最短時間でコードを理解できるようになり、修正がしやすくなります。
要素は以下のようになります
制御フロー
条件分岐や繰り返し処理などの制御フローがあると他の場所に処理が飛んだり
枝分かれしたりとコードがわかりにくくなりがちです。
pointとしては
条件式(if/else)の並び順
条件式は肯定形を使う・・・ =!ではなく==を使う
単純な条件を先に書く・・・a=bなど一眼でわかるように
関心を引く条件を先に書く・・・要点こと重要なことを先に書く
ネストを浅くする
関数から早く返すなど。
式の分割
コードを短くして変数を使用することによって
わかりやすくする。
例をあげると
if @coments.user.nickname.nil?
# 処理
end
# 説明変数を使った場合の方がわかりやすい
is_nickname = currnent_user.nickname.nil?
if is_nickname
#処理
end
変数
下手な使用をすると以下のような問題が起こります。
よって対処を事前に考えておくべきです。
変数が多いと追跡するのが難しくなる
=> 邪魔な変数を削除する変数のスコープが大きいと把握する時間が長くなる
=> 変数のスコープをできるだけ小さくする変数が頻繁に変わると現在値を把握するのが難しくなる
=> 変数は1度だけ使う
メソッドの抽象化(直接的に関係ないものは別の関数にしてまとめるようにする)
役割によって処置を分けること
通販でものを買う場合
通販で買う処理 = ものを選ぶ + 買う処理 がある
この処理の時ものを選ぶと買う処理を一つにするのではなく
それぞれ独立したメソッドでコードを書いた方がいいということ。
#悪い例
def show_item
index = 0
@items.each_with_index { |val, index|
puts "#{index + 1}:#{book.title}"
}
item = @items[select]
puts "#{item.name}"
puts "#{item.image}"
end
# いい例
def chose_item
index = 0
@items.each do |item|
puts "#{index} : #{item.name}"
end
select = gets.to_i
show_item(select)
end
def show_item(select) # 結果の処理
item = @items[select]
puts "#{item.name}"
puts "#{item.image}"
end
関心の分離(処理することは1つの機能だけ)
def~ endなど
メソッドの記述を短めに書いてわかりやすくする。
# 悪い例
def book
# 30行
end
# いい例
def book_show
# 5行
end
def library
# 5行
end
# ざっくり書くとこのような形です。
短いコードを書く
できるだけ短くかけばわかりやすく、負担も小さいプログラムになります。
特に4行目が超重要です。
- 汎用的なコードを作り、重複コードを削除する
- 未使用コードや無用の機能は削除する
- 最も簡単に問題を解決できるような要求を考える
- 定期的にすべてのAPIを読んで、標準ライブラリに慣れ親しんでおく。