Aqui está um requisito simplificado:
O usuário cria um
Question
com váriosAnswer
s.Question
deve ter pelo menos umAnswer
.Esclarecimento: pense
Question
eAnswer
como em um teste : há uma pergunta, mas várias respostas, onde poucas podem estar corretas. Usuário é o ator que está preparando este teste, portanto, ele cria perguntas e respostas.
Estou tentando modelar este exemplo simples para 1) corresponder ao modelo da vida real 2) para ser expressivo com o código, para minimizar possíveis usos indevidos e erros e dar dicas aos desenvolvedores sobre como usar o modelo.
Pergunta é uma entidade , enquanto resposta é objeto de valor . A pergunta contém respostas. Até agora, eu tenho essas soluções possíveis.
[A] fábrica dentroQuestion
Em vez de criar Answer
manualmente, podemos chamar:
Answer answer = question.createAnswer()
answer.setText("");
...
Isso criará uma resposta e a adicionará à pergunta. Em seguida, podemos manipular a resposta definindo suas propriedades. Dessa forma, apenas perguntas podem criar uma resposta. Além disso, evitamos ter uma resposta sem uma pergunta. No entanto, não temos controle sobre a criação de respostas, pois isso é codificado no Question
.
Há também um problema com o 'idioma' do código acima. Usuário é quem cria respostas, não a pergunta. Pessoalmente, não gosto de criar objetos de valor e, dependendo do desenvolvedor, preenchê-los com valores - como ele pode ter certeza do que é necessário adicionar?
[B] Fábrica dentro da pergunta, pegue a # 2
Alguns dizem que devemos ter esse tipo de método em Question
:
question.addAnswer(String answer, boolean correct, int level....);
Semelhante à solução acima, esse método utiliza dados obrigatórios para a resposta e cria um que também será adicionado à pergunta.
O problema aqui é que duplicamos o construtor do Answer
sem nenhuma boa razão. Além disso, a pergunta realmente cria uma resposta?
Dependências do construtor [C]
Sejamos livres para criar os dois objetos por nós mesmos. Vamos também expressar a dependência correta no construtor:
Question q = new Question(...);
Answer a = new Answer(q, ...); // answer can't exist without a question
Isso fornece dicas para o desenvolvedor, pois a resposta não pode ser criada sem uma pergunta. No entanto, não vemos o 'idioma' que diz que a resposta é 'adicionada' à pergunta. Por outro lado, precisamos mesmo vê-lo?
[D] Dependência de construtor, pegue # 2
Podemos fazer o oposto:
Answer a1 = new Answer("",...);
Answer a2 = new Answer("",...);
Question q = new Question("", a1, a2);
Esta é a situação oposta de cima. Aqui as respostas podem existir sem uma pergunta (que não faz sentido), mas a pergunta não pode existir sem resposta (que faz sentido). Além disso, a 'linguagem' aqui é mais clara sobre essa questão vai ter as respostas.
[E] maneira comum
Isto é o que chamo de maneira comum, a primeira coisa que as pessoas costumam fazer:
Question q = new Question("",...);
Answer a = new Answer("",...);
q.addAnswer(a);
que é a versão 'solta' das duas respostas acima, já que a resposta e a pergunta podem existir uma sem a outra. Não há nenhum indício especial que você tem para uni-los.
[F] Combinado
Ou devo combinar C, D, E - para cobrir todas as maneiras pelas quais o relacionamento pode ser feito, para ajudar os desenvolvedores a usar o que é melhor para eles.
Questão
Eu sei que as pessoas podem escolher uma das respostas acima com base no 'palpite'. Mas eu me pergunto se alguma das variantes acima é melhor que a outra com uma boa razão para isso. Além disso, não pense na pergunta acima. Gostaria de incluir aqui algumas práticas recomendadas que podem ser aplicadas na maioria dos casos - e, se você concordar, na maioria dos casos de uso de criação, algumas entidades são semelhantes. Além disso, vamos tornar a tecnologia independente aqui, por exemplo. Não quero pensar se o ORM será usado ou não. Só quero um modo expressivo e bom.
Alguma sabedoria nisso?
EDITAR
Ignore outras propriedades de Question
e Answer
, elas não são relevantes para a pergunta. Editei o texto acima e alterei a maioria dos construtores (onde necessário): agora eles aceitam qualquer um dos valores de propriedade necessários. Isso pode ser apenas uma sequência de perguntas ou um mapa de sequências em diferentes idiomas, status etc. - quaisquer que sejam as propriedades passadas, elas não são o foco disso;) Portanto, assuma que estamos acima de passar os parâmetros necessários, a menos que sejam diferentes. Thanx!