Tôi viết rất nhiều mã bao gồm ba bước cơ bản.
- Lấy dữ liệu từ một nơi nào đó.
- Chuyển đổi dữ liệu đó.
- Đặt dữ liệu đó ở đâu đó.
Tôi thường kết thúc bằng ba loại lớp học - lấy cảm hứng từ các mẫu thiết kế tương ứng của chúng.
- Các nhà máy - để xây dựng một đối tượng từ một số tài nguyên.
- Hòa giải - để sử dụng nhà máy, thực hiện chuyển đổi, sau đó sử dụng chỉ huy.
- Chỉ huy - để đặt dữ liệu đó ở một nơi khác.
Các lớp học của tôi có xu hướng khá nhỏ, thường là một phương thức (công khai), ví dụ: lấy dữ liệu, chuyển đổi dữ liệu, thực hiện công việc, lưu dữ liệu. Điều này dẫn đến sự gia tăng của các lớp học, nhưng nói chung hoạt động tốt.
Nơi tôi đấu tranh là khi tôi đến thử nghiệm, cuối cùng tôi sẽ kết hợp chặt chẽ các bài kiểm tra. Ví dụ;
- Nhà máy - đọc các tập tin từ đĩa.
- Chỉ huy - ghi tập tin vào đĩa.
Tôi không thể kiểm tra cái này mà không có cái kia. Tôi có thể viết mã 'kiểm tra' bổ sung để đọc / ghi đĩa, nhưng sau đó tôi đang lặp lại.
Nhìn vào .Net, lớp File có một cách tiếp cận khác, nó kết hợp các trách nhiệm (của tôi) nhà máy và chỉ huy với nhau. Nó có các chức năng Tạo, Xóa, Tồn tại và Đọc tất cả ở một nơi.
Tôi có nên tìm cách làm theo ví dụ về .Net và kết hợp - đặc biệt là khi xử lý các tài nguyên bên ngoài - các lớp của tôi với nhau không? Mã nó vẫn được ghép nối, nhưng nó có chủ ý hơn - nó xảy ra ở lần thực hiện ban đầu, thay vì trong các thử nghiệm.
Có phải vấn đề của tôi ở đây là tôi đã áp dụng Nguyên tắc Trách nhiệm Đơn lẻ một cách quá nhiệt tình? Tôi có các lớp riêng chịu trách nhiệm đọc và viết. Khi tôi có thể có một lớp kết hợp chịu trách nhiệm xử lý một tài nguyên cụ thể, ví dụ như đĩa hệ thống.
Looking at .Net, the File class takes a different approach, it combines the responsibilities (of my) factory and commander together. It has functions for Create, Delete, Exists, and Read all in one place.
- Lưu ý rằng bạn đang kết hợp "trách nhiệm" với "việc cần làm". Một trách nhiệm giống như một "lĩnh vực quan tâm." Trách nhiệm của lớp Tệp là thực hiện các thao tác tệp.
File
thư viện của bạn từ C # là, đối với tất cả những gì chúng ta biết, File
lớp chỉ có thể là một mặt tiền, đặt tất cả các hoạt động tệp vào một nơi duy nhất - vào lớp, nhưng có thể sử dụng một lớp đọc / ghi tương tự cho lớp của bạn. thực sự chứa logic phức tạp hơn để xử lý tập tin. Lớp như vậy File
vẫn sẽ tuân thủ SRP, bởi vì quá trình thực sự làm việc với hệ thống tập tin sẽ được trừu tượng hóa sau một lớp khác - rất có thể với giao diện hợp nhất. Không nói đó là trường hợp, nhưng nó có thể. :)