SOLID : Interface Segregation Principle (ISP)
Objectif : une classe ne doit pas être obligée d'implementer des méthodes dont elle n'a pas besoin (il existe undef
en Ruby, mais au final cela reste une violation car c'est comme une redéfinition par une méthode vide).
Anti-pattern
class Command
def perform
raise NotImplementedError
end
def rollback
raise NotImplementedError
end
end
class ExecuteOnlyCommand < Command
def perform
# implémetation
end
def rollback
raise "Rollback impossible"
end
end
Problème :ExecuteOnlyCommand
ne peut pas être rollbackée , Cad : exécuter une méthoderollback
, mais cette méthode doit être implémenter pour être neutralisée.
Pattern
Remarque : Cette exemple serait plus concret si par exemple le rollback proposait des Hooking
qui justifieraient une implémentation
module Rollbackable
def rollback
raise NotImplementedError
end
end
module Executable
def perform
raise NotImplementedError
end
end
class Command
include Executable
include Rollbackable
def perform
# implémentation
end
def rollback
# implémentation
end
end
class ExecuteOnlyCommand < Command
include Executable
def perform
# implémentation
end
end
Maintenant rollback
n'est plus obligatoirement implémentable dans ExecuteOnlyCommand