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

Konstrukcja kodu - Czy robię to dobrze

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
499 wizyt
pytanie zadane 7 listopada 2015 w C i C++ przez aki3130pl Nowicjusz (140 p.)

Witajcie, mam kod symulatora bankomatu który zrobiłem i który działa w 99 procent (brak ogranicznika przy przelewaniu pieniędzy przez co można nabić nieskończenie ujemne saldo, ale zaraz to dopiszę). 

 

Kod działa, ale chcę żebyście rzucili okiem i powiedzieli mi, czy sposób w który go zbudowałem jest akceptowalny.. Jedyne co wiem, że robię źle to wcięcia i goto x; (ale nie wiedziałem jak wracać do funkcji menu głównego, a na internecie znalazłem, że to jeden z niepolecanych, ale najprostszych sposobów, więc stwierdziłem, że na początek starczy.)

 

Pierwszy cout to ASCI ART, dodany dla zabawy :)

+ Czy zaawansowani "kodersi" dodawają sobie komentarze do kodu? // czy to raczej lamerskie?

+ Czy długość kodu, a raczej pustych wierszy ma znaczenie na wydajność kodu?

 

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <stdio.h>

using namespace std;
string opcja;
int stan = 2000;

bool zalogowano=false;
int proby=0;

int main()
{
    while(!zalogowano&&proby<3)
    {

        cout <<" _______  _______  __    _  ___   _    ___   __    _  _______ \n|  _    ||   _   ||  |  | ||   | | |  |   | |  |  | ||       |\n| |_|   ||  |_|  ||   |_| ||   |_| |  |   | |   |_| ||    ___|\n|       ||       ||       ||      _|  |   | |       ||   | __ \n|  _   | |       ||  _    ||     |_   |   | |  _    ||   ||  |\n| |_|   ||   _   || | |   ||    _  |  |   | | | |   ||   |_| |\n|_______||__| |__||_|  |__||___| |_|  |___| |_|  |__||_______|\n\n\n";
        Sleep(1500);
        system("cls");
        cout << "Witamy w banku. \nProsimy o autoryzacje: \n \n";
        string login,haslo;
        cout << "Login: ";
        cin >> login;
        cout << "Haslo: ";
        cin >> haslo;

    if(login=="wachu"&&haslo=="test")
    {
        zalogowano=true;
        system("cls");
        x:
        {
            cout << "\n Menu wyboru: \n 1. Przelew \n 2. Wplata \n 3. Wyplata \n 4. Stan konta \n 5. Kredyt \n 6. Wyloguj\n\n";
            cout << "[Stan konta: " << stan << " zl]\n\n";
            cout << "\nWybierz opcje: ";
            cin >> opcja;
        }
        if(opcja=="przelew"||opcja=="Przelew"||opcja=="1")
        {   int ile; string target;
            cout << "Ile pieniedzy przelac: ";
            cin >> ile;
            cout << "Na jaki rachunek przeslac pieniadze: ";
            cin >> target;
            cout << "Czy na pewno chcesz przelac " << ile << " zlotych na rachunek " << target << "?\n";
            cout << "Wybor: ";
            string choice;
            cin >> choice;
            if (choice=="tak"||choice=="Tak")
            {
                stan=stan-ile;
                system("cls");
                cout << "Prosze czekac. Trwa autoryzacja przelewu. \n ";
                Sleep(2000);
                cout << "\n \nPrzelew udany. \n \nNastepuje powrot do menu.";
                Sleep(2000);
                system("cls");
                goto x;
            }}
            }
            else
            {
                cout << "Anulowano przelew. \n \n Nastepuje powrot do menu.";
            }
            if(opcja=="Wplata"||opcja=="wplata"||opcja=="2")
        {   int ile;
            cout << "Ile pieniedzy wplacic: ";
            cin >> ile;
            cout << "Czy na pewno chcesz wplacic " << ile << " zlotych na swoj rachunek " << "?\n";
            cout << "Wybor: ";
            string choice;
            cin >> choice;
            if (choice=="tak")
            {
                system("cls");
                cout << "Prosze czekac. Trwa autoryzacja wplaty. \n";
                Sleep(2000);
                cout << "\n \nWplata udana. \n \nNastepuje powrot do menu.";
                Sleep(2000);
                system("cls");
                goto x;

            }
            else
            {
                cout << "Anulowano wplate. \n \n Nastepuje powrot do menu.";
                goto x;
            }
        } // if wplaty
            if(opcja=="Wyplata"||opcja=="wyplata"||opcja=="3")
            {
            int ile;
            cout << "Ile pieniedzy wyplacic: ";
            cin >> ile;
            cout << "Czy na pewno chcesz wyplacic " << ile << " zlotych ze swojego rachunku " << "?\n";
            cout << "Wybor: ";
            string choice;
            cin >> choice;
            if(choice=="tak"||choice=="Tak")
            {
                system("cls");
                cout << "Prosze czekac. Trwa autoryzacja wyplaty. \n";
                Sleep(2000);
                cout << "\n \nWyplata udana. \n \nNastepuje powrot do menu.";
                Sleep(2000);
                system("cls");
                goto x;
            }
            else
            {
                system("cls");
                cout << "Anulowano wylate. \n \nNastepuje powrot do menu.";
                Sleep(2000);
                system("cls");
                goto x;
            }
            }
             if(opcja=="stan konta"||opcja=="stankonta"||opcja=="4")
    {
        cout << "Twoj stan konta wynosi: " << stan << " zlotych.";
        Sleep(4000);
        system("cls");
        goto x;
    }
    if(opcja=="kredyt"||opcja=="Kredyt"||opcja=="5")
    {
        system("cls");
        cout << "Warunki kredytu: \n \n";
        cout << "1. Kredyt moga wziac tylko osoby ze stanem konta powyzej 10zl.\n (Wynika to z ochrony phishingowej)\n";
        cout << "2. Kredyt udzielany jest wylacznie osobom pelnoletnim. \n (Konta junior nie moga uzyskac kredytu)\n";
        cout << "3. Kredyt jest udzielany maksymalnie na 24 raty.\n";
        cout << "4. Oprocentowanie wynosi 4% przez pierwszy rok. \n";
        cout << "5. Maksymalna kwota kredytu wynosi 5 tysiecy zlotych. \n \n \n";
        Sleep(1000);
        string akceptacja;
        cout << "Czy akceptujesz warunki kredytu: ";
        cin >> akceptacja; if(opcja=="stan konta"||opcja=="stankonta"||opcja=="4")
    {
        cout << "Twoj stan konta wynosi: " << stan << " zlotych.";
        Sleep(2000);
        goto x;
    }
        if(akceptacja=="tak"||akceptacja=="Tak")
        {
            int kwota;
            cout << "Podaj kwote kredytu: ";
            cin >> kwota;
            if(kwota<=5000)
            {
                stan=stan+kwota;
                cout << "Kredyt zostal udzielony. \n \nTwoj aktualny stan konta wynosi:" << stan << " zlotych.";
                Sleep(2000);
                system("cls");
                cout << "Nastepuje przejscie do menu wyboru.";
                goto x;

            }
        }
        else
        {
            cout << "Nie zaakceptowano warunkow umowy. \nNastapi powrot do menu wyboru.";
            goto x;
        }

    }
        if(opcja=="wyloguj"||opcja=="Wyloguj"||opcja=="6")
        {
            system("cls");
             cout << "Dziekujemy za skorzystanie z uslug naszego banku. \n\nZapraszamy ponownie.";
             Sleep(2000);
             break;
        }
    else
    {
        proby++;
        cout << "Nie udalo sie zalogowac." << " \nTo twoja " << proby << " proba." << endl;
    }
   }  // klamka od petli


    return 0;
} // klamra maina

 

