Diferença entre fonte única de verdade e princípio de responsabilidade única?


9

Acabei de descobrir o termo fonte única de verdade enquanto assistia a uma série de vídeos sobre programação de entrevistas de código.

Pelo que entendi, isso significava que a única fonte da verdade é um encapsulamento de qualquer tipo de operação / lógica que possa ser usada várias vezes.

Isso me lembrou fortemente o SRP, que é praticamente a mesma coisa, no sentido de encapsular determinadas operações e / ou lógica que podem ser usadas várias vezes.

Há algo muito sutil que estou perdendo aqui?

Obrigado a todos por seu tempo.

Respostas:


12

Eles são dois princípios diferentes. Praticamente a única coisa que eles têm em comum é a palavra "solteiro".

Fonte Única da Verdade é o resultado final do processo de normalização de um banco de dados. Todas as informações da entidade são armazenadas uma vez e apenas uma vez.

Fonte Única da Verdade explica por que colocamos Clientes em uma tabela e Produtos em outra. Ao associar clientes a produtos, usando uma tabela CustomerProducts, evitamos armazenar clientes ou produtos em dois locais diferentes e, em vez disso, colocamos ponteiros na tabela CustomerProducts que apontam para cada cliente e produto. Isso também nos permite associar vários clientes a um produto e vários produtos a um cliente, sem duplicar informações como o nome do produto ou seu preço.

Ter uma única fonte de verdade (cada dado é armazenado em apenas um local) significa que, quando você altera esse dado, todo o sistema vê a mesma alteração no mesmo instante. Compare isso com várias fontes de verdade, nas quais você deve alterar o dado em todos os locais onde ele está armazenado. Diferentes partes do sistema podem ver dois valores diferentes para o mesmo dado, pelo menos temporariamente.

Princípio de responsabilidade única (SRP) significa que uma classe deve ter apenas uma responsabilidade ou um motivo para mudar. O exemplo que Fowler dá é o de uma classe Modem:

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

Essa classe viola o SRP, porque possui duas responsabilidades principais: estabelecer uma conexão e enviar dados. Para corrigir o problema, você dividiria a interface em duas interfaces diferentes: uma interface de conexão e uma interface de comunicação. A primeira interface conteria os métodos de discagem e interrupção, e a segunda interface conteria os métodos de envio e recebimento.

O SRP não é uma lei, mas apenas um princípio. Às vezes, o SRP é violado por conveniência ou por outros motivos. O mesmo se aplica à normalização do banco de dados; Às vezes, os dados são mantidos em uma forma desnormalizada (inclui alguma duplicação) por desempenho ou outros motivos.

A ignorância de persistência é outra forma de SRP: uma classe não deve ter conhecimento de como se salvar em um armazenamento de dados. Essa não é sua responsabilidade; é responsabilidade de outra classe. Não fosse esse o caso, você teria que alterar todas as classes que usam o armazenamento de dados, se desejasse alterar o armazenamento de dados para outro tipo de armazenamento de dados.


7

Umm não? Você parece estar perdendo distinções bastante significativas !

O princípio da responsabilidade única não encapsula nada. Ele não deduplica nenhum comportamento / código / lógica. Tudo o que diz é que uma classe deve fazer uma coisa. Você ainda pode ter duas classes que fazem a mesma coisa. O princípio é totalmente bom com isso.

A única fonte da verdade não encapsula nada. É uma diretriz que ajuda a esclarecer seu design. Muitas vezes, você tem duas ou mais versões dos mesmos dados. Um em um banco de dados, um em cache, um na memória, um no lado do cliente, um no sqllite sentado em um PC em algum lugar ... Uma única fonte de verdade é algo que você designa. Você diz que é aquele que vence quando suas fontes discordam. Essa versão é a verdade.

Em suma, estes são decididamente independentes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.