Pierwsze próby – ocena kodu

Pierwsze próby – ocena kodu
jerro
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:3
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: flowCRANE
jerro
Dzięki, przepraszam za niedociągnięcia!
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4884
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:

Kopiuj
    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
jerro
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.
lion137
Very złą, importy umieszcza się na górze pliku.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8398
0

Tutaj masz taki kod

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

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

Kopiuj
 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?)

Kopiuj
        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ł.


edytowany 3x, ostatnio: LukeJL
Zobacz pozostałe 2 komentarze
danek
@LukeJL: moze taki stereotyp, że programowanie jest trudne i zagmatwane
jerro
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.
LukeJL
@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
@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
@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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)