見た目が美しいコードの方が読みやすいはずですよね。
改行やインデントがメチャクチャなコードは大変読みにくいです。
この章では見た目的にコードを読みやすくするための三つの要素と原則が紹介されています。
要素
原則
- 一貫性のあるレイアウト
- 似ているコードは似ているように
- 関連するコードをまとめてブロックに
一貫性のあるレイアウト
以下はscaffoldで生成したuser_controller#create
を一貫性のないレイアウトにしたものです。
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html {
redirect_to user_url(@user),
notice:
"User was successfully created."
}
format.json { render :show, status: :created, location: @user }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
んー読みにくい。
このコードを直していきましょう。
まず、一貫性のあるレイアウトにするためにインデントを修正します。
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html {
redirect_to user_url(@user),
notice:
"User was successfully created."
}
format.json { render :show, status: :created, location: @user }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
formatの位置が揃ったことで見やすくなりました。
次にスペースの位置を揃えましょう。
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html {
redirect_to user_url(@user),
notice:
"User was successfully created."
}
format.json { render :show, status: :created, location: @user }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
render
以下の位置が揃ったことで見やすくなりました。
ただ、if文の中にある一つ目のformat.html
の改行が不適切で、似ているコードは似ているようにの原則が守られていないので修正しましょう。
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to user_url(@user), notice: "User was successfully created." }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
これで似ているコードが似ている形になりましたね。
最後に意味のある段落分けをしましょう。
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to user_url(@user), notice: "User was successfully created." }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
変数に値を入れているところと、respondを段落分けすることで処理がみやすくなりました💪
他にもコードを見やすくする方法として
- 宣言をブロックにまとめる
- 繰り返し使ってる処理をメソッドにする
などがありました。
最後に重要な考えとして、プロジェクトにアサインしているのであれば、個人の好みよりプロジェクトの規約を大事にすべき(一貫性)というものがありました 👀
仮に規約が一般的でないものだとしても、一貫性が大事ということですね 💪