2012-02-16 1 views
1

J'ai les objets et les relations suivantes,Empêcher le couplage d'état?

Lecture >- Tests 
Test >- Questions 

règles d'affaires

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

inférents

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

Question Modèle

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 

Il est donc clair que l'état du modèle de question est maintenant couplé à l'état de test et de classe.

Lors de la création de tests unitaires, pour tester cela, j'ai besoin de mettre en place tout cet état, ce qui devient assez compliqué, d'autant plus que les cas d'affaires deviennent de plus en plus compliqués.

Comment puis-je éviter cela?

Répondre

2

Je ne suis pas expérimenté avec les associations Ruby, mais il me semble qu'en quelque sorte le modèle de données est cofused avec la logique d'exécution ici. Si je devais faire un modèle de données pour les questions et les tests, je voudrais réutiliser mes questions à travers les tests et réutiliser les tests préparés (ensembles de questions) à travers les conférences. Dans ce cas, j'écrirait quelque chose comme

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 

Indépendamment de cette structure que j'aurais une structure correspondant à des conférences en temps réel, des tests, des questions et une notion de résultat. Un résultat est une tentative de répondre à une question en temps réel par un étudiant donné.

Je "déléguerais" également la vérification de l'état de la session de lecture à la session de test. Si la session de test ne peut pas être démarrée pour une raison quelconque, la session de questions ne peut pas être démarrée aussi. Pour tester une unité de session de questions, il vous suffit de simuler une session de test, de tester à l'unité une session de test dont vous aurez besoin pour simuler une session de cours, etc.

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 

Espérons que cela aide.