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

Porada dotyczaca kodu i szkieletu projektu

Object Storage Arubacloud
0 głosów
482 wizyt
pytanie zadane 16 sierpnia 2019 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
Witam,

mialby ktos chwile, zeby rzucic okiem na ten kod (sa to tylko pliki.h, wiec nie ma wewnetrznego kodu) i ocenic go. Chodzi mi o porady, co moge zmienic, czy szkielet (klasy i nazwy) sa dobre i zrozumiale etc. Jakby byly jeszcze jakies pytania, czy cos to mozna smialo zadac.

https://github.com/DragonCoderProject/archipelago_work_version/tree/master/classes

Oprocz tego, jesli ktos ma ochote to w readme jest lekki (nieskonczony) zarys gry/map/postaci

3 odpowiedzi

+1 głos
odpowiedź 17 sierpnia 2019 przez Huberti Gaduła (4,500 p.)
Cześć. Ciężko jest dać jakiekolwiek porady dotyczące kodu nie widząc samej implementacji. Nie wiem na jakim etapie jesteś. Nie za dużo planujesz? Czasem dobrze jest po prostu skupić się na dobrym wykonaniu jednej małej rzeczy, niż z góry wszystko przemyśleć. Wiele pomysłów wpada już podczas samego pisania. Zawsze wiele może się zmienić.

Od siebie dodam tylko, że osobiście lubię najpierw napisać coś co działa jak należy (zazwyczaj bez pisania klas).
komentarz 17 sierpnia 2019 przez tkz Nałogowiec (42,020 p.)
A co z testami? Łamiesz zasady TDD. Oczywiście, to moje zdanie, ale plan jest połową sukcesu.
komentarz 18 sierpnia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Nie da sie przy takim projekcie pisac na gape, bo wtedy zuzyjesz duzo wiecej czasu. Dlatego klasy sa zaplanowane i gotowe na rozszerzenia. Wszystko jest rozplanowane, a to co dochodzi teraz trafia do osobmego dokumentu z pomyslami, ktore mozna gdzies tam pozniej zaimplementować.
komentarz 18 sierpnia 2019 przez j23 Mędrzec (195,220 p.)

zazwyczaj bez pisania klas

To może działać tylko w przypadku bardzo małych projektów.

komentarz 18 sierpnia 2019 przez Huberti Gaduła (4,500 p.)

j23 czy ja wiem. Zobacz jakie projekty powstały w języku C. Kernel, git, Handmade Hero i wiele innych.

komentarz 18 sierpnia 2019 przez tkz Nałogowiec (42,020 p.)
Z tego co widzę na githubie, to w plikach są prawie struktury i operacje na nich, czyli w sumie "klasy".
komentarz 18 sierpnia 2019 przez j23 Mędrzec (195,220 p.)

@Huberti, skoro pisze projekt w języku C++, to dlaczego miałby unikać klas na początku? Jeśli piszesz obiektowo, to ta obiektowość powinna być uwzględniona już na etapie projektowania aplikacji, a nie dodana później, jak już wszystko będzie "działać jak należy".  Już nie mówiąc, że wynikiem takiego podejścia jest często kod, który wygląda jak C z klasami a nie C++.  To zły styl.

komentarz 18 sierpnia 2019 przez DragonCoder Nałogowiec (36,500 p.)
Dodam tylko, ze efekt końcowy tego projektu, jaki mam w glowie, a nie realny, jest nie mozliwy do osigniecia bez podejscia objektowego, jesli nie chce sie pisac milionow linii kodu proceduralnie. Oprocz tego caly projekt w koncowej fazie z zalozenia, będzie dzialal za pomoca conajmej 3 języków (python, cpp i sql)
1
komentarz 18 sierpnia 2019 przez mokrowski Mędrzec (156,220 p.)
@DragonCoder, Z tymi milionami linii kodu nie przesadzaj :-) Podejście obiektowe to jedno z wielu. Często po przedefiniowaniu problemu może się okazać że np. funkcyjnie będzie to prostsze. Ale to zależy od problemu. Ogólnie żadne z podejść nie wyklucza osiągnięcia wyniku w rozsądnej ilości kodu. Jedynie ew. odbija się na jego rozumieniu i łatwości utrzymania a tu OOP pewne benefity bez wątpienia dostarcza.
komentarz 19 sierpnia 2019 przez Huberti Gaduła (4,500 p.)
edycja 19 sierpnia 2019 przez Huberti

