¿Diferencia entre fuente única de verdad y principio de responsabilidad única?


9

Así que me acabo de enterar del término fuente única de verdad mientras veía series de videos sobre entrevistas con códigos de programación.

Por lo que entendí, significaba que la única fuente de verdad es una encapsulación de cualquier tipo de operación / lógica que podría usarse varias veces.

Me recordó mucho al SRP, que es casi lo mismo en el sentido de que encapsula ciertas operaciones y / o lógica que podrían usarse varias veces.

¿Hay algo muy sutil que me estoy perdiendo aquí?

Gracias por su tiempo a todos.

Respuestas:


12

Son dos principios diferentes. Casi lo único que tienen en común es la palabra "soltero".

Single Source of Truth es el resultado final del proceso de normalización de una base de datos. Cada pieza de información de la entidad se almacena una vez, y solo una vez.

Fuente única de la verdad explica por qué ponemos a los clientes en una tabla y los productos en otra. Al asociar clientes con productos, usando una tabla CustomerProducts, evitamos almacenar clientes o productos en dos lugares diferentes, y en su lugar colocamos punteros en la tabla CustomerProducts que apuntan a cada cliente y producto. Esto también nos permite asociar múltiples clientes con un producto, y múltiples productos con un cliente, sin duplicar información como el nombre del producto o su precio.

Tener una única fuente de verdad (cada dato se almacena en un solo lugar) significa que, cuando cambia ese dato, todo el sistema ve el mismo cambio en el mismo instante. Compare eso con múltiples fuentes de verdad, donde tiene que cambiar el dato en todos los lugares donde se almacena. Las diferentes partes del sistema pueden ver dos valores diferentes para el mismo dato, al menos temporalmente.

El Principio de responsabilidad única (SRP) significa que una clase solo debe tener una responsabilidad o una razón para cambiar. El ejemplo que da Fowler es el de una clase de módem:

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

Esta clase viola SRP, porque tiene dos responsabilidades principales: establecer una conexión y enviar datos. Para corregir el problema, dividiría la interfaz en dos interfaces diferentes: una interfaz de conexión y una interfaz de comunicación. La primera interfaz contendría los métodos de marcar y colgar, y la segunda interfaz contendría los métodos de envío y recepción.

SRP no es una ley, sino simplemente un principio. Algunas veces se viola SRP por conveniencia u otras razones. Lo mismo es cierto para la normalización de la base de datos; a veces los datos se mantienen en forma desnormalizada (incluye alguna duplicación) por rendimiento u otras razones.

La ignorancia de persistencia es otra forma de SRP: una clase no debe saber cómo salvarse en un almacén de datos. Esa no es su responsabilidad; Es responsabilidad de otra clase. Si este no fuera el caso, tendría que cambiar cada clase que usa el almacén de datos si desea cambiar el almacén de datos a otro tipo de almacén de datos.


7

¿Umm no? ¡Parece que te faltan distinciones bastante significativas !

El principio de responsabilidad única no encapsula nada. No deduplica ningún comportamiento / código / lógica. Todo lo que dice es que una clase debería hacer una cosa. Todavía puede tener dos clases que hacen lo mismo. El principio está totalmente bien con eso.

La única fuente de verdad no encapsula nada. Es una guía que lo ayuda a aclarar su diseño. Muy a menudo, tiene dos o más versiones de los mismos datos. Uno en una base de datos, uno en un caché, uno en la memoria, uno en el lado del cliente, uno en sqllite sentado en una PC en algún lugar ... Una sola fuente de verdad es algo que usted designa. Dices que uno es el que gana cuando tus fuentes no están de acuerdo. Esa versión es la verdad.

En resumen, estos son decididamente no relacionados.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.