Tôi còn khá mới với các nguyên tắc thiết kế RẮN . Tôi hiểu nguyên nhân và lợi ích của chúng, nhưng tôi không áp dụng chúng cho một dự án nhỏ hơn mà tôi muốn tái cấu trúc như một bài tập thực tế để sử dụng các nguyên tắc RẮN. Tôi biết không cần phải thay đổi một ứng dụng hoạt động hoàn hảo, nhưng dù sao tôi cũng muốn cấu trúc lại nó để tôi có được kinh nghiệm thiết kế cho các dự án trong tương lai.
Ứng dụng này có nhiệm vụ sau (thực tế nhiều hơn thế nhưng hãy đơn giản hóa): Nó phải đọc một tệp XML chứa các định nghĩa Bảng / Cột / Xem cơ sở dữ liệu và tạo một tệp SQL có thể được sử dụng để tạo một lược đồ cơ sở dữ liệu ORACLE.
(Lưu ý: Vui lòng không thảo luận về lý do tại sao tôi cần nó hoặc tại sao tôi không sử dụng XSLT, v.v., có những lý do, nhưng chúng không có chủ đề.)
Khi bắt đầu, tôi chọn chỉ nhìn vào Bảng và ràng buộc. Nếu bạn bỏ qua các cột, bạn có thể nêu nó theo cách sau:
Ràng buộc là một phần của bảng (hay chính xác hơn là một phần của câu lệnh CREATE TABLE) và một ràng buộc cũng có thể tham chiếu một bảng khác.
Đầu tiên, tôi sẽ giải thích ứng dụng trông như thế nào ngay bây giờ (không áp dụng RẮN):
Hiện tại, ứng dụng này có một lớp "Bảng" chứa danh sách các con trỏ tới các ràng buộc thuộc sở hữu của bảng và một danh sách các con trỏ tới các ràng buộc tham chiếu bảng này. Bất cứ khi nào một kết nối được thiết lập, kết nối ngược cũng sẽ được thiết lập. Bảng này có một phương thức createStatement () mà lần lượt gọi hàm createdStatement () của mỗi ràng buộc. Phương thức đã nói sẽ tự sử dụng các kết nối đến bảng chủ sở hữu và bảng được tham chiếu để truy xuất tên của chúng.
Rõ ràng, điều này hoàn toàn không áp dụng cho RẮN. Ví dụ, có các phụ thuộc vòng tròn, làm phồng mã theo các phương thức "thêm" / "loại bỏ" cần thiết và một số hàm hủy đối tượng lớn.
Vì vậy, có một vài câu hỏi:
- Tôi có nên giải quyết các phụ thuộc vòng tròn bằng cách sử dụng Dependency Injection? Nếu vậy, tôi cho rằng ràng buộc sẽ nhận được bảng của chủ sở hữu (và tùy chọn là tham chiếu) trong hàm tạo của nó. Nhưng làm thế nào tôi có thể chạy qua danh sách các ràng buộc cho một bảng sau đó?
- Nếu lớp Bảng vừa lưu trữ trạng thái của chính nó (ví dụ như tên bảng, nhận xét bảng, v.v.) và các liên kết đến các ràng buộc, thì đây có phải là một hoặc hai "trách nhiệm", nghĩ về Nguyên tắc Trách nhiệm duy nhất không?
- Trong trường hợp 2. đúng, tôi có nên tạo một lớp mới trong lớp nghiệp vụ logic quản lý các liên kết không? Nếu vậy, 1. rõ ràng sẽ không còn phù hợp.
- Các phương thức "createStatement" có nên là một phần của các lớp Bảng / Ràng buộc hay tôi cũng nên chuyển chúng ra? Nếu vậy thì ở đâu? Một lớp Manager cho mỗi lớp lưu trữ dữ liệu (ví dụ: Bảng, ràng buộc, ...)? Hay đúng hơn là tạo một lớp người quản lý cho mỗi liên kết (tương tự như 3.)?
Bất cứ khi nào tôi cố gắng trả lời một trong những câu hỏi này, tôi thấy mình đang chạy trong vòng tròn ở đâu đó.
Vấn đề rõ ràng trở nên phức tạp hơn rất nhiều nếu bạn bao gồm các cột, chỉ mục, v.v., nhưng nếu các bạn giúp tôi làm điều đơn giản với Bảng / Ràng buộc, tôi có thể tự mình giải quyết phần còn lại.