1
1

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.

Ruby on Railsの理念を具体例を用いて解説

Last updated at Posted at 2021-02-04

DRY ~Don't Repeat Yourself~

今回は前回の記事で紹介したRuby on Railsの理念に関する内容を深ぼっていきます。

DRYとは実際にどの様な場面で用いられているのか...

[Don't Repeat Yourselfの略]
「同じ情報を繰り返し定義しない」

ここでいう情報とは、
メソッドであったり、配列などのデータの集合体などを指します。
同じコードを繰り返し記述しないという捉え方で問題ないようだ。

具体例

上記の内容を見た時にすぐに浮かんだのはcontrollerの中のこの記述

items_controller.rb
  def create
    @item = Item.new(item_params)
    if @item.save
      redirect_to root_path
    else
      render :new
    end
  end

  def show
  end

  def edit
  end

# ~省略~

  private # ここだよー
  def item_params
    params.require(:item).permit(:image, :product_name, :product_description, :product_price, :product_category_id,
                                 :product_condition_id, :delivery_charge_id, :prefecture_id, :days_to_ship_id).merge(user_id: current_user.id)
  end

  def set_item
    @item = Item.find(params[:id])
  end

着目したいのはprivateメソッド

このprivateメソッドとても優秀

privateメソッド

privateメソッドを使用する利点は以下の2点


  • Classの外部から呼ばれたら困るメソッドを隔離
    • メソッドの中には、Classの外部から呼び出されてしまうとエラーを起こすメソッドも存在する。
    • プライベートメソッドはClass外から呼び出すことが不可能であるため、誤って呼び出してしまう等によるエラーを事前に防ぐことが可能となる。

privateメソッドと呼ばれる由縁なのかな?なんだか独りで納得。

  • 可読性
    • Classの外部から呼び出されるメソッドを探す際に、private以下の部分は目を通さなくて良くなる。
    • 繰り返し使用するメソッドもprivate以下に集約でるので、コードがシンプルになる。

item_paramsset_itemとして切り出したのがまさにソレ!


恩恵を受けた部分
  def show
  end

  def edit
  end

上記の部分なんておかげで何も書いていない。

今後大きなアプリケーションを作成する際に、このありがたみがわかるでしょう。

こんな事を学習開始当初
目にしていましたが、本当に助かってます。


当時は何もピンときてなかったけどね

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?