Estamos trabajando en algo propio llamado KODOTI. Click para unirte
Se viene KODOTI. Únete

SOLID #4: Interface Segregation Principle con C#

En esta publicación veremos como implementar Interface Segregation Principle usando el lenguaje C#.

Rodríguez Patiño, Eduardo
4,474 lecturas
Rodríguez Patiño, Eduardo
Hemos migrado hace poco nuestras publicaciones del blog antiguo. Si crees que esta se encuentra incompleta o sin coherencia deja un comentario para restaurarla manualmente.

Partiendo del primer principio, lo que quiere decir basicamente este es que aprendas a crear interfaces para definir comportamientos y de esta manera lo puedas desacoplar libremente.

Hagamos un ejemplo de magos y hechizos que pueden realizar:

interface SpecialPower
{
    void FireAttack();
    void SummonAMonster();
    void TimeStop();
}

class FireMage : SpecialPower
{
    public void FireAttack()
    {

    }

    public void SummonAMonster()
    {
        throw new Exception("Can't use that");
    }

    public void TimeStop()
    {
        throw new Exception("Can't use that");
    }
}

class Summoner : SpecialPower
{
    public void FireAttack()
    {
        throw new Exception("Can't use that");
    }

    public void SummonAMonster()
    {

    }

    public void TimeStop()
    {
        throw new Exception("Can't use that");
    }
}

class GrandMage : SpecialPower
{
    public void FireAttack()
    {

    }

    public void SummonAMonster()
    {

    }

    public void TimeStop()
    {

    }
}

El problema aquí es que todos implementa la misma interfaz y realmente todo los magos no pueden hacer todo los poderes a excepción del GranMage (que es el mago más experimentado). Lo mejor que podemos hacer es dividir nuestra interfaz grande, en mini interfaces de esta manera podemos asignar comportamiento a quien queramos.

Nuestro código mejorado quedaría así:

interface IFireSpell
{
    void FireAttack();
}

interface ISummonSpell
{
    void SummonAMonster();
}

interface ITimeStopSpell
{
    void TimeStop();
}

class FireMage : IFireSpell
{
    public void FireAttack()
    {

    }
}

class Summoner : ISummonSpell
{
    public void SummonAMonster()
    {

    }
}

class GrandMage : ITimeStopSpell, IFireSpell, ISummonSpell
{
    public void FireAttack()
    {

    }

public void SummonAMonster()
{

}

    public void TimeStop()
    {

    }
}

De esta manera si en un futuro queremos agregar un hechizo más solo debemos crear otra interface y luego nosotros decidiremos quien lo va a implementar.

¿Te gustó nuestra publicación?
Suscríbete a nuestro boletín