Sự khác biệt giữa nguồn duy nhất của sự thật và nguyên tắc trách nhiệm duy nhất?


9

Vì vậy, tôi chỉ tìm hiểu về thuật ngữ nguồn duy nhất trong khi xem loạt video về các cuộc phỏng vấn mã lập trình.

Từ những gì tôi hiểu, điều đó có nghĩa là nguồn sự thật duy nhất là sự gói gọn của bất kỳ loại hoạt động / logic nào có thể được sử dụng nhiều lần.

Nó nhắc nhở tôi rất mạnh về SRP , điều tương tự như vậy theo nghĩa là nó gói gọn các hoạt động và / hoặc logic nhất định có thể được sử dụng nhiều lần.

Có một cái gì đó rất tinh tế mà tôi đang thiếu ở đây?

Cảm ơn bạn đã dành thời gian cho tôi.

Câu trả lời:


12

Chúng là hai nguyên tắc khác nhau. Khá nhiều thứ duy nhất họ có chung là từ "độc thân".

Nguồn duy nhất của sự thật là kết quả cuối cùng của quá trình bình thường hóa cơ sở dữ liệu. Mỗi mẩu thông tin thực thể được lưu trữ một lần và chỉ một lần.

Nguồn duy nhất của sự thật giải thích lý do tại sao chúng tôi đặt Khách hàng vào một bảng và Sản phẩm ở một bảng khác. Bằng cách liên kết khách hàng với các sản phẩm, sử dụng bảng Khách hàng, chúng tôi tránh lưu trữ khách hàng hoặc sản phẩm ở hai nơi khác nhau và thay vào đó hãy đặt con trỏ vào bảng Khách hàng cho từng khách hàng và sản phẩm. Điều này cũng cho phép chúng tôi liên kết nhiều khách hàng với một sản phẩm và nhiều sản phẩm với một khách hàng mà không trùng lặp thông tin như tên sản phẩm hoặc giá của sản phẩm đó.

Có một Nguồn Sự thật duy nhất (mỗi mốc thời gian được lưu trữ ở một nơi duy nhất) có nghĩa là, khi bạn thay đổi mốc thời gian đó, toàn bộ hệ thống sẽ thấy cùng một thay đổi cùng một lúc. Ngược lại với nhiều nguồn sự thật, nơi bạn phải thay đổi mốc thời gian ở tất cả những nơi nó được lưu trữ. Các phần khác nhau của hệ thống có thể thấy hai giá trị khác nhau cho cùng một mốc thời gian, ít nhất là tạm thời.

Nguyên tắc trách nhiệm duy nhất (SRP) có nghĩa là một lớp chỉ nên có một trách nhiệm hoặc một lý do để thay đổi. Ví dụ mà Fowler đưa ra là của lớp Modem:

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

Lớp này vi phạm SRP, vì nó có hai trách nhiệm chính: thiết lập kết nối và gửi dữ liệu. Để khắc phục sự cố, bạn sẽ chia giao diện thành hai giao diện khác nhau: giao diện kết nối và giao diện truyền thông. Giao diện đầu tiên sẽ chứa các phương thức quay số và gác máy, và giao diện thứ hai sẽ chứa các phương thức gửi và nhận.

SRP không phải là một luật, mà chỉ là một nguyên tắc. Đôi khi SRP bị vi phạm vì sự thuận tiện hoặc lý do khác. Điều tương tự cũng đúng với chuẩn hóa cơ sở dữ liệu; đôi khi dữ liệu được giữ ở dạng không chuẩn hóa (bao gồm một số sao chép) vì hiệu suất hoặc các lý do khác.

Sự thiếu hiểu biết dai dẳng là một dạng khác của SRP: một lớp nên không có kiến ​​thức về cách tự lưu vào kho lưu trữ dữ liệu. Đó không phải là trách nhiệm của nó; đó là trách nhiệm của một số lớp khác. Nếu đây không phải là trường hợp, bạn sẽ phải thay đổi mọi lớp sử dụng kho lưu trữ dữ liệu nếu bạn muốn thay đổi kho lưu trữ dữ liệu thành một số loại lưu trữ dữ liệu khác.


7

Ừm ... không? Bạn dường như đang thiếu sự phân biệt khá đáng kể !

Nguyên tắc trách nhiệm duy nhất không gói gọn bất cứ điều gì. Nó không sao chép bất kỳ hành vi / mã / logic. Tất cả những gì nó nói là một lớp nên làm một việc. Bạn vẫn có thể có hai lớp làm điều tương tự. Nguyên tắc là hoàn toàn tốt với điều đó.

Nguồn duy nhất của sự thật không gói gọn bất cứ điều gì. Đó là một hướng dẫn giúp bạn làm rõ thiết kế của bạn. Rất thường xuyên, bạn có hai hoặc nhiều phiên bản của cùng một dữ liệu. Một trong cơ sở dữ liệu, một trong bộ nhớ cache, một trong bộ nhớ, một trong các máy khách, một trong sqllite ngồi trên PC ở đâu đó ... Nguồn sự thật duy nhất là thứ bạn chỉ định. Bạn nói rằng một là chiến thắng khi nguồn của bạn không đồng ý. Phiên bản đó là sự thật.

Nói tóm lại, những điều này được quyết định không liên quan.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.