Junior C++ - co wypadało by wiedzieć, najważniejsze zagadnienia.

0

Dzień dobry, przychodzę dzisiaj do tych bardziej doświadczonych programistów z pytaniem, a mianowicie jestem na takim etapie, z cpp że coś tam ogarniam, umiem napisać w miarę jakąś aplikację którą sobie wcześniej zaplanuje, lecz wiem że mój kod jest no słaby (tragiczny), nieczytelny i mija się szerokim łukiem z zasadami SOLID. No i są dwa nurty albo będę robił swoje aplikację, ucząc się przy tym nowych treści, ale utwardzając się w błędach, albo no właśnie albo co? Przerabianie jakichś kursów chyba średnio coś daje no bo tam zazwyczaj nie pisze się na tyle obszernego kodu by znaleźć te błędy lecz omawia konkretne zagadnienie. Dodam że obecnie przerabiam kurs advanced c++ od infiniteskills i tworzę swoją aplikację w Qt. Gdzie powinienem się teraz coś douczać? (płatne odpada :/ )

4

Skoro jesteś na takim etapie jak to napisałeś to zakładam, że masz już jakąś tam w miarę solidną bazę.
Nie wiem co rozumiesz pisząc, że Twój kod jest "słaby". Chodzi o to, że... działa ale wydaje się Tobie że mógłby wyglądać bardziej "czytelnie"? Że jest ok ale mała zmiana gdzieś w interfejsie wymaga przebudowania prawie wszystkich klas? Czy, że kiedyś widziałeś, że podobny problem można rozwiązać pisząc mniej kodu niż piszesz obecnie ale zapomniałeś jak to zrobić?
Ad. 1: Poczytaj na temat pisania tzn. czystego kodu. Polecane książki: "Czysty kod" - R.C. Martin, "Czysta architektura" - R.C. Martin
Ad. 2: Poducz się wzorców projektowych. Przeczytaj takie książki jak: "Wzorce projektowe" - Banda czworga.
Ad. 3: Sprawdź czy już ktoś nie opisał tego problemu na tym forum albo na stackoverflow.com. Tutaj przyda się też wiedza z trzech ww. książek.

Ale przede wszystkim koduj, koduj i jeszcze raz koduj ;)
Znajomość wzorców projektowych (bez zaglądania do książki) i pisanie czystego kodu to podstawa. Reszta przyjdzie z czasem w miarę jak będziesz coraz więcej kodował.

2

Nauka pisania czytelnego kodu to proces niczym doskonalenie rzemiosła - po prostu musisz swoje w życiu naklepać, pooglądać różne produkcyjne kody, poznać nie zasady, a w rzeczywistości rekomendacje SOLID, i z czasem wypracujesz własny warsztat rzemieślnika/artysty programisty.
Tu przykład źródeł od Qt, który generalnie leje na SOLID jeśli chodzi o długość kodu funkcji/klasy, oraz ile zagadnień klasa/funkcja obsługuje, a jak sam wiesz w użyciu biblioteka Qt jest całkiem przyjemna - https://code.woboq.org/qt5/qtbase/src/sql/models/qsqlquerymodel.cpp.html . Co prawda te degeneraty jakąś syfiastą notację dżawowską stosują, ale to sobie można własnoręcznie po bożemu sformatować.
A tu przykład mojej klasy - pooglądaj i daj znać, czy czaisz co się tam skąd bierze. To właśnie jest dobry test, jeśli swój kod(jakiś bardziej zaawansowany) pokażesz kumplowi który też programuje, i będzie on w stanie rozkminić sam, bez pytania cię o szczegóły, co kod ów robi to znak, iż udało ci się napisać go czytelnie.

0
MasterBLB napisał(a):

