Il mio esempio viola l'LSP?

0

Considera questo esempio:

public class SimpleValidator
{
    public virtual bool InRange(int x)
    {
        return x >= 6 && x <=12;
    }
}

public class OffsetAwareValidator : SimpleValidator
{
    int offset = 0;

    public OffsetAwareValidator(int offset)
    {
        this.offset = offset;
    }

    public override bool InRange(int x)
    {
        var num = x + offset;
        return num >= 6 && num <= 12;
    }
}

Ora, ovviamente, new OffsetAwareValidator(0) avrà lo stesso identico comportamento di SimpleValidator. Tuttavia, quando l'offset non è zero, alcuni valori che superano la convalida in OffsetAwareValidator non lo passerebbero in SimpleValidator .

Questa è una violazione di LSP?

    
posta Grzegorz Sławecki 04.03.2016 - 13:17
fonte

1 risposta

4

L'unico modo in cui questo viola il LSP è se il contratto per SimpleValidator richiede che restituisca le stesse risposte per gli stessi input.

Se il contratto è meramente, "deve restituire true o false, mai throw e non ha effetti collaterali", quindi LSP non è rotto.

- In risposta a un commento -

Se si inverte la gerarchia dell'ereditarietà, si elimina completamente la necessità di SimpleValidator (attenzione: non conosco C #, sto solo ipotizzando la sintassi):

public class Validator {
    int offset = 0;

    public static Validator SimpleValidator() {
        return Validator(0);
    }

    public Validator(int offset) {
        this.offset = offset;
    }

    public bool InRange(int x) {
        var num = x + offset;
        return 6 <= num && num <= 12;
    }
}
    
risposta data 04.03.2016 - 13:25
fonte

Leggi altre domande sui tag