@Huberti, skoro pisze projekt w języku C++, to dlaczego miałby unikać klas na początku?

Tak jak mówiłem to tylko preferencja. Osobiście OOP stosuję kiedy upraszcza kod klienta. Mam na myśli osobę korzystającą z kodu. Czasem nawet wygodniej jest rozwiązać dany problem w jakikolwiek sposób. Najpierw sprawić by coś działało. Potem w przypadku często wykorzystywanej funkcjonalności można pomyśleć o znalezieniu lepszych rozwiązań w celu uproszczenia interfejsu dla siebie lub innych programistów.

+1 głos
odpowiedź 18 sierpnia 2019 przez mokrowski Mędrzec (156,220 p.)
1. To raczej niezbyt częsta konwencja nazywanie plików class_*.h. Bardziej zrozumiałe będzie combat.h, entity.h itp.

2. Jeśli będziesz miał rozszerzenia *.h w plikach nagłówkowych, niektóre (prostsze) narzędzia inspekcji kodu nie zorientują się że mają do czynienia z kodem C++

3. To zła praktyka emitować kod z pliku *.h (class_monster.h)

4. Być może to zamierzone ale wygląda dziwnie jeśli typ enum, ma wartości takie same dla więcej niż jednego elementu.

5. Stosuj "const correctness" czyli metody nie zmieniające stanu obiektu, powinny posiadać na końcu const.

6. To zadziwiające że metody o nazwach np. setStrength(), nie przyjmują żadnych parametrów a mają w nazwie set.

7. Pet czy Pets (liczba mnoga)?

8. Mam intuicję że część prywatnych atrybutów w klasach jest ... "niezręczna" ale bez kodu implementacji trudno coś powiedzieć.

Bez implementacji.. tyle.. Hmm.. jesteś pewien że dziedzicząc nie powodujesz konieczności stosowania virtual w niektórych metodach? (to bardzo ogólne pytanie)
komentarz 18 sierpnia 2019 przez DragonCoder Nałogowiec (36,500 p.)
5. Tak wiem, juz o tym czytalem

6. Wiem, jeszcze nie sa one wpisane, ale beda.

7. Pet, chodzi mi o jedno zwierzę, ale bedzie ich kilka, dlatego jest tez enum wewnatrz, zeby moc ustalic jego typ, a zarazem bonusy i zdolnosci

8. Co znaczy niezreczna?

9. Pewnie powoduje to, ale dopisanie tego to nie problem, a na poczatku chcialem utworzyc tylko szkielet i pozniej wraz z implementacja dodac wszystko co jeszcze bedzie potrzebne
komentarz 19 sierpnia 2019 przez mokrowski Mędrzec (156,220 p.)

7. Pet, chodzi mi o jedno zwierzę, ale bedzie ich kilka, dlatego jest tez enum wewnatrz, zeby moc ustalic jego typ, a zarazem bonusy i zdolnosci

Bez implementacji pachnie to błędem projektowym. Możesz mnie przekonać że ma to sens implementacją. Rodzaj zwierzęcia (jeśli ma to być "czyste obiektowo"), ustalasz przez typ klasy a nie pole enum. To nie C gdzie trzeba mieć tzw. tag. Jeszcze raz, może to mieć sens ale tu raczej robisz błąd.

8. Co znaczy niezreczna?

To oznacza że traktujesz klasy jako "wiadra na dane" a nie jako byty łączące zachowanie z atrybutami. Dodatkowo w rzeczywistym projekcie zapewne będziesz potrzebował hermetyzacji tych danych jeśli nie chcesz przy każdej zmianie pól prywatnych rekompilować klas włączających nagłówek. Znów, implementacja lub wymagania mogły by mnie przekonać że Twoje podejście jest ok.

komentarz 19 sierpnia 2019 przez DragonCoder Nałogowiec (36,500 p.)
7. Czyli zamiast tworzyc enuma, ktory daje typ zwierzaka, lepiej stworzyc mala klase, ktora odziedziczy od klasy pet, a gdy gracz wbyierze tego i tego zwierzaka, to tworze objekt tej klasy?
komentarz 19 sierpnia 2019 przez mokrowski Mędrzec (156,220 p.)