Nauka pisania czytelnego kodu to proces niczym doskonalenie rzemiosła - po prostu musisz swoje w życiu naklepać, pooglądać różne produkcyjne kody, poznać nie zasady, a w rzeczywistości rekomendacje SOLID, i z czasem wypracujesz własny warsztat rzemieślnika/artysty programisty.
Tu przykład źródeł od Qt, który generalnie leje na SOLID, a jak sam wiesz w użyciu biblioteka Qt jest całkiem przyjemna - https://code.woboq.org/qt5/qtbase/src/sql/models/qsqlquerymodel.cpp.html . Co prawda te degeneraty jakąś syfiastą notację dżawowską stosują, ale to sobie można własnoręcznie po bożemu sformatować.
A tu przykład mojej klasy - pooglądaj i daj znać, czy czaisz co się tam skąd bierze. To właśnie jest dobry test, jeśli swój kod(jakiś bardziej zaawansowany) pokażesz kumplowi który też programuje, i będzie on w stanie rozkminić sam, bez pytania cię o szczegóły, co kod ów robi to znak, iż udało ci się napisać go czytelnie.

Hmmm no ten twój kod, jest dobrze napisany ale średnio rozumiem. W konstruktorze wkładasz (przykładowe) wartości do wektorów. W funkcji sortującej to ten zapis średnio rozumiem, ale wina leży po mojej stronie bo trochę jeszcze mam małą wiedzę

std::function<const QString&(const InventoryItem *item)> fieldToSortOn;
   fieldToSortOn = [](const InventoryItem *item)->const QString&

ale chyba chodzi o to że robisz funkcję zwracają nazwę danego Itemu, później robisz vektor i przy ifach dajesz mu wartość danego sortOrderu. Następnie w sortLambda jest walidacja i ustawienie jak się ma sortować chyba, choć nie znam i nie korzystałem z klasy QRegularExpression, No i na koniec funkcja sortująca z std z tą sortLambdą. (Chociaż z 50% mam dobrze? :D )

1

To jest definicja lambdy przyjmującej const InventoryItem* i zwracającej const QString&.
W C++17 (lub C++14) kod można skrócić do ( kompilator sam określi jaki typ ma wartość zwracana - tutaj - std::reference_wrapper<const QString> )

auto fieldToSortOn = [](const InventoryItem *item){ return std::cref(item->name); };

Zobacz także
https://github.com/sftrabbit/CppPatterns-Patterns
masz tam ciekawe przykłady kodu C++ zastosowanego do rozwiązań w często występujących problemach.

1
Xezolpl napisał(a):

W konstruktorze wkładasz (przykładowe) wartości do wektorów.

No tu dobrze, zbyteczne jest tylko słówko przykładowe - to są już dane produkcyjne, na takich klasa ma działać.

Xezolpl napisał(a):

W funkcji sortującej to ten zapis średnio rozumiem, ale wina leży po mojej stronie bo trochę jeszcze mam małą wiedzę

std::function<const QString&(const InventoryItem *item)> fieldToSortOn;
   fieldToSortOn = [](const InventoryItem *item)->const QString&

ale chyba chodzi o to że robisz funkcję zwracają nazwę danego Itemu, później robisz vektor i przy ifach dajesz mu wartość danego sortOrderu. Następnie w sortLambda jest walidacja i ustawienie jak się ma sortować chyba, choć nie znam i nie korzystałem z klasy QRegularExpression, No i na koniec funkcja sortująca z std z tą sortLambdą. (Chociaż z 50% mam dobrze? :D )

Tutaj faktycznie musisz się Bracie doszkolić z lambd, wyrażeń regularnych oraz std::function aby w pełni rozumieć ten kod, ale jak widzisz pomimo braków w wiedzy dałeś radę całkiem poprawnie rozkminić co mniej więcej się dzieje:

  1. W istocie, pierwszym krokiem jest określenie który wektor SortOrder ma być użyty w lambdzie sortującej. Posłużenie się wskaźnikiem zainicjowanym na nullptr uodparnia mnie na sytuację kiedy żaden SortOrder nie okaże się właściwy
  2. W SortLambda w istocie jest określone po założonych kryteriach(to te regexpy w wektorach SortOrder) jak przesłane 2 InventoryItemy mają być posortowane.
  3. Na koniec też całkiem trafnie odgadłeś, acz gwoli ścisłości to jest odpalenie std::sort które jako funkcji porównującej elementy używa owej sortLambda
