Single Responsibility Principle

Topics: SOLID Principles

The Single Responsibility Principle says a software unit should have one responsibility and one reason to change.

The SRP is the first of the SOLID Principles. See also Separation of Concerns.

“A class should have one, and only one, reason to change.”
– Robert C. Martin
A module/class/function should only have a single responsibility, that is, only changes to one part of the software’s specification should be able to affect the specification of the module/class/function.

A module/class/function should

  • be responsible only and fully for a single part of the functionality, and
  • have all its services narrowly aligned with that responsibility.

Advantages

  • Code becomes more reusable
  • Separate responsibilities are only loosely coupled and can be replaced easily
  • Single responsibilities can be tested in isolation

Example

class TwitchStats
  def initialize(daily_viewers:)
    @stats = daily_viewers
  end

  def report
    sum = 0
    stats.each_pair { |day, viewers| sum = sum + viewers }
    puts "Total viewers: #{sum}"
    avg = sum / stats.length
    puts "Average viewers per day: #{avg}"
  end
  
  private
    attr_reader :stats
end

In this class, the report method does more than just calculate the results, it also formats them into strings which it then outputs to the screen.

  • This makes it less reusable because neither can we get the raw results alone nor can we influence the output formatting.
  • We can’t build tests for the method because it doesn’t return any useable data.

Antipatterns

Kitchen sink class

Boolean method arguments

A method that takes a Boolean argument by definition has two responsibilities; one for a value of true, another for false.