条件文のネストを早期リターンで避ける
条件分岐を一箇所にまとめているか
例えば、以下のようにクラスが複数あって、その中で条件に応じて表示を切り替えているコードがある場合、
これでは、抜け漏れがかなり起きやすいようになっています。
なぜなら、条件分岐が重複して色々なところに書かれているからです。
# 車のクラス
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