LoginSignup
0
0

いいコード悪いコードまとめ6章 条件分岐

Last updated at Posted at 2023-07-19

条件文のネストを早期リターンで避ける

条件分岐を一箇所にまとめているか

例えば、以下のようにクラスが複数あって、その中で条件に応じて表示を切り替えているコードがある場合、
これでは、抜け漏れがかなり起きやすいようになっています。

なぜなら、条件分岐が重複して色々なところに書かれているからです。

# 車のクラス
class Car
  def initialize(type)
    @type = type
  end

  def drive
    case @type
    when 'sedan'
      puts '乗用車を運転しています。'
    when 'truck'
      puts 'トラックを運転しています。'
    when 'suv'
      puts 'SUVを運転しています。'
    else
      puts '不明な車種です。'
    end
  end
end

# 自転車のクラス
class Bicycle
  def initialize(type)
    @type = type
  end

  def ride
    case @type
    when 'road'
      puts 'ロードバイクを乗っています。'
    when 'mountain'
      puts 'マウンテンバイクを乗っています。'
    else
      puts '不明な自転車種です。'
    end
  end
end

car = Car.new('sedan')
car.drive

bicycle = Bicycle.new('road')
bicycle.ride

このような場合は一箇所に条件分岐をまとめると良いです。
そうすることで修正や追加の抜け漏れが起こりにくくなるからです。

# 車両のクラス
class Vehicle
  def initialize(type)
    @type = type
  end

  def drive_or_ride
    case @type
    when 'sedan', 'truck', 'suv'
      puts "#{@type}を運転しています。"
    when 'road', 'mountain'
      puts "#{@type}バイクを乗っています。"
    else
      puts '不明な車両です。'
    end
  end
end

vehicle1 = Vehicle.new('sedan')
vehicle1.drive_or_ride

vehicle2 = Vehicle.new('mountain')
vehicle2.drive_or_ride

フラグ引数やinteger引数を使っていないか

パッとみて、何をするメソッドが想像がつくか

以下のようにメソッドの機能を切り替えるboolean型引数をフラグ引数と呼び、弊害が生じる。

damage(true, damageAmount)

また、以下のようにint型引数で機能を切り替えるのも弊害が生じる

damege(1, damageAmount)

例えば以下のようにフラグ引数で書いた場合、メソッドの内部ロジックを見にいく必要があり、開発の生産性が低下します。
パッとみて何をしているのかわからない!となります。

process_order(order, true)

例えば、実際の中身は以下のようになっています。

def process_order(order, flag)
  if true
    puts "特急配送で注文を処理します: #{order}"
    # ここに特急配送の処理を記述する
  else
    puts "通常配送で注文を処理します: #{order}"
    # ここに通常配送の処理を記述する
  end
end

order1 = '注文1'
process_order(order1, true)  # 特急配送で注文1を処理

order2 = '注文2'
process_order(order2, false)  # 通常配送で注文2を処理

これだと非常に分かりづらいので、メソッドを分離しましょう。

メソッドが単機能で分離されているか

先ほどのフラグ引数のメソッドを分離したらこんな感じです。
パッとみて、何をするか想像できますよね。(蓋を開けたら訳のわからない中身が書かれているかもしれない...ということは置いておいて。たまにありますよね...)

process_express_order(order)
def process_order(order)
  puts "通常配送で注文を処理します: #{order}"
  # ここに通常配送の処理を記述する
end

def process_express_order(order)
  puts "特急配送で注文を処理します: #{order}"
  # ここに特急配送の処理を記述する
end
0
0
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
0
0