SOLID : Interface Segregation Principle (ISP)

code 9 juil. 2025
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éthode rollback, 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

Mots clés

Romain GEORGES

Open Source evangelist & Ruby enthousiast