アジャイルソフトウェア開発の奥義 第8章 単一責任の原則 (SRP)
開発
Published: 2019-07-20

「アジャイルソフトウェア開発の奥義」の読書メモです。

時々、個人の見解入りです。

単一責任の原則

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