Open / close

Le open / close est l’un des 5 principes SOLID fondamentaux.

Il se décrit de la manière suivante : “une class doit être fermée à la modification mais ouverte à l'extension”.

Considérons la class suivante :

class FoodService
{
    public function eat(string $value)
    {
        //

        $food = match ($value) {
            'apple' => 'This food is an apple',
            'bar' => 'This food is a bar',
            'cake' => 'This food is a cake',
        };

        //
    }
}

Actuellement, nous sommes dans l’obligation de modifier directement la class FoodService si nous souhaitons rajouter un fruit dans le match.

Notre méthode eat n'est donc pas ouverte à l'extension et doit subir une modification pour évoluer, c'est une violation évidente du principe open / close.

Cette violation est également synonyme d’une problématique de responsabilité unique, la détection d’un fruit est un besoin à part entière qui pourrait être isolé dans une class distincte, cette nouvelle class améliorera l’architecture de votre application et facilitera les tests des différentes fonctionnalités.

L’ajout d’une abstraction ou l’utilisation du polymorphisme pourraient nous aider à respecter le principe open / close, la création d’une factory pour isoler ce besoin est également envisageable.

class FoodService
{
    public function __construct(
        protected FoodFactory $foodFactory,
    ) {}

    public function eat(string $value)
    {
        //

        $food = $this->foodFactory->forge($value);

        //
    }
}

Désormais, notre class FoodService est plus évolutive, les différentes features sont découplées et l’ajout d’un nouveau fruit ne l’impactera plus directement.

Notre class est désormais ouverte à l’extension !