Wątek przeniesiony 2019-08-08 13:54 z przez Patryk27.

Pierwsze próby – ocena kodu

Odpowiedz Nowy wątek
2019-08-08 13:46
0

Czołem!

Chciałbym poprosić, by ktoś rzucił okiem na to, co do tej pory udało mi się napisać w Pythonie. Wiem, że to niewiele i kodu jest tam dużo więcej niż mogłoby być, ale zacząłem jakiś miesiąc temu od zera.

http://github.com/fredericullio/Projects

Pisałem to w jupyter notebooku, używam tam sporo funkcji clear_output, więc chyba najlepiej będzie to też w nim sprawdzać.

edytowany 4x, ostatnio: furious programming, 2019-08-08 20:13
Dzięki, przepraszam za niedociągnięcia! - jerro 2019-08-08 20:26

Pozostało 580 znaków

2019-08-08 19:44
0

Rób sobie do wszystkiego testy, bo teraz to raczej na tych grach nie można polegać:) Raz Masz importy w definicji funkcji i Używasz mutowalnej listy jako default argument:

    def __init__(self, contents=[]):
        self.contents = contents

a to jest no, no:).
Jak nie Rzeźbisz data science to Pisz w PyCharm, jest dużo lepszy do "zwykłej" deweloperki.


edytowany 1x, ostatnio: lion137, 2019-08-08 19:45
Dziękuję za poświęcony czas i cenne uwagi. :) Używanie importów w definicjach jest złą praktyką? Akurat potrzebowałem tego randoma, aby tasować talię w blackjacku. - jerro 2019-08-08 20:08
Very złą, importy umieszcza się na górze pliku. - lion137 2019-08-08 20:13

Pozostało 580 znaków

2019-08-08 20:46
0

Tutaj masz taki kod

if win_check(board, char):
   print("Congratulations,",name,"! You've won!")

A zaraz niżej masz kod identyczny tylko dla drugiego gracza.

 if win_check(board, char_2):
                    print("Congratulations,",name2,"! You've won!")
                    break

pomyśl jak to można zdeduplikować (np. wydzielić funkcję, która będzie drukować zwycięstwa dla dowolnego gracza?). No i możesz mieć dwuelementową listę graczy i odpalać na obu elementach tę funkcję, zamiast ręcznie robić ifa dla każdego gracza. (fajne ćwiczenie możesz zrobić - co jeśli graczy byłoby np. 3 zamiast 2?)

        name = input('Player 1, please, choose your player\'s name')
        name2 = input('Player 2, please, choose your player\'s name')

Tak samo tutaj - stringi ci się powtarzają. Ogólnie masz mnóstwo tego typu duplikacji, co jest pisaniem na krótką metę (a przecież możesz te stringi wydzielić choćby do jakiejś stałej).

Zrób eksperyment myślowy: wyobraź sobie teraz, że masz przetłumaczyć wszystkie wyświetlane na ekranie na teksty na język polski.

Już widzisz problem? Duplikują się, więc więcej będziesz mieć do roboty w razie potrzeby zmiany.

print('Please, enter a valid input.')

No i te printy... weź teraz zrób ćwiczenie i np. zrób z tej aplikacji aplikację okienkową. I to w ten sposób, żeby ta logika, którą masz mogła działać równocześnie w konsoli, jak w okienkach.

Widzisz już problem? Mieszasz sposób prezentacji danych (print) z logiką gry.

Wiem, że to niewiele i kodu jest tam dużo więcej niż mogłoby być, ale zacząłem jakiś miesiąc temu od zera.

Jeśli dopiero miesiąc temu zacząłeś programować, to masz jeszcze dużo czasu, żeby się nauczyć.

Swoją drogą zastanawiam się, czemu każdy kod osób początkujących wygląda podobnie - masę kodu kopiuj-wklej i drabinki ifów. Czy to jest naturalny odruch osoby zaczynającej programować? (ja już szczerze mówiąc nie pamiętam, jak pisałem na początku). Czy może jakaś infekcja z tutoriali, w którym takiego pisania uczą? Bo to aż takie typowe. Kod, który jest strasznie sztywny i który widać, że został pisany, że ktoś pisał tylko rzeczy od A do C to co sobie założył.


((0b10*0b11*(0b10**0b101-0b10)**0b10+0b110)**0b10+(100-1)**0b10+0x10-1).toString(0b10**0b101+0b100);
edytowany 3x, ostatnio: LukeJL, 2019-08-08 20:51
Pokaż pozostałe 2 komentarze
@LukeJL: moze taki stereotyp, że programowanie jest trudne i zagmatwane - danek 2019-08-08 20:53
To na pewno nie kwestia tutoriala bo tam podane rozwiązanie było dużo bardziej eleganckie, ale dałem do oceny to co samemu udało mi się napisać, bo bez sensu przepisywać po kimś doświadczonym bezmyślnie. @LukeJL jak spojrzałem na to moje tictactoe to sam widzę, że jest sporo rzeczy do poprawki, wiele można wyabstrahować, to widzę i to poprawię. Jednak mógłbyś rozwinąć, co masz na myśli gdy piszesz, że mieszam printy z logiką gry? Jak zrobić, by było dobrze? Jeszcze nie nigdy nie napisałem okienkowej aplikacji, więc nie nabyłem jeszcze odpowiedniej wyobraźni. - jerro 2019-08-08 21:14
@stivens bardziej instancyjnie - no ja często lubię pisząc GUI (np. komponenty w React) tak, że piszę na pałę większy komponent, a pote, jak widzę, że coś się da wydzielić, to wydzielam. Jak widzę, że powtarzam kod, też wydzielam (np. dzisiaj miałem kod w React w którym robiłem dwie podobne operacje map, które wyrzucały podobny markup. Zrefaktoryzowałem to do wydzielonego komponentu). Tylko też trzeba mieć cały czas z tyłu głowy, że duplikacja to dług techniczny dopóki nie odnajdzie się właściwej abstrakcji https://www.sandimetz.com/blog/2016/1/20/the-wrong-abstraction - LukeJL 2019-08-10 15:47
@jerro chodzi o to, że printy to jest sposób prezentacji, wyświetlania danych użytkownikowi. Pisząc print zakładasz, że będzie się grało przez terminal a komunikacja z użytkownikiem będzie następowała poprzez wyświetlenie tekstu w konsoli, w języku angielskim. A teraz zrób eksperyment i np. wyobraź sobie, że dostajesz zlecenie na napisanie kółka i krzyżyk, które będzie działać w okienkach i teksty będą po polsku albo w ogóle nie będzie tekstu tylko komunikacja za pomocą grafiki (jak w Angry Birds). Co z twoją grą? Wtedy będziesz musiał zaorać CAŁY plik, żeby zrobić zmiany. - LukeJL 2019-08-10 15:55
@jerro co do logiki, to są te wszystkie zasady - kiedy użytkownik wygrywa? Kiedy jest remis? Jak się zmieniają tury? To jest niezależne od wyświetlania printów. Więc - ładnie napisana gra, oddzielalałaby rzeczy związane z logiką gry, od tego, czy komunikacja z użytkownikiem będzie za pomocą printów czy np. za pomocą utworzenia okienka dialogowego, albo narysowania grafiki 3D. Separation of Concerns - warto oddzielać niezależne kwestie od siebie,wtedy będziesz mógł zrobić moduł logiki i podłączać do tego moduł gry w trybie tekstowym i moduł gry okienkowej bez ruszania logiki - LukeJL 2019-08-10 16:00

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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