5 odpowiedzi

+1 głos
odpowiedź 7 listopada 2015 przez event15 Szeryf (93,790 p.)
Odnośnie komentarzy.

Generalnie ich się nie stosuje - praktycznie nigdy. Co innego komentarze typu doc (/**  */) z dwiema * przy rozpoczęciu.

Czemu się nie stosuje? Bo powinno z góry się pisać kod zrozumiały i czytelny. Podzielony na proste kawałki, które wykonują tylko jedno zadanie.

Spórz na swoje nazwy zmiennych:
opcja, ile, choice, akceptacja, proby, stan

Czy one coś mówią o wykorzystaniu programu? Na ich podstawie mógłbyś powiedzieć co robi ten program? Raczej wątpię. Do tego zmieszałeś polskie nazwy z angielską. Jeśli byś napisał to w sposób czytelny to byłoby to dużo lepsze rozwiązanie.

Ja jestem zwolennikiem braku bloku else w kodzie. Ale to juz inna kwestia.
komentarz 7 listopada 2015 przez aki3130pl Nowicjusz (140 p.)
Rozumiem i dziękuję. Mam jeszcze jedno pytanie. Mam okazję odkupić symfonię C++ za niewielką cenę, czy opłaca się w dzisiejszych czasach jeszcze ją czytać? Bo jakiś czas temu się zastanawiałem, ale na forum ludzie pisali, że niestety, ale jest już stara, czy w tej książce jest wytłumaczony ten  język w jakiś sposób przyjazny dla ludzi?

 

