Wpis z mikrobloga

Wracając do tego wpisu: https://www.wykop.pl/wpis/32479435/-/

Wydaje mi się, że wreszcie załapałem. Na ogół od od pisania kodu wolę opracowywać tok myślenia, jak kod ma działać, no ale klepać w klawiaturę też trzeba umieć.

Postanowiłem, że zrobię grę w kółko i krzyżyk w js/ajaxie/php/mysql. Asynchronicznie, dla odległych clientów, możliwość wracania do rozegranych meczy.
Cele jakie miałem pisząc ten kod: Opanowanie programowania zorientowanego obiektowo, nazywanie klas "co to jest, a nie jak wygląda", brak mieszania języków przy zmiennych i funkcjach (pl/en).

Rezultat: https://github.com/DawidJur/kolko-i-krzyzyk

Przy okazji wreszcie założyłem Gita, powoli uczę się go obsługiwać.
Rzeczy które mogłem zrobić lepiej:
- Na pewno kod nie jest idealny i jeszcze wiele pracy przede mną, jednak jak na pierwszy taki projekt czuję, że sporo mnie to nauczyło.
- Nie użyłem PDO (co planowałem), bo uznałem że byłoby to zbyt dużo nauki na 1 raz, przez co niektóre miejsca kodu są strukturalnie zamiast obiektowo.
- Brak jednolitych nazw metod/właściwości (czasem zaczynam z dużej, czasem z małej).
- Angielski trochę kuleje, Turn zamiast Move, pewnie jeszcze coś znajdziecie.
- Nie zaplanowałem sobie z góry jak skrypt ma działać, przez co wiele razy zmieniałem konwencje, wywalałem istniejące metody, zmieniałem kolumny bazy danych.
- Skrypt można doprowadzić do momentu gdzie 2 graczy może mieć to samo (kółko lub krzyżyk). Do 1 sesji może dołączyć więcej niż 2 osoby, jednak wynika to z powyższego.
- Front-end mógłby być lepszy, ale nie na nim się tym razem skupiałem. Ta mieszanka czystego js'a z jquery na pewno da Wam raka.

Tak więc drodzy programiści15k, z tego miejsca chciałbym prosić o wylanie na mnie konstruktywnego wiadra pomyj, co mogłem jeszcze zrobić lepiej, nad czym popracować?

#naukaprogramowania #programowanie #php #javascript #webdev
  • 22
