Principes SOLID simplifiés (4/5): Ségrégation d’interface

blog-thumb

Introduction

Dans mon précédent article j’ai expliqué le troisième principe SOLID (Substitution de Liskov).

N’hésitez pas a découvrir les autres principes SOLID dans cette série d’articles:

Aujourd’hui je vous propose une explication pour le quatrième principe S.O.L.I.D, c’est le principe «Ségrégation d’interface» (Interface Segregation), ce principe affirme qu’il vaut mieux plusieurs interfaces spécifiques à une classe qu’une grosse interface générique, il ne faut pas obliger à implémenter des méthodes que l’on ne veut pas.

Je vous donne un exemple:

Un mauvais exemple

public interface IBase
{
    void UpdateId(int id);
    void UpdateAddress(string address);
    void UpdatePrice(decimal price);
}
public sealed class Customer : IBase
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }

    public void UpdateId(int id)
    {
        Id = id;
    }

    public void UpdateAddress(string address)
    {
        Address = address;
    }

    public void UpdatePrice(decimal price)
    {
        throw new NotImplementedException();
    }
}
public sealed class Product : IBase
{
    public int Id { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }

    public void UpdateId(int id)
    {
        Id = id;
    }

    public void UpdatePrice(decimal price)
    {
        Price = price;
    }

    public void UpdateAddress(string address)
    {
        throw new NotImplementedException();
    }
}

Le code est incorrect car la classe Customer doit avoir la méthode UpdatePrice et la classe Product doit avoir la méthode UpdateAddress parce qu’ils implémentent la même interface IBase.

Un bon exemple

public interface IBase
{
    void UpdateId(int id);
}
public interface ICustomer : IBase
{
    void UpdateAddress(string address);
}
public interface IProduct : IBase
{
    void UpdatePrice(decimal price);
}
public sealed class Customer : ICustomer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }

    public void UpdateId(int id)
    {
        Id = id;
    }

    public void UpdateAddress(string address)
    {
        Address = address;
    }
}
public sealed class Product : IProduct
{
    public int Id { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }

    public void UpdateId(int id)
    {
        Id = id;
    }

    public void UpdatePrice(decimal price)
    {
        Price = price;
    }
}

Le code est correct car l’interface générique a été divisée en interfaces spécifiques.

Les classes Customer et Product n’implémentent pas de méthodes qui ne font pas partie de la même logique métier.

Si vous avez aimé cet article, n’hésitez pas à le partager !

comments powered by Disqus