Đây là một yêu cầu đơn giản:
Người dùng tạo một
Question
với nhiềuAnswer
s.Question
phải có ít nhất mộtAnswer
.Làm rõ: suy nghĩ
Question
vàAnswer
như trong một bài kiểm tra : có một câu hỏi, nhưng một vài câu trả lời, trong đó ít có thể đúng. Người dùng là diễn viên đang chuẩn bị bài kiểm tra này, do đó anh ta tạo ra câu hỏi và câu trả lời.
Tôi đang cố gắng mô hình hóa ví dụ đơn giản này để 1) khớp với mô hình thực tế 2) để biểu cảm với mã, để giảm thiểu lạm dụng và lỗi tiềm ẩn và đưa ra gợi ý cho các nhà phát triển cách sử dụng mô hình.
Câu hỏi là một thực thể , trong khi câu trả lời là đối tượng giá trị . Câu hỏi giữ câu trả lời. Cho đến nay, tôi có những giải pháp có thể.
[A] Nhà máy bên trongQuestion
Thay vì tạo Answer
thủ công, chúng ta có thể gọi:
Answer answer = question.createAnswer()
answer.setText("");
...
Điều đó sẽ tạo ra một câu trả lời và thêm nó vào câu hỏi. Sau đó, chúng ta có thể thao tác trả lời bằng cách đặt thuộc tính của nó. Bằng cách này, chỉ có câu hỏi có thể tạo ra một câu trả lời. Ngoài ra, chúng tôi ngăn chặn để có một câu trả lời mà không có câu hỏi. Tuy nhiên, chúng tôi không có quyền kiểm soát việc tạo câu trả lời, vì đó là mã hóa cứng trong Question
.
Cũng có một vấn đề với 'ngôn ngữ' của đoạn mã trên. Người dùng là người tạo ra câu trả lời, không phải câu hỏi. Cá nhân, tôi không thích chúng tôi tạo đối tượng giá trị và tùy thuộc vào nhà phát triển để điền vào giá trị đó - làm thế nào anh ta có thể chắc chắn những gì được yêu cầu để thêm?
[B] Nhà máy bên trong Câu hỏi, lấy số 2
Một số người nói rằng chúng ta nên có loại phương pháp này trong Question
:
question.addAnswer(String answer, boolean correct, int level....);
Tương tự như giải pháp trên, phương pháp này lấy dữ liệu bắt buộc cho câu trả lời và tạo một dữ liệu cũng sẽ được thêm vào câu hỏi.
Vấn đề ở đây là chúng tôi nhân đôi các nhà xây dựng của Answer
không có lý do chính đáng. Ngoài ra, câu hỏi có thực sự tạo ra một câu trả lời?
[C] Phụ thuộc nhà xây dựng
Chúng ta hãy tự do tạo cả hai đối tượng bằng chính mình. Chúng ta cũng thể hiện sự phụ thuộc ngay trong hàm tạo:
Question q = new Question(...);
Answer a = new Answer(q, ...); // answer can't exist without a question
Điều này đưa ra gợi ý cho nhà phát triển, vì câu trả lời không thể được tạo mà không có câu hỏi. Tuy nhiên, chúng tôi không thấy "ngôn ngữ" nói rằng câu trả lời là "được thêm" vào câu hỏi. Mặt khác, chúng ta có thực sự cần phải nhìn thấy nó?
[D] Phụ thuộc nhà xây dựng, lấy số 2
Chúng ta có thể làm ngược lại:
Answer a1 = new Answer("",...);
Answer a2 = new Answer("",...);
Question q = new Question("", a1, a2);
Đây là tình huống ngược lại ở trên. Ở đây câu trả lời có thể tồn tại mà không có câu hỏi (không có ý nghĩa), nhưng câu hỏi không thể tồn tại mà không có câu trả lời (có ý nghĩa). Ngoài ra, "ngôn ngữ" ở đây rõ ràng hơn về câu hỏi đó sẽ có câu trả lời.
[E] Cách thông thường
Đây là những gì tôi gọi là cách phổ biến, điều đầu tiên mà ppl thường làm:
Question q = new Question("",...);
Answer a = new Answer("",...);
q.addAnswer(a);
đó là phiên bản 'lỏng lẻo' của hai câu trả lời trên, vì cả câu trả lời và câu hỏi có thể tồn tại mà không có nhau. Không có gợi ý đặc biệt rằng bạn phải liên kết chúng lại với nhau.
[F] Kết hợp
Hoặc tôi nên kết hợp C, D, E - để bao quát tất cả các cách tạo mối quan hệ, để giúp các nhà phát triển sử dụng bất cứ điều gì tốt nhất cho họ.
Câu hỏi
Tôi biết mọi người có thể chọn một trong những câu trả lời trên dựa trên 'linh cảm'. Nhưng tôi tự hỏi nếu bất kỳ biến thể ở trên là tốt hơn thì biến thể khác với một lý do tốt cho điều đó. Ngoài ra, xin đừng nghĩ bên trong câu hỏi trên, tôi muốn áp dụng ở đây một số thực tiễn tốt nhất có thể áp dụng cho hầu hết các trường hợp - và nếu bạn đồng ý, hầu hết các trường hợp sử dụng tạo một số thực thể đều tương tự nhau. Ngoài ra, hãy để bất khả tri công nghệ ở đây, ví dụ. Tôi không muốn nghĩ liệu ORM sẽ được sử dụng hay không. Chỉ muốn tốt, chế độ biểu cảm.
Bất kỳ sự khôn ngoan về điều này?
BIÊN TẬP
Vui lòng bỏ qua các thuộc tính khác của Question
và Answer
, chúng không liên quan đến câu hỏi. Tôi đã chỉnh sửa văn bản trên và thay đổi hầu hết các hàm tạo (khi cần): bây giờ họ chấp nhận bất kỳ giá trị thuộc tính cần thiết nào cần thiết. Đó có thể chỉ là một chuỗi câu hỏi hoặc bản đồ của các chuỗi trong các ngôn ngữ, trạng thái khác nhau, v.v. - bất kỳ thuộc tính nào được thông qua, chúng không phải là trọng tâm cho điều này;) Vì vậy, giả sử chúng ta ở trên vượt qua các tham số cần thiết, trừ khi nói khác nhau. Thanx!