7. Czyli zamiast tworzyc enuma, ktory daje typ zwierzaka, lepiej stworzyc mala klase, ktora odziedziczy od klasy pet, a gdy gracz wbyierze tego i tego zwierzaka, to tworze objekt tej klasy?

Oczywiście że tak. Każde zwierze jest przecież odrębnym typem (a więc klasą). Dzięki temu będziesz mógł wykorzystać mechanizmy polimorfizmu (implementowane poprzez wskaźnik i referencję) oraz dodać do niego zdolności (behawior -> metody) których nie posiada "ogólne zwierze". Rezygnacja z tej szansy powinna być podyktowania bardzo konkretnymi przesłankami których nie widać bez implementacji. Dodatkowo dzięki takiemu podejściu, będzie można także implementować interfejsy dedykowane zwierzętom wodnym. lądowym, latającym... To ostatnie oczywiście jeśli jest w tym przypadku potrzebne. Stosowanie techniki znaczników (czyli u Ciebie pola enum), to tak naprawdę droga do łamania reguły Liskov.

0 głosów
odpowiedź 16 sierpnia 2019 przez tkz Nałogowiec (42,020 p.)

Pliki powinny mieć rozszerzeni .hpp, w końcu piszesz w C++, a nie w C.

Class enum, nie enum, może Ci się później odbić czkawką...

levelPet_; Po co "_"?

Jeżeli już używasz seterów i geterów, dlaczego nie są const? Po za tym to nie najlepsza praktyka.(https://stackoverflow.com/questions/2747721/getters-and-setters-are-bad-oo-design)

Po co puste? https://github.com/DragonCoderProject/archipelago_work_version/blob/master/classes/class_item.h#L22

Zamiast operować stringami, możesz poczytać o string_view.

Ten prefix class_ przed każdym plikiem jest zbędny.

https://github.com/DragonCoderProject/archipelago_work_version/blob/master/classes/class_monster.h#L16-L19 są to zewnętrzne bloki, możesz je dać w anonimową przestrzeń nazw by nie były dostępne globalnie. 

 Tak z grubsza. 

https://github.com/DragonCoderProject/archipelago_work_version/blob/master/classes/class_pet.h#L15 brak przecinka

komentarz 16 sierpnia 2019 przez DragonCoder Nałogowiec (36,500 p.)
1. Nie zauwazylem, ze byla ta klasa pusta, a dopiero co ja otwieralem na kompie i byl tam kod.

2. _ jest, zeby zaznaczyc, ze sa to pola prywatne, ale mozna usunac.

3. Myslalem, ze pisze sie enum, a nie class enum, widzialem w wielu kodach wlasnie samo enum

4. Ale jelsi nie uzyje getterow i seterow, to nie bede mogl zwrócić wartosci. Czy nie tylko gettery powinny byc const, bo zwracaja stala wartosc?

5. Te zewnętrzne bloki znikna, zapomnialem ich usunac, bo byly to tylko mysli, w trakcie projektowania klas.
komentarz 16 sierpnia 2019 przez tkz Nałogowiec (42,020 p.)

2. Jeżeli Ci to ułatwia prace, to chyba nie ma w tym nic złego. 

3. Pisać możesz, obie wersje są w standardzie. Class enum, to tak pokrótce implicit enum, nie pozwoli rzutować na int. 

4.  https://bulldogjob.pl/news/215-gettery-i-settery-to-czyste-zlo-kropka Głównym złem jest to, że psują abstrakcję. 

komentarz 16 sierpnia 2019 przez DragonCoder Nałogowiec (36,500 p.)
4. Nie do konca o to mi chodzilo z tym. Set i get sa tylko po to, zeby zaznaczyc, ktora funkcja zwraca wartosc, a ktora moze zmienic/aktualizowac wartosc. Np mam metode setPosition, ktorej zadaniem jest zaktualizowanie aktualnej pozycji. Ale pomyślę, jak to inaczej zrobic

Podobne pytania

0 głosów
1 odpowiedź 236 wizyt
0 głosów
1 odpowiedź 127 wizyt
pytanie zadane 17 lipca 2020 w Python przez patryk241 Użytkownik (700 p.)
0 głosów
0 odpowiedzi 104 wizyt
pytanie zadane 2 stycznia 2023 w C i C++ przez Szatronix Nowicjusz (120 p.)

92,759 zapytań

141,679 odpowiedzi

320,443 komentarzy

62,102 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

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!

...