「アジャイルソフトウェア開発の奥義」の読書メモです。
時々、個人の見解入りです。
単一責任の原則
SRP: The Single Responsibility Princple
クラスを変更する理由は1つ以上存在してはならない。
クラスが複数の役割を背負っているような場合、それらの役割は結合してしまう。その結果、ある役割が変更を受けると、そのクラスが担っている他の役割も 影響を受け、不具合が生じる可能性がある。
例
このクラスは下記2つの役割を持っています。
- 接続の管理
- データ通信
「接続の管理」「データ通信」の2つの役割を持つ
test1.rb
module Modem
# 接続の管理
def dial(pno)
raise '実装してください'
end
def hangup()
raise '実装してください'
end
# データ通信
def send(c)
raise '実装してください'
end
def recv()
raise '実装してください'
end
end
class ModemImplementation
include Modem
def hangup
p "#{self.class} #{__method__}"
end
end
ModemImplementation.new.hangup
仮に、「接続を管理」する関数が影響を受けるような変更がされるなら、分離するべきです。
2つの役割が必ず同時に変更されるなら、分離してしまうと不必要に複雑になってしまいます。
「接続の管理」「データ通信」の2つの役割を分離する
test2.rb
module DataChannel
def send(c)
raise '実装してください'
end
def recv()
raise '実装してください'
end
end
module Connection
# 接続の管理
def dial(pno)
raise '実装してください'
end
def hangup()
raise '実装してください'
end
end
class ModemImplementation2
include DataChannel
include Connection
def hangup
p "#{self.class} #{__method__}"
end
end
ModemImplementation2.new.hangup