Ví dụ, giả sử bạn có một ứng dụng với một lớp được chia sẻ rộng rãi được gọi là User
. Lớp này hiển thị tất cả thông tin về người dùng, Id, tên, mức độ truy cập của họ đối với từng mô-đun, múi giờ, v.v.
Dữ liệu người dùng rõ ràng được tham chiếu rộng rãi trên toàn hệ thống, nhưng vì lý do nào, hệ thống được thiết lập để thay vì chuyển đối tượng người dùng này vào các lớp phụ thuộc vào nó, chúng ta chỉ chuyển các thuộc tính riêng lẻ từ nó.
Một lớp yêu cầu id người dùng, đơn giản sẽ yêu cầu GUID userId
làm tham số, đôi khi chúng ta cũng có thể cần tên người dùng, do đó, nó được truyền vào dưới dạng một tham số riêng. Trong một số trường hợp, điều này được truyền cho các phương thức riêng lẻ, vì vậy các giá trị không được giữ ở cấp độ lớp.
Mỗi lần tôi cần truy cập vào một phần thông tin khác nhau từ lớp Người dùng, tôi phải thay đổi bằng cách thêm tham số và khi thêm quá tải mới là không phù hợp, tôi cũng phải thay đổi mọi tham chiếu đến phương thức hoặc trình xây dựng lớp.
Người dùng chỉ là một ví dụ. Điều này được thực hành rộng rãi trong mã của chúng tôi.
Tôi có đúng không khi nghĩ đây là vi phạm nguyên tắc Mở / Đóng? Không chỉ là hành động thay đổi các lớp hiện có, mà còn thiết lập chúng ở nơi đầu tiên để những thay đổi rộng rãi rất có thể sẽ được yêu cầu trong tương lai?
Nếu chúng ta chỉ truyền vào User
đối tượng, tôi có thể tạo một thay đổi nhỏ cho lớp tôi đang làm việc. Nếu tôi phải thêm một tham số, tôi có thể phải thực hiện hàng tá thay đổi đối với các tham chiếu đến lớp.
Có bất kỳ nguyên tắc khác bị phá vỡ bởi thực hành này? Phụ thuộc đảo ngược có lẽ? Mặc dù chúng tôi không đề cập đến một sự trừu tượng, nhưng chỉ có một loại người dùng, vì vậy không có nhu cầu thực sự để có giao diện Người dùng.
Có những nguyên tắc khác, không RẮN bị vi phạm, chẳng hạn như các nguyên tắc lập trình phòng thủ cơ bản?
Nếu nhà xây dựng của tôi trông như thế này:
MyConstructor(GUID userid, String username)
Hoặc này:
MyConstructor(User theUser)
Đã đăng nó:
Nó đã được đề xuất rằng câu hỏi được trả lời trong "Pass ID hoặc Object?". Điều này không trả lời cho câu hỏi làm thế nào quyết định đi theo một trong hai cách ảnh hưởng đến nỗ lực tuân theo các nguyên tắc RẮN, vốn là cốt lõi của câu hỏi này.
I
trong SOLID
? MyConstructor
về cơ bản nói bây giờ "Tôi cần một Guid
và một string
". Vậy tại sao không có một giao diện cung cấp a Guid
và a string
, hãy User
thực hiện giao diện đó và để MyConstructor
phụ thuộc vào một thể hiện thực hiện giao diện đó? Và nếu nhu cầu MyConstructor
thay đổi, hãy thay đổi giao diện. - Nó giúp tôi rất nhiều khi nghĩ đến các giao diện để "thuộc về" người tiêu dùng hơn là nhà cung cấp . Vì vậy, hãy nghĩ rằng "với tư cách là một người tiêu dùng tôi cần một cái gì đó làm điều này và điều đó" thay vì "như một nhà cung cấp tôi có thể làm điều này và điều đó".