1

STL, C++11 to też już powoli standard, concurrency czyli <thread>, troche boosta. No i w zależności od branży, gdzieniegdzie grafika, gdzieniegdzie linux, telecom, czasem również gamedev.

c++14/17 to opcjonalnie, fajnie wiedzieć, bo są ciekawe funkcjonalności :-)

0
Czitels napisał(a):

STL, C++11 to też już powoli standard, concurrency czyli <thread>, troche boosta. No i w zależności od branży, gdzieniegdzie grafika, gdzieniegdzie linux, telecom, czasem również gamedev.

c++14/17 to opcjonalnie, fajnie wiedzieć, bo są ciekawe funkcjonalności :-)

No bo właśnie, ja zaczynałem od tego c++ bo był kurs u zelenta, to był mój początek no i stwierdziłem że chcę robić gry indie oraz aplikacje multiplatformowe (java? coś chyba najbliżej tego) no ale siedziałem w tym c++ i siedzę po dziś dzień by "zgłębić" do końca już podstawy tego programowania obiektowego czy wgl programowania, no i chyba boję się przenieść na inny język, zaczynać to wszystko od nowa i robię wsm mijając się z celem małe apki w Qt. A jak patrzę to wszędzie do pracy jeszcze linux czy inne rzeczy których po prostu nie czuję i nie chcę. :/ co teraz XD

0

Ja zaczynałem od C/C++ właściwie to z samych książek się uczyłem, a skończyłem na Javie, po czym okazało się, że to już przestarzałe. Wróciłem do C++ obejrzałem/przeklepałem kurs o Qt ok. 100 filmików z playlisty, później przesiadka nagle na android studio i znowu Java, (po drodze html, css [od js'a trzymałem się z daleka]) później servlety z nudów zacząłem pisać, jakieś crudy na hibernate, mysql-connector itp. Później przesiadka na springa, na początku jakieś konsolowe apki, wstrzykiwanie beanów, wywoływanie metod przed before, po after-returning, after, after-throw itp, a później crudy w spring boocie. Pomyślałem że crudy to trochę mało ambitne i wróciłem do android studio :P

0
au7h napisał(a):

Ja zaczynałem od C/C++ właściwie to z samych książek się uczyłem, a skończyłem na Javie, po czym okazało się, że to już przestarzałe. Wróciłem do C++ obejrzałem/przeklepałem kurs o Qt ok. 100 filmików z playlisty, później przesiadka nagle na android studio i znowu Java, (po drodze html, css [od js'a trzymałem się z daleka]) później servlety z nudów zacząłem pisać, jakieś crudy na hibernate, mysql-connector itp. Później przesiadka na springa, na początku jakieś konsolowe apki, wstrzykiwanie beanów, wywoływanie metod przed before, po after-returning, after, after-throw itp, a później crudy w spring boocie. Pomyślałem że crudy to trochę mało ambitne i wróciłem do android studio :P

yhym a android studio to java czy c++? Kurcze no moja historia miała zmierzać w stronę Javy ale jak to niby przestarzałe no okej, osiągi w grach nooo słabo, prawda, ale jakieś tam aplikację chyba dobrze skoro trzyma się na 3 miejscu popularności. Na razie siedzę w tym Qt ale no chciałbym robić swoje gry, zwykłe indyki i wiem że tu mam w sumie dowolność pomiędzy java a c# choć ten drugi wygląda lepiej (no większe zasoby poradników itd (np.Unity), lepsza wydajność (chyba)) no i chciałbym również multiplatformowe aplikacje tworzyć (głównie android i windows)) i już sam nie wiem :/
Tak z doświadczenia co byś doradził?

Mocno zasugerowałem się stroną https://jaki-jezyk-programowania.pl gdzie wyszła właśnie universalnie JAVA.

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