Niedawno próbowałem nauczyć się pythona, ale książka "zanurkuj w pythonie" mnie zniechęciła, bo dosłownie nurkowała w kodzie już od pierwszych stron i się gubiłem :)
0 głosów
odpowiedź 7 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 7 listopada 2015 przez Dorion300
1.Wszystko uwalone w Mainie, przez co kod staje się nie czytelny.
Przez co można zrobić strukturalnie a nawet obiektowo.
2.Jeśli wszystko jest uwalone w mainie to nie ma potrzebny robić zmienne globalne.
3. Goto? używanie Goto w trochę wyżach językach programowania jest niepotrzebne.
komentarz 7 listopada 2015 przez aki3130pl Nowicjusz (140 p.)
Uczę się trzeci dzień, kiedyś próbowałem, ale się zniechęciłem. Teraz się uczę z kursów Pana Mirosława Zelenta, jestem na czwartym odcinku i jak dotąd wszystko robione było tylko w funkcji main.

 

Dziękuję za krytykę, przyda się, idę dalej ćwiczyć :)
komentarz 7 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
Ale jak na początek to nawet dobrze ci idzie.

Ale nie polecam używana Goto, szczególnie podczas nauki gdyż się nauczysz złych nawyków które ci wcale nie pomogą w dużych programach.
0 głosów
odpowiedź 7 listopada 2015 przez niezalogowany
Nie używaj goto. Zamiast tego użyj pętli i funkcji.
0 głosów
odpowiedź 7 listopada 2015 przez adrian17 Mentor (350,400 p.)

Czy zaawansowani "kodersi" dodawają sobie komentarze do kodu? // czy to raczej lamerskie?

To tak jak nazywanie dokumentacji, podręczników, Wikipedii lamerskimi. Jeśli komentarz pomoże Tobie lub komuś innemu za 5 lat zrozumieć co kod ma robić, to jest przydatny.

Czy długość kodu, a raczej pustych wierszy ma znaczenie na wydajność kodu?

Kompilatora interesuje co kod ma robić, nie to jak jest napisany.

komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
Tendencja jest taka, że im dłuższy staż w programowaniu tym mniej komentarzy a więcej czytelnego kodu. Z czasem kod jest na tyle czytelny i zrozumiały, że można go czytać po prostu i wiedzieć wszystko co się dzieje.

Ja unikam komentowania - jeżeli coś wymaga komentarza to znaczy że jest niewystarczająco zrozumiałe albo wykorzystuje głupie hacki które mogą źle się skońćzyć.
komentarz 7 listopada 2015 przez adrian17 Mentor (350,400 p.)
Nie wszystko da się zrozumieć magicznie z kodu bez komentarzy, ba, często komentarze nie wystarczą i trzeba pisać dokumentację wewnętrzną - niezależnie od tego, jak czysto i idiomatycznie napiszesz kod. Lepiej założyć że za rok nie będziesz pracował nad tym kodem a ktoś inny będzie rzucał obelgami na coś co Tobie wydawało się czytelnym i oczywistym rozwiązaniem - jeśli go porządnie nie opiszesz.

Plus, z tego co napisałeś można by wnioskować że twórcy niektórych części GCC czy Clanga mają bardzo krótki staż i wsadzają masę hacków :P https://github.com/llvm-mirror/clang/blob/master/lib/Parse/ParseExpr.cpp#L689
komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
Przykro mi, ale chyba nie miałeś do czynienia z dobrym kodem.

Da się zrobić tak, aby nie było potrzeba komentarzy.

Kiedy ma się kod pokryty testami i kod stworzony odpowiednio to nie potrzeba żadnej dokumentacji praktycznie, dokumentacją są przeprowadzone testy od jednostkowych przez integracyjne, a kończąc na akceptacyjnych czy beta.
komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
Swoją drogą uważam C++'owców za bardzo niechlujnych programistów. W ich programach najczęściej się znajdzie różne zmienne typu e, dat, nop, n, T itp.
komentarz 7 listopada 2015 przez adrian17 Mentor (350,400 p.)

Może i nie widziałem. Mimo to wciąż twierdzę, że są przypadki w których kod sam magicznie wszystkiego nie wyjaśni, bo to zwyczajnie niemożliwe.

dokumentacją są przeprowadzone testy od jednostkowych przez integracyjne, a kończąc na akceptacyjnych czy beta.

Ach, to o to Ci chodzi... jednak wolę czytać słowny opis co program ma robić niż przeglądać tuziny edge case'ów sprawdzanych przez testy.

