Nguyên tắc trách nhiệm duy nhất
("mỗi lớp chỉ nên có một trách nhiệm duy nhất; nói cách khác, mỗi lớp nên có một, và chỉ một, lý do để thay đổi")
Tôi không đồng ý. Tôi nghĩ rằng một phương thức chỉ nên có một lý do để thay đổi và tất cả các phương thức trong một lớp nên có mối quan hệ logic với nhau , nhưng chính lớp đó thực sự có thể làm một số điều (liên quan).
Theo kinh nghiệm của tôi, nguyên tắc này quá thường xuyên được áp dụng quá nhiệt tình và bạn kết thúc với nhiều lớp một phương thức nhỏ. Cả hai cửa hàng nhanh nhẹn mà tôi làm việc đã làm điều này.
Hãy tưởng tượng nếu những người tạo API .Net có loại tâm lý này: thay vì List.Sort (), List.Reverse (), List.Find (), v.v., chúng tôi sẽ có các lớp ListSorter, ListReverser và ListSearcher!
Thay vì tranh luận nữa với SRP (về lý thuyết không phải là khủng khiếp) , tôi sẽ chia sẻ một vài kinh nghiệm lâu đời của tôi:
Tại một nơi tôi làm việc, tôi đã viết một bộ giải lưu lượng tối đa rất đơn giản bao gồm năm lớp: một nút, một đồ thị, một người tạo biểu đồ, một trình giải đồ thị và một lớp để sử dụng trình tạo / giải đồ thị để giải quyết một vấn đề thực tế. Không có gì đặc biệt phức tạp hoặc dài (bộ giải cho đến nay là dài nhất với ~ 150 dòng). Tuy nhiên, quyết định rằng các lớp có quá nhiều "trách nhiệm", vì vậy các đồng nghiệp của tôi đã thiết lập về việc tái cấu trúc mã. Khi chúng được thực hiện, 5 lớp của tôi đã được mở rộng thành 25 lớp, với tổng số dòng mã nhiều hơn gấp ba lần so với ban đầu. Luồng mã không còn rõ ràng nữa, cũng không phải là mục đích của các bài kiểm tra đơn vị mới; Bây giờ tôi đã có một thời gian khó khăn để tìm ra những gì mã của riêng tôi đã làm.
Ở cùng một nơi, hầu hết mọi lớp chỉ có một phương thức duy nhất ("trách nhiệm" duy nhất của nó). Theo dòng chảy trong chương trình là gần như không thể, và hầu hết các bài kiểm tra đơn vị bao gồm kiểm tra rằng lớp này được gọi là mã từ một lớp khác , cả hai mục đích của chúng đều là một bí ẩn đối với tôi. Có hàng trăm lớp học chỉ có hàng chục (IMO) chỉ có hàng chục. Mỗi lớp chỉ làm một "điều" , nhưng ngay cả với các quy ước đặt tên như "AdminUserCreationAtteemorFactory" , rất khó để nói mối quan hệ giữa các lớp.
Ở một nơi khác (cũng có tâm lý chỉ nên có một lớp ), chúng tôi đã cố gắng tối ưu hóa một phương thức chiếm 95% thời gian trong một hoạt động nhất định. Sau khi (khá ngu ngốc) tối ưu hóa nó một chút, tôi chuyển sự chú ý của mình về lý do tại sao nó được gọi là một tỷ lần. Nó đã được gọi trong một vòng lặp trong một lớp ... có phương thức được gọi trong một vòng lặp trong một lớp khác .. cũng được gọi trong một vòng lặp ..
Tất cả đã nói, có năm cấp độ vòng lặp trải rộng trên 13 lớp (nghiêm túc). Điều mà bất kỳ một lớp nào đang thực sự làm là không thể xác định chỉ bằng cách nhìn vào nó - bạn phải phác thảo một biểu đồ tinh thần về phương thức mà nó gọi, và phương thức mà các phương thức đó gọi, v.v. Nếu tất cả đã được gộp thành một phương thức, thì nó sẽ chỉ dài khoảng 70 dòng với phương pháp vấn đề của chúng ta được lồng trong năm cấp độ vòng lặp rõ ràng ngay lập tức.
Yêu cầu của tôi để cấu trúc lại 13 lớp đó thành một lớp đã bị từ chối.