很抱歉初学者的问题。我按照快速教程制作了Ruby Quiz,将对此进行解释。
我创建了一个如下课程:
class Question
attr_accessor :prompt, :answer
def initialize(prompt, answer)
@prompt = prompt
@answer = answer
end
end
然后我创建了一个变量作为问题:
p1 = "What color is an apple?\n(a)red\n(b)orange\n(c)yellow"
然后使用数组存储问题并分配答案:
questions = Question.new(p1, "a")
下面是一个方法:
def run_test(questions)
answer = ""
score = 0
for question in questions
puts question.prompt
answer = gets.chomp()
if answer == question.answer
score += 1
end
end
puts ("You got " + score.to_s + "/" + questions.length().to_s)
end
现在,我想对模块进行一些模块化,以便Question类包含变量/问题,数组/答案和方法,以便我可以从另一个文件(例如主应用程序文件)中引用它。是否可以将所有这些元素放入类中,以便我可以从另一个文件(主应用程序)中引用它?
是否有更好的方法?我试着在课堂上没有所有内容,但是无法从另一个文件访问不同的元素。
答案 0 :(得分:1)
欢迎使用Stack Overflow和Ruby社区!
有更好的方法吗?
在编程方面,总是有其他做事方式,有时被认为更好,有时更糟,这取决于具体情况。最好学习什么是最佳实践,并加以实践,直到它成为您的默认编码方式为止。生活中有许多事物将最佳实践作为准则,而不是规则。
在您的情况下,一切都很好,直到您想导入代码以在另一个项目中重用它为止,所以您选择的抽象不再起作用,这种情况发生了,可以了,现在该重构它了!
现在看您的代码,问题类只是一个荣耀的数据结构,您可以使用哈希{ prompt: '', answer: ''}
来实现类似的效果,这意味着您的类具有数据部分,但没有逻辑部分,我的第一个建议是将答案检查逻辑移至Question类中的方法。
class Question
attr_reader :prompt, :correct_answer
def initialize(prompt, correct_answer)
@prompt = prompt
@correct_answer = correct_answer
end
def score(answer)
return 1 if answer == @correct_answer
return 0
end
end
此方法的好处是,最终您可能会决定执行诸如“此问题值得2分”,“当用户输入(several spaces)c(several spaces)
我想仅视为c
时”这样的操作,并且这将是实现该逻辑的地方。
您可以考虑做的下一件事是引入一个新类,该类代表一个Test / Quiz / Exam。该类负责执行您在run_test
中实现的逻辑。这样,您应该能够导入和重用您的代码。在编写此类课程时,请考虑一下可以进行测试的事情,可以“开始”,“结束”,“回答问题”,“转到下一个问题”等等。
在编程中避免耦合IO和您的代码非常普遍,在这种情况下,IO是puts question.prompt
和answer = gets.chomp()
。
人们可能期望以下API能够正常工作,但这实际上取决于您的喜好和您要实现的目标:
def run_test(quiz)
quiz.questions.each do |question|
puts question.prompt
answer = gets.chomp()
quiz.answer(question, answer)
end
puts ("You got #{quiz.score} / #{quiz.maximum_score}")
end
您会看到,使用这种方法,代码的主要重点是遍历问题并证明IO,如果您正在构建网页,则仍然可以使用Quiz and Question类,将会改变的是如何提示问题以及如何您会得到答案。您向班级消费者隐瞒的是您如何为测试评分,最高分数是多少,人的当前分数是多少?
起草此代码时我想到的其他事项:
-我应该有一种start
方法将分数重置为0吗?
-如果我将问题隐藏在next_question
方法后面,则如果没有其他问题,我可以返回nil
,使用当前方法,可以多次运行run_test
来多次回答测验次并获得所有添加的分数“您得到23/10”。
我希望这会让您对下一步的工作有所了解。