• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[CR] Obiektowy C++ (#2): Struktura projektu obiektowego

Object Storage Arubacloud
+2 głosów
5,368 wizyt
pytanie zadane 25 kwietnia 2016 w Nasze poradniki przez Mirosław Zelent Nałogowiec (34,750 p.)

CR = Code Review. O co chodzi? Zajrzyj tutaj
Pełna lista wszystkich Code Review? Zajrzyj tutaj

https://www.youtube.com/watch?v=w2BQUXf91ZA

pytanie.h:

#include <iostream>

using namespace std;

class Pytanie
{
   public:

   string tresc;
   string a,b,c,d;
   int nr_pytania;
   string poprawna;
   string odpowiedz;
   int punkt;

   void wczytaj(); //wczytuje pytania z pliku
   void zadaj(); //pokazuje pytanie, czyta odpowiedz
   void sprawdz(); //sprawdza poprawnosc odpowiedzi
};

pytanie.cpp:

#include <iostream>
#include "pytanie.h"
#include <fstream>
#include <cstdlib>

using namespace std;

void Pytanie::wczytaj()
{
   fstream plik;
   plik.open("quiz.txt",ios::in);

   if(plik.good()==false)
   {
      cout<<"Nie udalo sie otworzyc pliku!";
      exit(0);
   }

   int nr_linii=(nr_pytania-1)*6+1;
   int aktualny_nr=1;
   string linia;

   while(getline(plik,linia))
   {
      if(aktualny_nr==nr_linii) tresc=linia;
      if(aktualny_nr==nr_linii+1) a=linia;
      if(aktualny_nr==nr_linii+2) b=linia;
      if(aktualny_nr==nr_linii+3) c=linia;
      if(aktualny_nr==nr_linii+4) d=linia;
      if(aktualny_nr==nr_linii+5) poprawna=linia;
      aktualny_nr++;
   }

   plik.close();

}

void Pytanie::zadaj()
{
   cout<<endl<<tresc<<endl;
   cout<<a<<endl;
   cout<<b<<endl;
   cout<<c<<endl;
   cout<<d<<endl;
   cout<<"------------------------"<<endl;
   cout<<endl<<"Odpowiedz: ";
   cin>>odpowiedz;
}

void Pytanie::sprawdz()
{
   if(odpowiedz==poprawna)
   {
      punkt=1;
   }
   else punkt=0;
}

main.cpp:

#include <iostream>
#include "pytanie.h"

using namespace std;

int main()
{

   Pytanie p[5];
   int suma=0;
   for(int i=0; i<=4; i++)
   {
      p[i].nr_pytania=i+1;
      p[i].wczytaj();
      p[i].zadaj();
      p[i].sprawdz();
      suma+=p[i].punkt;
   }

   cout<<"KONIEC QUIZU! PUNKTY = "<<suma;

   return 0;
}

Paczka z odcinka: POBIERZ​

1 odpowiedź

+3 głosów
odpowiedź 25 kwietnia 2016 przez efiku Szeryf (75,160 p.)
edycja 25 kwietnia 2016 przez efiku

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 :)

komentarz 7 września 2019 przez newguyintown Nowicjusz (100 p.)
To jest forum dla początkujących ludzi a ty nam tu dajesz jakieś zaawansowane (dla  nowych) komendy. Gdyby mógł to zrobić jak najlepiej to pewnie by zrobić tak jak mówisz ale zrobił tak bo to jest forum dla ludzi ułomnych, uczących się dopiero programowania. Nie wiedzą nawet jak logicznie podejść do problemów a co dopiero maksymalizowanie optymalizacji kodu poprzez użycie innych komend.

Podobne pytania

0 głosów
0 odpowiedzi 312 wizyt
pytanie zadane 18 lutego 2017 w C i C++ przez delta_pavonis Początkujący (300 p.)
+1 głos
0 odpowiedzi 2,977 wizyt

92,551 zapytań

141,400 odpowiedzi

319,531 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...