防止状态耦合?

时间:2012-02-16 15:27:23

标签: ruby-on-rails oop design-patterns state decoupling

我有以下对象和关系,

Lecture >- Tests
Test >- Questions

业务规则

When the lecture is started, a test can be given
If a test is being given, questions can be asked

推断

Therefore questions shouldn't be asked if the lecture hasn't been started.

问题模型

class Question
  belongs_to :test
  belongs_to :lecture, :through => :test

  def ask_question
    raise "Test not started!" unless test.started?
    raise "Lecture not started!" unless lecture.started?
  end
end

很明显,问题模型的状态现在与测试和类的状态相关联。

在创建单元测试时,为了测试这一点,我需要设置所有这种状态,这非常难以处理,尤其是在业务案例变得越来越复杂时。

我该如何避免这种情况?

1 个答案:

答案 0 :(得分:2)

我没有体验过Ruby关联,但在我看来,数据模型在某种程度上与运行时逻辑相结合。

如果我为问题和测试制作数据模型,我想在测试中重复使用我的问题,并在讲座中重复使用准备好的测试(问题集)。在那种情况下,我会写一些类似

的内容
class Lecture
  has_and_belongs_to_many :tests
end

class Test
  has_and_belongs_to_many :lectures
  has_and_belongs_to_many :questions
end

class Question
  has_and_belongs_to_many :tests
end

与该结构分开,我有一些与实时讲座,测试,问题和结果概念相对应的结构。结果是试图回答给定学生的实时问题。

我还将“讲座会议状态”的检查“委托”给测试会话。如果由于某种原因无法启动测试会话,则无法启动问题会话。

要对问题会话进行单元测试,您只需要模拟测试会话,对测试会话进行单元测试,然后模拟讲座,等等。

class Lecture_Session
  has_many :tests_sessions
  belongs_to :lecture
end

class Test_Session
  belongs_to :lecture_session
  belongs_to :test
  has_many :question_sessions

  def validate
    raise "Lecture not started!" unless lecture_session.started?
  end
end

class Question_Session
  belongs_to :question
  belongs_to :test_session

  def validate
    raise "Test not started!" unless test_session.started?
  end
end

class Result
  belongs_to :lecture_session
  belongs_to :test_session
  belongs_to :question_session
  belongs_to :student

  def validate
    raise "Question is not active!" unless question_session.active?
  end
end

希望这有帮助。