W ich programach najczęściej się znajdzie różne zmienne typu e, dat, nop, n, T itp.

Na szczęście nie mam kontaktu z takimi C++'owcami :3

komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
Polecam lekturę "Kod doskonały" w którym jest dość obszernie wyjaśniony problem z komentarzami.

Pozwolę sobie zacytować: http://pastebin.com/7M6nuJLg
komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)

Dodatkowo dowód żywo dokumentowanego kodu: https://youtu.be/z0y3IPJDyp0?t=661

Swoją drogą - jest masa przeprowadzonych badań, że komentarze w kodzie zaciemniają jego strukturę. Jeżeli coś wymaga komentarza, to znaczy, że zostało to prawdopodobnie źle napisane. 

Są komentarze wymagane przez IDE tak samo komentarze do dokumentacji automatycznej. Są też komentarze prawne czy były kiedyś komentarze CVS. 

Dziś już się najczęściej odchodzi od tego. 

Nie wszystkie komentarze są złe, ale trzeba mieć wiedzę kiedy je użyć żeby rozjaśniły w głowie - na przykład przy sortowaniu mogę napisać, że to QuickSort a nie jakieś inne. 

A komentarze przy "} // koniec pętli", które autor dał w kodzie jednak zaburzają czytelność.

komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
http://www.bottega.com.pl/pdf/materialy/ddd/ddd2.pdf

Polecam przeczytanie również tego.
komentarz 7 listopada 2015 przez adrian17 Mentor (350,400 p.)
No i... nie rozumiem do czego zmierzasz, bo podsumowane tam poglądy ogólnie są podobne do moich i można je streścic "kod mówi co, komentarze po co / dlaczego". W zasadzie mam wrażenie że jest mi bliżej do tego, co ten tekst próbował przekazać, niż Tobie.

(edit: to była odpowiedź na pierwszy komentarz)
komentarz 7 listopada 2015 przez event15 Szeryf (93,790 p.)
W aplikacjach sterowanych modelem (DDD) bardzo rzadko uświadczysz komentarze - po prostu kod sam siebie opisuje. W postaci dobrze napisanego kodu (który jest po prostu odzwierciedleniem specyfikacji), napisanych testów które dopowiadają Ci jak i po co działa ten kod.

Po prostu jest to dużo szybsze rozwiązanie. Nie bronie używania komentarzy, ale uważam, że im mniej ich tym lepiej. W tym kodzie Parsera który dałeś, dużo więcej czasu idzie na czytanie komentarza i zrozumienie go niż spojrzenie na kod i przeanalizowanie - a kod sam w sobie jest rzeczywiście mało czytelny, gdzie komentarze również nie pomagają w żaden sposób.
komentarz 7 listopada 2015 przez adrian17 Mentor (350,400 p.)
Cóż, mamy kompletnie różne standardy i się nie dogadamy, więc radzę przerwać dyskusję.
0 głosów
odpowiedź 7 listopada 2015 przez furas Maniak (53,800 p.)
Kod powinien być podzielony na małe funkcje, które robią jedną rzecz i używają czytelnych nazw zmiennych - wtedy sam kod robi za komentarz. Warto tez dodać komentarz dla wyjaśnień pewnych rzeczy ale nie należy komentować oczywistych rzeczy. Nie ma sensu dodawać komentarz do każdej linii.

Puste linie nie mają znaczenie dla kompilatora i szybkości kodu ale mają znaczenie dla ludzi, którzy muszą kod oglądać. Puste linie pomagają wyłapać początek funkcji czy kawałki kodu, które robią pewne skończone zadanie - tak jak to robi nowy akapit w książce.

Podobne pytania

0 głosów
3 odpowiedzi 2,429 wizyt
pytanie zadane 7 listopada 2015 w C i C++ przez aki3130pl Nowicjusz (140 p.)
0 głosów
1 odpowiedź 583 wizyt
pytanie zadane 30 marca 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
3 odpowiedzi 1,049 wizyt

93,159 zapytań

142,171 odpowiedzi

321,891 komentarzy

62,489 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 453p. - Marcin Putra
  2. 453p. - dia-Chann
  3. 447p. - Łukasz Piwowar
  4. 443p. - CC PL
  5. 431p. - Łukasz Eckert
  6. 428p. - rafalszastok
  7. 423p. - Adrian Wieprzkowicz
  8. 418p. - rucin93
  9. 410p. - Piotr Aleksandrowicz
  10. 408p. - ksalekk
  11. 402p. - Mariusz Fornal
  12. 340p. - ssynowiec
  13. 329p. - nidomika
  14. 319p. - Michal Drewniak
  15. 298p. - Dawid128
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...