İşte basitleştirilmiş bir gereksinim:
Kullanıcı
Question
birden çokAnswer
s ile bir oluşturur .Question
en az bir tane olmalıdırAnswer
.Açıklama: düşünün
Question
veAnswer
bir testte olduğu gibi : bir soru var, ancak birkaç cevap var, azın doğru olabilir. Kullanıcı bu testi hazırlayan aktördür, bu nedenle soru ve cevaplar oluşturur.
Bu basit örneği modellemeye çalışıyorum, böylece 1) gerçek hayat modelini eşleştirin 2) kod ile ifade etmek, böylece olası yanlış kullanım ve hataları en aza indirmek ve geliştiricilere modelin nasıl kullanılacağına dair ipuçları vermek için.
Soru bir varlık , cevap ise değer nesnesidir . Soru cevapları tutar. Şimdiye kadar bu olası çözümlere sahibim.
[A] fabrika içindeQuestion
Answer
Manuel olarak oluşturmak yerine şunları çağırabiliriz:
Answer answer = question.createAnswer()
answer.setText("");
...
Yani bir cevap oluşturur ve bu soruya ekleyin. Sonra cevabı özelliklerini ayarlayarak değiştirebiliriz. Bu şekilde, sadece sorular bir cevabı kesebilir. Ayrıca, soru olmadan bir cevap almayı da engelliyoruz. Ancak, bunun kodlanması zor olduğu için cevaplar oluşturma üzerinde kontrolümüz yoktur Question
.
Yukarıdaki kodun “dili” ile ilgili bir problem de vardır. Soru değil cevaplar yaratan kullanıcıdır. Şahsen, değer nesnesi oluşturmamızı sevmiyorum ve geliştiriciye değerlerle doldurmak için bağlıyım - ne eklemek gerektiğinden nasıl emin olabilirim?
[B] Fabrika içinde Soru, # 2 almak
Bazıları bu tür bir yöntem olması gerektiğini söylüyor Question
:
question.addAnswer(String answer, boolean correct, int level....);
Yukarıdaki çözüme benzer şekilde, bu yöntem cevap için zorunlu verileri alır ve soruya da eklenecek olanı oluşturur.
Burada sorun , yapıcısını iyi bir sebep olmadan çoğaltmamızdırAnswer
. Ayrıca, soru gerçekten bir cevap yaratıyor mu?
[C] Yapıcı bağımlılıkları
Her iki nesneyi kendimiz tarafından yaratmakta özgür olalım. Yapıcıda bağımlılık hakkını da ifade edelim:
Question q = new Question(...);
Answer a = new Answer(q, ...); // answer can't exist without a question
Bu, geliştiriciye ipuçları verir, çünkü cevap bir soru olmadan oluşturulamaz. Ancak, cevabın soruya 'eklendiğini söyleyen' dili 'görmüyoruz. Öte yandan, gerçekten görmemiz gerekiyor mu?
[D] Yapıcı bağımlılığı, # 2 al
Bunun tam tersini yapabiliriz:
Answer a1 = new Answer("",...);
Answer a2 = new Answer("",...);
Question q = new Question("", a1, a2);
Bu yukarıdakilerin tam tersi bir durumdur. Burada cevaplar bir soru olmadan (mantıklı değil) var olabilir, ancak soru cevap olmadan (mantıklı) var olamaz. Ayrıca, 'dil' burada olacağı soru üzerine daha açıktır sahip cevapları.
[E] Ortak yol
Ben ortak yolu, ppl genellikle yapmak ilk şey budur:
Question q = new Question("",...);
Answer a = new Answer("",...);
q.addAnswer(a);
hem cevap hem de soru birbirleri olmadan var olabileceğinden, iki cevabın 'gevşek' versiyonudur. Bunu hiçbir özel ipucu yoktur sahip bunları birbirine bağlamak için.
[F] Kombine
Ya da C, D, E - 'yi bir araya getirerek ilişkinin nasıl yapılabileceğinin tüm yollarını kapsayacak şekilde birleştirmeliyim, böylece geliştiricilerin kendileri için en iyi olanı kullanmalarına yardımcı olmak için.
Soru
İnsanların yukarıdaki cevaplardan birini 'önseziye' göre seçebileceklerini biliyorum. Ama yukarıdaki varyantlardan herhangi birinin diğerinden daha iyi olup olmadığını merak ediyorum. Ayrıca, lütfen yukarıdaki sorunun içinde düşünmeyin, burada çoğu durumda uygulanabilecek bazı en iyi uygulamaları sıkmak istiyorum - ve kabul ederseniz, bazı varlıkların yaratılış vakalarının çoğu benzerdir. Ayrıca, burada teknoloji agnostik olalım, örneğin. ORM'in kullanılıp kullanılmayacağını düşünmek istemiyorum. Sadece iyi, etkileyici mod istiyorum.
Bunun hakkında bilgelik var mı?
DÜZENLE
Lütfen sorusunun diğer özelliklerini göz ardı edin Question
ve Answer
bunlar ilgili değildir. Yukarıdaki metni düzenledim ve (gerektiğinde) kurucuların çoğunu değiştirdim: şimdi gerekli özellik değerlerinden herhangi birini kabul ediyorlar. Bu sadece bir soru dizesi veya farklı dillerdeki, durumlardaki vb. Dizelerin haritası olabilir - hangi özellikler geçilirse geçirilsin, bunlar için bir odak noktası değildir;) Öyleyse, aksi belirtilmedikçe, gerekli parametreleri geçmenin üstünde olduğumuzu varsayalım. Thanx!