SOLID : Single Responsibility Principle (SRP)

ruby 8 juil. 2025
Objectif : une classe ne doit avoir qu'une seule responsabilité et defacto qu'une seule motivation pour être modifiée

Anti-pattern

On image une collecte de news sur un fournisseur, puis sa valorisation/formatage

et la possibilité de l'envoyer par SMS ou Mail :

Class News

  def collect(target:)
    # collect from target 
  end

  def format
    # format @content 
  end

  def push_sms
    # send formatted @content by sms
  end

  def push_mail
    # send formatted @content by mail
  end
  
end

Problème

La classe News porte 3 responsabilités :

  • collecter une source brute
  • formater la source
  • pousser vers mail ou SMS

Pattern

Class NewsCollector
  def initialize(target)
    @target = target
  end
  def collect
    # collect from target 
    return content
  end
end

Class NewsFormatter
  def initialize(content: :text)
    @format = format
  end
  
  def format
  # format as @format
   return structured
  end

end 

pushers = {sms: SMSPusher, mail: EmailPusher)

class EmailPusher
  def initialize(content:)
    @content = content
  end
  def send
    # send by mail
  end
end

class SMSPusher
  def initialize(content:)
    @content = content
  end
  def send
    # send by SMS
  end
end

usage 
data = NewsCollector::new(target: "https://.....").collect
news = NewsFormattor::new(content: data).format
pushers[:sms]::new(content: news).send

On se retrouve avec trois Classes (quatres en fait, mais dont deux substituables, voir la substitution de Liskov)

Mots clés

Romain GEORGES

Open Source evangelist & Ruby enthousiast