Dobre praktyki programowania ,pytanie też o switcha

0

Obecnie mam napisany program w c++ z brzydko napisaną instrukcją switch, coś w stylu

 switch (zmienna){
        case 1:
           //bardzo długi kod w którym mamy wywołanie jakiś metod oraz menu
            break;
        case 2:
            //bardzo długi kod w którym mamy wywołanie jakiś metod oraz menu
            //następny zagnieżdżony case
            break;

}

Rozumiem że w case 1: oraz w innych powinno być tylko wywołanie metod. Zawsze jednak zastanawiało mnie gdzie funkcje które pokazują jakieś menu oraz oczekują na wybór opcji powinny być zamieszczone.Obecnie mam jeden plik nagłówkowy .h z klasą , plik cpp w którym mam napisane potrzebne funkcje tej klasy oraz Source.cpp w którym mam menu programu w funkcji main, tam właśnie jest ten switch. Czy gdy będę rozdzielał switcha na funkcje to umieścić je nad funkcją main tzn w tym samym pliku?Czy może jest inne lepsze wyjście? Zależy mi żeby ten program nie tylko się kompilował ale również dobrze wyglądał. Szukałem w googlach ale wszystkie przykłady opierały się praktycznie na tych samych switchach z wywołaniem tylko jednej funkcji. Jeżeli by ktoś znał jakąś stronę która zawierała by sporo takich porad jak dobrze programować w C++ to byłbym wdzięczny.

0

zależy jakie to funkcje. opisz szerzej kontekst. np. funkcjonalność odnosnie dodania konta bankowego powinna być w jakieś klasie Bank i w tym switchu powinieneś wywołać np. krótką funkcję która stworzy account (np. z danych pobranych od użytkownika) i doda konta tj bank.createAccount . przy switchu trzeba pamiętać o break . mozna go zastąpić np. ifami, mapą

0

to akurat wiem chodziło mi na przykład co zrobić z taką konstrukcją

case 6:
		{
				  string tablechoose;
				  system("CLS");
				  cin.clear();
				  cout << "Select table" << endl;
				  cout << endl;
				  cout << "Sprzedawca" << endl;
				  cout << "Kierownik" << endl;
				  cout << "Dostawca" << endl;
				  cout << endl;
				  cin >> tablechoose;

				  if (tablechoose == "Sprzedawca")
				  {
					  string colfind, FindToChange, ChangeRowTo, NewRow;
					  system("CLS");
					  connection.DataFromTable("Sprzedawca");
					  cout << "Podaj nazwe kolumny po jakiej chcesz wyszukać wskazany element" << endl;
					  cin >> colfind;
					  cout << "Podaj ID lub nazwisko sprzedawce którego chcesz usunac" << endl;
					  cin >> FindToChange;
					  connection.DeleteRow(colfind, FindToChange, "Sprzedawca");
					  
				  }
				  else
				  if (tablechoose == "Kierownik")
				  {
					  string colfind, FindToChange, ChangeRowTo, NewRow;
					  system("CLS");
					  connection.DataFromTable("Kierownik");
					  cout << "Podaj nazwę kolumny po jakiej chcesz wyszukać wskazany element" << endl;
					  cin >> colfind;
					  cout << "Podaj id lub nazwisko kierownika którego chcesz usunąć" << endl;
					  cin >> FindToChange;
					  connection.DeleteRow(colfind, FindToChange, "Kierownik");
					
				  }
				  else
				  if (tablechoose == Dostawca")
				  {
					  string colfind, FindToChange, ChangeRowTo, NewRow;
					  system("CLS");
					  connection.DataFromTable("Dostawca");
					  cout << "Podaj nazwe kolumny po jakiej chcesz wyszukać wskazany element" << endl;
					  cin >> colfind;
					  cout << "Podaj numer dostawcy którego chcesz usunąć" << endl;
					  cin >> FindToChange;
					  connection.DeleteRow(colfind, FindToChange, "Dostawca");
				
				  }

				  system("pause");
				  break;
		}

np wypisywanie że istnieje tabele Sprzedawca, Kierownik, Dostawca dać do funkcji a tą funkcją zostawić w tym samym pliku czy może lepiej zrobić jeszcze jeden plik .cpp? Chodzi mi ogólnie o skrócenie tego bo wkleiłem tu tylko jeden case,a przy wszystkich się już powoli gubię.

1

Najlepszą praktyką jest rozdzielanie takich potworków na funckje zgodnie z zasadą "od ogółu do szczegółu". Dodatkowo masz mnóstwo (powtórzę: MNÓSTWO) tego samego kodu przy każdym z ifów. Tutaj również należałoby się trzymać zasady Don't Repeat Yourself (DRY).

Generalnie jeśli chodzi o dobry styl kodowania możesz przeczytać "Czysty kod" Martina. Nie musisz stosować się do wszystkiego, ale z doświadczenia wiem, że poszczególne przykłady dadzą Ci trochę do myślenia.

0
case 6:
        {
                  string tablechoose, message;
                  system("CLS");
                  cin.clear();
                  cout << "Select table" << endl;
                  cout << endl;
                  cout << "Sprzedawca" << endl;
                  cout << "Kierownik" << endl;
                  cout << "Dostawca" << endl;
                  cout << endl;
                  cin >> tablechoose;

                  if (tablechoose == "Sprzedawca")
                  {
                      message = "ID lub nazwisko sprzedawcy";
                  }
                  else if (tablechoose == "Kierownik")
                  {
                      message = "ID lub nazwisko kierownika";
                  }
                  else if (tablechoose == "Dostawca")
                  {
                      message = "numer dostawcy";
                  }

                  string colfind, FindToChange, ChangeRowTo, NewRow;
                  system("CLS");
                  connection.DataFromTable(tablechoose);
                  cout << "Podaj nazwe kolumny po jakiej chcesz wyszukać wskazany element" << endl;
                  cin >> colfind;
                  cout << "Podaj " << message << " którego chcesz usunac" << endl;
                  cin >> FindToChange;
                  connection.DeleteRow(colfind, FindToChange, tablechoose);

                  system("pause");
                  break;
        }

Mam nadzieję, że już wiesz o co chodzi.
Poza tym podpisuję się pod tym co napisał @xfin

1 użytkowników online, w tym zalogowanych: 0, gości: 1