首页 / JAVA / java – 答案对象和面向对象设计
java – 答案对象和面向对象设计
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 答案对象和面向对象设计,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5121字,纯文字阅读大概需要8分钟。
内容图文
![java – 答案对象和面向对象设计](/upload/InfoBanner/zyjiaocheng/728/16ae2314b2af4ade85bc7b1ec009776f.jpg)
我对这个设计有疑问:
public abstract class Answer {
private long id;
private Question question;
public Answer(Question question) {
this.question = question;
}
abstract List<String> getAnswers(){
}
}
子类:
public class SingleAnswer extends Answer {
private String answer;
public SingleAnswer(Question question) {
super(question);
}
public List<String> getAnswer() {
return Collections.singletonList(answer);
}
public void setAnswers(Set<String> answers) {
if(answers.size()!=1)
throw new IllegalArgumentException("You have to provide only one answer");
this.answers = answers;
}
}
public class MultiAnswer extends Answer{
private List<String> answers;
public MultiAnswer(Question question) {
super(question);
}
public List<String> getAnswers() {
return answers;
}
public void setAnswers(Set<String> answers) {
if(answers.isEmpty())
throw new IllegalArgumentException("You have to provide at least one answer");
this.answers = answers;
}
}
MultiAnswer对象可以有多个答案(如复选框),而SingleAnswer对象只能有单个答案(如开放问题的答案,或单个选择a,b,c,d问题).
现在,我想获取Answer对象列表并找出他们有什么答案,并将它们用于比较.我为了目的而制作抽象方法List getAnswers(),但我怀疑这是否是一个好的设计,因为SingleAnswer只能保存一个值/答案,并且方法getAnswers的签名表明SingleAnswer可以返回多个答案.
这是好的解决方案还是可以用不同的方式解决?
更新:
我正在编写一些问题的映射器,可以在网站上找到(比如在线问卷,工作机会网站等)我想要保存在数据库中.然后当用户回答这个问题时,应用程序应在网站上填写表格并自动发送.
因此,当用户回答问题时,我需要将这些问题从数据库映射到网站上的表单,这就是为什么我想使用方法ListgetAnswers()在网站上使用Answer对象中的适当值填充表单.
以下是一些代码:
public void populateFormElements(List<FormElement> elements, ProfileData data){
for(FormElement element:elements){
//find by question
Optional<Answer> answer= data.getAnswerList().stream().filter(a->a.getQuestion().equals(element.getQuestion())).findAny();
if(answer.isPresent()){
element.setValue(answer.get().getAnswers());
}
}
}
这是FormElement的示例:
public class RadioElement extends FormElement {
private String identifier;
private String label;
private String value;
private final Set<String> options;
@Override
public Collection<String> getAvailableOptions() {
return Collections.unmodifiableCollection(options);
}
@Override
public void setValue(List<String> values) {
if(values.size()!=1)
throw new IllegalArgumentException("Too many answers. Only one answer required");
if(options.contains(values.get(0))
this.value=value;
else
throw new IllegalArgumentException("Argument has not been found in available options");
}
@Override
public Map<String, String> generateParameters() {
if(value==null)
throw new IllegalArgumentException("Value is not set");
return Collections.singletonMap(identifier,value);
}
@Override
public Question getQuestion() {
SelectQuestion question=new SelectQuestion();
question.setQuestion(label);
options.forEach(question::addAnswer);
return question;
}
这是Question对象.我使用方法答案答案(字符串…答案)来创建和验证答案.
public abstract class Question {
private long id;
private String question;
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public abstract Answer answer(String...answers);
}
public class SelectQuestion extends Question {
private Set<String> possibleAnswers=new HashSet<>();
@Override
public Answer answer(String... answers) {
if(answers.length!=1)
throw new IllegalArgumentException("Only single answer!");
if(!possibleAnswers.contains(answers[0]))
throw new IllegalArgumentException("Answer not available in possible options");
SingleAnswer answer=new SingleAnswer(this);
answer.setAnswer(answers[0]);
return answer;
}
}
public class OpenQuestion extends Question {
@Override
public Answer answer(String... answers) {
if(answers.length!=1)
throw new IllegalArgumentException("Only single answer!");
SingleAnswer answer=new SingleAnswer(this);
answer.setAnswer(answers[0]);
return answer;
}
}
public class MultiSelectQuestion extends Question {
private Set<String> possibleAnswers=new HashSet<>();
@Override
public Answer answer(String... answers) {
if(answers.length>possibleAnswers.size())
throw new IllegalArgumentException("You provided too many answers");
Set<String> answersTemp=new HashSet<>();
for(String answer:answers)
if(!possibleAnswers.contains(answer))
throw new IllegalArgumentException("Not in possible answers");
else
answersTemp.add(answer);
MultiAnswer answer=new MultiAnswer(this);
answer.setAnswers(answersTemp);
return answer;
}
}
我想知道,如果方法getAnswers()为SingleAnswer返回size = 1的答案列表是好的吗?因为从阅读方法签名我们可以认为SingleAnswer可以返回多个答案.或者也许我对此过分思考?
解决方法:
在抽象基类中定义它:
abstract List<String> getAnswers();
本身并不好或坏.
根据您的需要:
Now, I want get list of Answer objects List and find out what answers
they have and use them for some comparison.
我认为你应该问自己的问题是如何在提交的答案和预期答案之间进行比较,无论答案子类是什么.
首先,您的模型不区分已提交和预期的答案.所以你应该考虑一下.
完成后,您可以通过在Answer基类中添加一个逻辑方法来处理比较问题:boolean isSubmitedAnswerMatch(),您可以在子类的构造函数中保留详细实现(String或List< String>以获得答案).
通过这种方式,Answer基类保持高水平的抽象.
内容总结
以上是互联网集市为您收集整理的java – 答案对象和面向对象设计全部内容,希望文章能够帮你解决java – 答案对象和面向对象设计所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。