是否可以将所有变量和方法放在类内部?

时间:2019-04-21 12:38:12

标签: ruby class

很抱歉初学者的问题。我按照快速教程制作了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类包含变量/问题,数组/答案和方法,以便我可以从另一个文件(例如主应用程序文件)中引用它。是否可以将所有这些元素放入类中,以便我可以从另一个文件(主应用程序)中引用它?

是否有更好的方法?我试着在课堂上没有所有内容,但是无法从另一个文件访问不同的元素。

1 个答案:

答案 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.promptanswer = 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”。

我希望这会让您对下一步的工作有所了解。