SOLID : Single Responsibility Principle (SRP)
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)