@Jurix: Po metodach i klasach rób enter i dopiero otwieraj { i Poczytaj trochę o formatowaniu kodu. Mi z nauką OOP pomogło bardzo nauczenie się MVC i frameworka CodeIgniter, jest bardzo prosty, a to dobry początek żeby wszytko zrozumieć.
@Jurix: co do formatowania kodu to psr dude. Tak samo kwestia klas, przestrzeni i nazewnictwa plików. Obczaj sobie tez na początek mvc (co to jest) oraz wzorce projektowe i próbuj ich używać. Użyj composera do zbudowania classmapy, sprobuj zaciągnąć jakaś przydatna bibliotekę. I nigdy nie używaj laravela ;P
A {} to nie jest kwestia tylko preferencji?


@Jurix: Zapoznaj się ze standardami PSR-1 i PSR-2. Nie chodzi o to, że popełniłeś błąd formatując tak a nie inaczej. Formatowanie wg standardów sprawia że kod pisany przez wiele osób wygląda spójnie i przejrzyście. Nie wiem w czy tam piszesz, ale sporo edytorów/IDE ma wtyczki które same pilnują ci takiego formatowania (np. podczas zapisywania pliku). Poza tym masz narzędzia do tego, jak np.
@Jurix: w pehapie są PSRki które niby definiują jak się powinno się te klamry stawiać, ale tak naprawdę nie ma to praktycznego znaczenia. Ja preferuję robienie tak jak jest wygodniej twórcy, byle konsekwentnie w ramach projektu.

To co byłoby warto żebyś zmienił - rozbij to na pliki (jeden plik - jedna klasa) i użyj autoloadera. Dobra praktyka jest taka, żeby w jednym pliku albo coś definiować (klasy, funkcje, whatever) albo przetwarzać
@idiot: > Formatowanie wg standardów sprawia że kod pisany przez wiele osób wygląda spójnie i przejrzyści

No nie do końca. Do tego wystarczy że każdy w projekcie formatuje tak samo (a to ładnie i standardowo można ułatwić przy pomocy editorconfig), nie musisz zaraz narzucać w tym celu konkretnego (i IMO niewygodnego) standardu z PSRek.
@Jurix: A, no i jeszcze jedno. Używasz parametrów metod do tego, żeby przekazywać im zależności, a nie dane. Za to właściwe dane na których metody operują trzymasz w globalach, w sensie w $_POST. Mało to obiektowe :) metoda createPlayer w parametrze powinna przyjąć dane gracza do utworzenia. Połączenie do bazy idealnie jest sobie podać do obiektu w konstruktorze i tam zapisać w obiekcie. W ten sposób możesz całkowicie zmienić mechanizm zapisu
@Jurix: w index.html mógłbyś zamienić linie 55-63 na jedną pętlę w php. Zauważ że te linie różnią się tylko cyfrą, i do tego ta cyfra idzie od 1 do 9.
Wiem że na frontendzie się nie skupiałeś, ale tu chodzi o sposób myślenia. Czasami stosuje się zasadę (DRY - Don't Repeat Yourself albo też Rule of three) że jeśli masz napisać coś drugi raz, to po prostu piszesz, ale przy trzecim
@Jurix:

Co do wspomnianych PSRów, to są to z definicji jedynie rekomendacje (PHP Standard Recommendations), a nie must have. Najważniejsze, żeby w całem projekcie było spójnie. O ile format nazewnictwa klas, metod i zmiennych jest już właściwie standardem niezależnie od języka, to używanie spacji vs tabów, czy wspomniane nawiasy klamrowe w tej samej vs nowej linii, to już kwestia bardziej preferencji. Także co poniektórzy trochę #!$%@?ą od rzeczy.

1. Co do
@kao3991: Miałem problem z tą bazą, gdy robiłem w opisywany sposób nie chciał mi się odwoływać do tej właściwości od parametrów bazy. Gdy ogarnę PDO to nie powinno być problemu, ale przetestuję jeszcze rozwiązanie o jakim piszesz.

@asciiterror: Racja, mogłem divy zrobić na pętli.
Nazwy metod i klas - następnym razem będzie lepiej, już rozumiem jak to należy robić.
To dziedziczenie move - miałem problem z dziedziczeniem 2 klas w
@Jurix:

Ad 7.

miałem problem z dziedziczeniem kilku klas, stąd zdecydowałem się na taki lekko absurdalny ruch, dziedziczenia sesji przez move.

Tu nie powinno być żadnego dziedziczenia, tylko ewentualnie kompozycja. I przy okazji - w PHP klasa nie może dziedziczyć po kilku klasach jednocześnie.

Więc powinienem zrobić jeszcze 1 klasę, która dziedziczyłaby wszystkie powyższe i z jej poziomu uruchamiać skrypt?


Zdecydowanie nie.
@zakopiak: Nie rozumiem, czyli powinienem osobno wywoływać klasę od sesji, osobno od ruchu, osobno od gry i z poziomu 3 zmiennych wywoływać metody?
PHP nie może dziedziczyć wielu klas? W internecie piszą że należy to robić po przecinku, no ale nie działa. To normalne dla języków obiektowych typu C#, mam się do tego przyzwyczajać? W JS wiem że to możliwe, ale to nie jest normalny język, więc...
PHP 7.1 here.
czyli powinienem osobno wywoływać klasę od sesji, osobno od ruchu, osobno od gry i z poziomu 3 zmiennych wywoływać metody?


@Jurix: Nie wiem, co masz na myśli przez "wywoływanie", ale chodzi o oddzielenie implementacji rzeczy, które nie są ze sobą bezpośrednio związane. Dalej przekazujesz jedne obiekty do innych jako zależności np. przez parametry konsturktora, najlepiej jako implementacje jakichś ogólnych interfejsów.

poziomu 3 zmiennych wywoływać metody?


Nie. Jak wyżej opsane, robisz kompozycję