Differenza tra la singola fonte della verità e il principio della singola responsabilità?

6

Quindi ho appena scoperto il termine unica fonte di verità durante la visione di serie di video sulle interviste ai codici di programmazione.

Da quello che ho capito significava che l'unica fonte di verità è un incapsulamento di qualsiasi tipo di operazione / logica che potrebbe essere utilizzata più volte.

Mi ha ricordato molto strongmente il SRP che è praticamente la stessa cosa in un certo senso che incapsula certe operazioni e / o logica che potrebbe essere utilizzata per più volte.

C'è qualcosa di molto sottile che mi manca qui?

Grazie a tutti per il vostro tempo.

    
posta AvetisG 25.05.2015 - 03:34
fonte

2 risposte

10

Sono due principi diversi. Praticamente l'unica cosa che hanno in comune è la parola "single".

Single Source of Truth è il risultato finale del processo di normalizzare un database. Ogni informazione sull'entità viene memorizzata una volta sola e solo una volta.

L'unica fonte di verità spiega perché mettiamo i clienti in una tabella e i prodotti in un'altra. Associando i clienti ai prodotti, utilizzando una tabella CustomerProducts, evitiamo di archiviare clienti o prodotti in due luoghi diversi e inseriamo invece dei puntatori nella tabella CustomerProducts che puntano a ciascun cliente e prodotto. Questo ci consente anche di associare più clienti a un prodotto e più prodotti a un cliente, senza duplicare informazioni come il nome del prodotto o il suo prezzo.

Avere un'unica Sorgente di Verità (ogni dato è memorizzato in una sola posizione) significa che, quando si modifica quel dato, l'intero sistema vede la stessa modifica nello stesso istante. Contrasto a quello con più fonti di verità, in cui è necessario modificare il dato in tutti i luoghi in cui è memorizzato. Diverse parti del sistema potrebbero visualizzare due valori diversi per lo stesso riferimento, almeno temporaneamente.

Principio di responsabilità singola (SRP) significa che una classe dovrebbe solo avere una responsabilità o una ragione per cambiare. L'esempio che Fowler dà è quello di una classe Modem:

interface Modem
{
    public void dial(String phoneNumber);
    public void hangup();
    public void send(char c);
    public char recv();
}

Questa classe viola SRP, perché ha due principali responsabilità: stabilire una connessione e inviare dati. Per correggere il problema, dividere l'interfaccia in due interfacce diverse: un'interfaccia di connessione e un'interfaccia di comunicazione La prima interfaccia conterrebbe i metodi dial e hangup e la seconda interfaccia conterrà i metodi send e receive.

SRP non è una legge, ma solo un principio. A volte SRP viene violato per comodità o per altri motivi. Lo stesso vale per la normalizzazione del database; a volte i dati sono conservati in una forma denormalizzata (include alcune duplicazioni) per le prestazioni o altri motivi.

Persistenza L'ignoranza è un'altra forma di SRP: una classe non dovrebbe sapere come salvarsi in un archivio dati. Non è una sua responsabilità; è responsabilità di qualche altra classe. In caso contrario, dovresti modificare ogni classe che utilizza l'archivio dati se desideri modificare l'archivio dati in un altro tipo di archivio dati.

    
risposta data 25.05.2015 - 03:49
fonte
7

Umm, no? Sembra che manchi abbastanza distinzioni significative !

Il principio della singola responsabilità non incapsula nulla. Non deduplica i comportamenti / codice / logica. Tutto ciò che dice è che una classe dovrebbe fare una cosa. Puoi ancora avere due classi che fanno la stessa cosa. Il principio è assolutamente perfetto.

L'unica fonte di verità non incapsula nulla. È una linea guida che ti aiuta a chiarire il tuo design. Molto spesso, hai due o più versioni degli stessi dati. Uno in un database, uno in una cache, uno in memoria, uno nel client, uno in un quadrato che si trova su un PC da qualche parte ... Una singola fonte di verità è qualcosa che si designa. Tu dici che uno è quello che vince quando le tue fonti non sono d'accordo. Quella è la verità.

In breve, questi sono decisamente non correlati.

    
risposta data 25.05.2015 - 03:57
fonte

Leggi altre domande sui tag