To może ja zacznę, zapewne ktoś tu zaraz wrzuci lepszy kod.
Zacznijmy od tego, że w tym wypadku podejście obiektowe jest złe i nie należy tak pisać kodu, bo łatwo można stworzyć Boskie klasy.
Co jest złego w klasie Pytanie? To co ona robi.
Klasa pytanie robi wszystko, czego nie powinna robić.
void wczytaj(); //wczytuje pytania z pliku
void zadaj(); //pokazuje pytanie, czyta odpowiedz
void sprawdz(); //sprawdza poprawnosc odpowiedzi
Jak można to lepiej zrobić? Zacznijmy od zmiany nazwy z Pytanie na Question.
Niech klasa Question będzie encją:
Question:
- - number // define question unique number
- - array of Answers // vector, ( Entity Answer: →questionNumber, answer, isGood)
- - point // point for question
- - getPoint
- - getNumber
- - getAnswers
- - set** // Constructor or Setters
Teraz możemy zrobić klasę Vaildatora, która będzie miała metodę
checkQuestion( Question &question, userChoice)
Zwróci true lub false jeśli odpowiedz będzie błędna:
question->getAnswers()->getByKey(userchoice)->isGood; // method body
Osobna klasa powinna zajmować się ładowaniem pytań, osobna klasa powinna zajmować się zapisem pytań oraz sumowaniem punktów za dobrą odpowiedź na zadane pytanie. Takie rozbicie pozwala na łatwe skalowanie aplikacji / modyfikacje różnego fragmentu kodu.
Można dla wygody i lepszej organizacji dodać do klasy Answer składową o nazwie questionNumber, która będzie przechowywać numer pytania. Wtedy możemy powiedzieć, że dane odpowiedzi są do tego pytania.
Na logikę, sprawdzamy czy odpowiedź do zadanego pytania jest poprawna, nie pytanie ;)
Już nie wspomnę, że takie rozbicie klas sprzyja TDD :)