プログラミングスクールのフィヨルドブートキャンプの提出物のレビューでよく指摘するシリーズ。

メソッド名に同じ名詞が頻出する場合、その名詞をクラス名として抜き出すとスッキリすることが多い。特にそれらのメソッドが同じインスタンス変数を使ってる場合は尚更。

Bad:

class File
  attr_accessor :permission

  def open
    # ...
  end

  def check_permission
    # ...
  end

  def fetch_permission
    # ...
  end

  def permission_characters
    # ...
  end
end

Good:

class File
  def open(path)
    # ...
    @permission = Permission.new(file)
  end
end

class Permission
  def initialize(file)
    @file = file
  end

  def check
    # ...
  end

  def fetch
    # ...
  end

  def characters
    # ...
  end
end

プログラミングスクールのフィヨルドブートキャンプの提出物のレビューでよく指摘するシリーズ。

Bad:

# frozen_string_literal: true

class Foo
  require "optparse"

  attr_reader :xxxx

  def initialize
    # xxxx
  end
end

Good:

# frozen_string_literal: true

require "optparse"

class Foo
  attr_reader :xxxx

  def initialize
    # xxxx
  end
end

requireは主にライブラリを読み込むために使います。書いた場所のスコープに読み込むわけではないのでファイルの一番上(マジックコメントよりは下)に書くのが一般的です。

ついでにloadとの違いを押さえておくと良いかもです。

プログラミングスクールのフィヨルドブートキャンプの提出物のレビューでよく指摘するシリーズ。

Bad:

def kana(name)
  result = ""
  if name == "komagata"
    result = "コマガタ"
  elsif name == "machida"
    result = "マチダ"
  elsif name == "tanaka"
    result = "タナカ"
  elsif name == "yamada"
    result = "ヤマダ"
  end
  result
end

Good:

def kana(name)
  {
    "komagata": "コマガタ",
    "machida": "マチダ",
    "tanaka": "タナカ",
    "yamada": "ヤマダ"
  }[name]
end

こういう分岐数が多いやつはハッシュで分岐数を削減できる。

プログラミングスクールのフィヨルドブートキャンプの提出物のレビューでよく指摘するシリーズ。

可読性の面

可読性(他の人が読んだ時のわかりやすさ)の面から言うと、initialize(初期化)と言える処理のみ書くべきです。

そのクラスがインスタンスになっているとき、そのインスタンスが備えているべき変数の状態などを設定しておくべきです。

newしただけなのに初期化とは言えないことをやっているとそのクラスを使った人はビックリするし、勘違いから事故が起きやすくなる。

機能の面

機能の面から言うと、大抵は受け取った引数からメンバ変数を設定する程度をするのが一般的です。

例えば、newしただけで何か文字を出力してたりすると、そのクラスをテストする時に困る。拡張するときも困る。

printer = Printer.new # ここで画面に何か出ちゃう
assert printer.ready?