Sostituzione di Liskov e classi astratte / modello di strategia

2

Sto cercando di seguire LSP nella programmazione pratica. E mi chiedo se diversi costruttori di sottoclassi lo violano. Sarebbe bello ascoltare una spiegazione invece di solo sì / no. Grazie mille!

P.S. Se la risposta è no , come faccio a fare strategie diverse con input diversi senza violare LSP?

class IStrategy
{
    public:
        virtual void use() = 0;
};

class FooStrategy : public IStrategy
{
    public:
        FooStrategy(A a, B b) { c = /* some operations with a, b */ }
        virtual void use() { std::cout << c; }
    private:
        C c;
};

class BarStrategy : public IStrategy
{
    public:
        BarStrategy(D d, E e) { f = /* some operations with d, e */ }
        virtual void use() { std::cout << f; }
    private:
        F f;
};
    
posta Kolyunya 10.12.2012 - 08:11
fonte

2 risposte

10

Generalmente i costruttori non sono considerati parte del Principio di sostituzione di Liskov (LSP). LSP con oggetti, non classi:

What is wanted here is something like the following substitution property: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T. (quoted this PDF file)

Poiché un oggetto non esiste fino a dopo la costruzione, il costruttore stesso è in genere considerato fuori ambito. L'LSP vuole che tutte le sottoclassi si comportino allo stesso modo. Come arrivano a quel comportamento è una questione diversa.

Questo significa che il tuo esempio di codice non viola la LSP di per sé. Il costruttore e i metodi privati non fanno parte del contratto pubblico se visualizzati da una prospettiva LSP.

Ricorda che LSP va molto oltre le firme delle funzioni. Se un genitore lancia un'eccezione in un caso specifico, così dovrebbero fare i bambini. Se un genitore non ha figli, non può iniziare a lanciare le esecuzioni all'improvviso, se una funzione getStock in un genitore restituisce un intero, un bambino non può iniziare a restituire oggetti di magazzino, ecc. Ecc.

L'LSP riguarda ogni aspetto del comportamento pubblico di un oggetto.

Una soluzione comune alla creazione di strategie con diversi costruttori è comunque il modello di fabbrica.

    
risposta data 10.12.2012 - 08:53
fonte
4

TL; DR: diversi costruttori di sottotipi non sono solo ok, sono previsti.

Liskov affronta direttamente l'uso di diversi costruttori nella sua carta Sottotipizzazione comportamentale usando invarianti e vincoli che è la formalizzazione del principio.

".. omettendo i creatori [dalla specifica del tipo] è facile per un tipo avere più implementazioni, consentire l'aggiunta di nuovi creator in seguito e riflettere l'uso comune"

Questo dimostra che i costruttori alternativi nel sottotipo non sono solo ok, ma attesi. Inoltre è ulteriormente trattato esplicitamente nel riassunto del documento.

    
risposta data 03.08.2015 - 00:24
fonte