2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsのリファクタリングの例

Last updated at Posted at 2021-04-18

リファクタリングとはプログラミングにおいて、プログラムの動作を変えずにコードの内部構造を整理すること、つまりコードを見やすくすることを言う。

修正前

    <% if user_signed_in? && current_user.id == @item.user_id && @item.purchase.blank? %>
      <%= link_to "商品の編集", edit_item_path, method: :get, class: "item-red-btn" %>
      <p class="or-text">or</p>
      <%= link_to "削除", item_path, method: :delete, class:"item-destroy" %>
    <% else user_signed_in? %>
    <% if @item.purchase.blank? %>
    <%= link_to "購入画面に進む", item_orders_path(@item) ,class:"item-red-btn"%>

これはフリマアプリの一例で、ユーザーのログイン状態において出品した商品の編集、削除ボタンが表示されるか、もしくは購入ボタンが表示されるかの条件分岐を記述したものである。
これだと1行目に「ログインしていればかつ現在ログイン中のユーザー、出現在ログインしているユーザーが商品の出品者であればかつ商品は売れていなければが同じである」というややこしい表記法になっている。
さらに5行目にまたuser_signed_in?があり、6行目に商品は売れていなければの記述で購入画面に進むを表示させる制御をしている。
そこで下記のようにリファクタリングしてみる。

    <% if user_signed_in? || @item.purchase.blank? %>
    <% if current_user.id == @item.user_id %>
      <%= link_to "商品の編集", edit_item_path, method: :get, class: "item-red-btn" %>
      <p class="or-text">or</p>
      <%= link_to "削除", item_path, method: :delete, class:"item-destroy" %>
    <% else %>
    <%= link_to "購入画面に進む", item_orders_path(@item) ,class:"item-red-btn"%>
    <% end %>
    <% end %>

1行目に大きな条件として"ログインしていれば" かつ "商品は売れていなければ"を記述、2行目に"現在ログインしているユーザーが商品の出品者であれば"をif文のネスト構造で記述して「商品の編集」「削除」を表示させるか 「購入画面に進む」を表示させるかを制御している。
1行にまとめるよりも2行に分けたほうが後々わかりやすく重複しない。

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?