Quali principi SOLID sono infranti da questo diagramma di classe?

1

Ho appena letto di tutti i 5 principi S, O, L, I, D e mi piace testarlo in un piccolo esempio se li capisco correttamente.

Quali principi SOLID sono feriti da questo diagramma di classe?

Penso che ciò che è rotto è Principio di sostituzione di Liskov perché se prendiamo la classe superiore Libro e la sostituiamo con la sua classe inferiore E-book quindi l'applicazione che abbiamo qui smetterà di funzionare perché non c'è modo / funzione per accedere a ogni altra classe, entrambe le classi qui hanno solo le proprie funzioni e il gioco è fatto. Per lo stesso motivo, anche il principio Principio di inversione delle dipendenze dovrebbe essere danneggiato da questo diagramma di classe perché non esiste alcun oggetto di interfaccia per comunicare con le classi date qui.

Penso che gli altri principi non siano offensivi.

    
posta tenepolis 17.11.2018 - 21:51
fonte

2 risposte

7

L'unico principio che non è rispettato qui è Principio di segregazione dell'interfaccia : E-book eredita stock e replenishStock() che sono assolutamente inutili per un libro elettronico.

Se vuoi avere una corretta separazione delle interfacce, avrai bisogno di qualcosa come la seguente, dove Book descrive un contenuto, e PaperBook ed e-Book corrispondono a oggetti vendibili con il contenuto generico:

Nel tuo diagramma, non c'è nulla di sbagliato nel principio di sostituzione di Liskov, dal momento che e-Book è una specializzazione di Book , e quindi ha l'interfaccia completa di Book (è implicito). Ovviamente, stock e replenishStock() non hanno molto senso, ma nulla ci dice che il contratto non è rispettato (ad esempio il replenishStock potrebbe benissimo impostare lo stock su un valore arbitrario elevato e soddisfare tutte le precondizioni, post-condizioni e invarianti).

L'inversione delle dipendenze non è rilevante qui.

    
risposta data 18.11.2018 - 00:27
fonte
2

La maggior parte dei "principi" in SOLID (che sono più simili alle linee guida nella maggior parte dei casi) sono molto dipendenti dal contesto, e non possiamo davvero vedere se sono violati dal sistema che descrivi perché non abbiamo molto contesto .

Ad esempio:

  • Non possiamo dire se hai violato il principio di responsabilità singola, perché determinare cosa è e cosa non è una responsabilità di un pezzo di codice richiede la comprensione di come viene specificato quel codice e di come tali specifiche possano cambiare in futuro. Se gestire i livelli delle scorte può cambiare indipendentemente dal modo in cui sono descritti i singoli articoli, allora raggrupparli nello stesso modulo potrebbe essere una violazione di SRP. Ma se entrambe sono conseguenze della stessa specifica (ad esempio perché si ha un unico fornitore e la descrizione è nello stesso formato fornito dal fornitore, quindi qualsiasi modifica a una è probabile che implichi anche una modifica dell'altro), allora SRP non viene violato qui.

  • La validità del Principio Aperto / Chiuso dipende strongmente da cosa sono i client di un pezzo di codice e se sono considerati parte dello stesso modulo (e quindi è probabile che evolvano insieme, vengano testati insieme, e così via) o diversi (a questo punto la stabilità fornita da OCP può diventare molto importante), quindi senza sapere come vengono effettivamente utilizzati gli oggetti del libro non possiamo stabilire se questo è violato.

  • Interfaccia La segregazione dipende ancora da cosa sono i client di un oggetto, non da ciò che fa l'oggetto stesso. Mentre la risposta di Christophe identifica una probabile violazione di questo, è solo in realtà una violazione se ci sono moduli separati nel tuo sistema che userebbero le interfacce separate che propone. Se c'è solo un singolo modulo che accede a libri o ebook, e usa sempre tutte le strutture che descrivi, non c'è violazione.

  • L'inversione di dipendenza richiede che gli oggetti dettagliati dipendano dalle astrazioni piuttosto che viceversa, ma tutti gli oggetti che descrivi hanno un livello di astrazione simile. Dovremmo vedere una descrizione molto più ampia di come il tuo sistema usa questi oggetti per sapere se il DIP è soddisfatto o meno.

Ho saltato la sostituzione di Liskov dalla lista sopra, perché la considero davvero una categoria diversa. I quattro principi sopra riportati sono linee guida progettuali utili. LSP causa quasi sempre seri problemi quando viene violato. È una regola molto meno soggettiva. Ma dipende anche dal comportamento dettagliato dei tuoi oggetti. Se il tuo oggetto ebook ha un comportamento valido per tutti i metodi inclusi negli oggetti del tuo libro, allora LSP non viene violato. Ma se un client di oggetti libro potrebbe fallire a causa degli oggetti ebook che gestiscono le scorte in modo incompatibile (ad esempio), LSP viene violato. Molto dipende da quali sono gli effetti collaterali osservabili dei vostri metodi e anche da come sono documentati come funzionanti.

Di tutti loro, penso che LSP sia il più probabile a essere violato nel sistema che descrivi, perché non riesco a vedere un modo ragionevole in cui un ebook possa implementare il metodo replenishStocks() che non potrebbe causare alcun client non è stato scritto pensando agli ebook di fallire. E come sottolinea Christophe, anche l'ISP è probabilmente violato. Gli altri, in realtà non abbiamo abbastanza informazioni per sapere.

Per inciso, i principi SOLID non contengono linee guida che hanno lo scopo di promuovere la semplicità del codice. Per le applicazioni del mondo reale, dovrebbero essere sempre utilizzati insieme a tali linee guida (e con la consapevolezza che in molti casi saranno in conflitto con loro, e che spetta a te come progettista di sistemi di elaborare quale dovrebbe avere la priorità). Le regole per il design semplice di Kent Beck sono un buon punto di partenza.

    
risposta data 19.11.2018 - 05:58
fonte

Leggi altre domande sui tag