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

JS - Papier-Kamień-Nożyce

+2 głosów
1,786 wizyt
pytanie zadane 24 listopada 2017 w JavaScript przez Rafal2 Nowicjusz (140 p.)

Witam!

Chciałbym poprosić o ocenę gierki napisanej w JS.

GitHub repozytorium

Demo

2 odpowiedzi

+2 głosów
odpowiedź 24 listopada 2017 przez Tomek Sochacki Ekspert (227,490 p.)

Generalnie spoko, mogę od siebie dać parę nie tyle uwag co może jakiś wskazówek:

1.Pobieranie referencji po ID:

function _id(id)
{
  return document.getElementById(id);
}

//Można by tutaj zastosować nowszą metodę: (co nie oznacza, że Twój sposób jest gorszy)
const _id = document.querySelector.bind( document );
//i potem np.:
const element = _id( '#xxx' );

Ale generalnie jeśli korzystasz z getElementById zaledwie parę razy to można się zastanowić czy na pewno jest sens robić dodatkową funkcję.

2.Funkcja isGameOver:

function isGameOver()
{
  if(player.score === POINTS_TO_WON  || computer.score === POINTS_TO_WON)
  {
    return true;
  }
  return false;
}

//Można to uprościć:
function isGameOver() {
  return (player.score === POINTS_TO_WON  || computer.score === POINTS_TO_WON);
}

3.Funkcja resetGame:

function resetGame()
{
  resetScore();
  updateScore();
  resetChoosensImages()
  resetPlayersProperties();
}

Tutaj oki, ale jeśli już tak lecisz kolejno wywoływanie jednej funkcji za drugą to poczytaj w wolnej chwili o asynchroniczności w JS, Promise, async/await itp. Teraz może i wszystko jest oki, ale jak za chwilę zaczniesz bawić się np. ajaxem to możesz długo zastanawiać się co jest nie tak i dlaczego kod nie działa jak powinien :) Ale to taka nie uwaga, ale wskazówka co do dalszej drogi nauki.

4.Nawiązując np. do pkt. 3 poczytaj sobie np. o eslint. U Ciebie brakuje np. jednego średnika co eslint by wychwycił (akurat co prawda są osoby polegające na automatycznych średnikach JS, ale ja uważam, że lepiej mieć świadomą kontrolę nad kodem i wstawiać średniki gdzie trzeba).

5.Klamerki po IF:

if(player.lastPickedTool.classList.contains('tool--show'))
  player.lastPickedTool.classList.remove('tool--show')

Staraj się zawsze używać klamerek po instrukcjach warunkowych IF. Tutaj wykonujesz jedną operację więc błędu nie ma, ale jeśli za chwilę dodasz drugą i zapomnisz o klamerkach to możesz dłuuugo szukać błędu logicznego w kodzie... 

6.Używanie konsoli:

console.warn('You must pick a tool!')

Konsolę lepiej pozostawić tylko na etap projektowania aplikacji. W apce produkcyjnej lepiej się tego pozbyć i nie robić bałaganu. Pamiętaj, że konsola to nie miejsce na jakiekolwiek informacje dla użytkownika!

7. Funkcja updateChoosenImage:

Nie chce mi się wklejać całego kodu, także polecam tylko przeanalizować dwie kwestie: unikaj zwracania undefined (return;) chyba, że zrobisz to w świadomy sposób. Po drugie zamiast tego undefined i potem break w IF lepiej po prostu zwracać true lub false, co pozwoli Ci w przyszłości np. użyć tej metody w innej instrukcji warunkowej no i masz jasną sytuację, wiesz że zwracasz Boolean.

8. Klasa ToolComparator:

Skoro znasz klasy to polecam cały kod przepisać z ich wykorzystaniem :) No i dodatkowo porozbijać kod na mniejsze klasy + pliki aby apka była czytelniejsza.

---------------------

To tak na szybko w przerwie na wieczorną kawę :) Generalnie spoko, fajna gierka i pomysł na apkę. Życzę powodzenia w dalszym odkrywaniu świata JS :)

Pozdrawiam!

komentarz 8 maja 2018 przez kap Stary wyjadacz (11,620 p.)
Co w mojej początkowej wypowiedzi jest prowokacyjne? To, że nie zgadzam się z pośrednim stwierdzeniem Tomka, że nie używając wszedzie średników nie mam świadomej kontroli nad kodem? To ty przyleciałeś z prowokacyjnym stwierdzeniem, że to co robię jest "co najmniej ryzykowne".
komentarz 8 maja 2018 przez kap Stary wyjadacz (11,620 p.)
Wszysko co dalej to próba uniknięcia bezsensownej imo dyskusji.
1
komentarz 8 maja 2018 przez Comandeer Guru (607,330 p.)

Nie stosuję średników a jednocześnie mam świadomą kontrolę nad tym co robię - czary :D

Ton tej wypowiedzi jest ironiczny, można wręcz uznać, że kpiący. To samo w sobie może zostać uznane za prowokacyjne.

Stwierdzenie, że coś jest ryzykowne w czyjejś opinii – zwłaszcza przy uzasadnieniu tego ryzyka (zmienność w przypadku zmiany składni) nie brzmi jak coś prowokacyjnego. Jednak odparcie na to "dramatyzujesz" już jest – jako kolejna wypowiedź kpiąca i chwyt erystyczny, związany z dewaluacją wypowiedzi oponenta poprzez próbę podważenia jej zasadności (w tym wypadku przez próbę pejoratywnego określenia czynności wykonywanej przez oponenta). Do tego brak jakichkolwlek kontrargumentów. Ja mówię o zmienności ASI przy zmianach składni, Ty używasz chwytu erystycznego. Ja linkuję dyskusję TC39, w której właśnie to jest stwierdzane, Ty zbywasz to kpiącym twierdzeniem, że to też dramatyzowanie (znów chwyt erystyczny). No i na sam koniec stwierdzasz, że prowadzę krucjatę – co jest kolejnym chwytem erystycznym (ad hominem).

komentarz 8 maja 2018 przez kap Stary wyjadacz (11,620 p.)
Ok, postaram się następnym razem "ugryźć się w język" i przestać pisać w odpowienim momencie. Żeby była jasność - jako "bezsensowność dyskusji" nie mam oczywiście na myśli samej debaty "semicolons vs no semicolons", tylko mój brak chęci tracenia czasu na głebszą dyskusję w tym temacie - zupełnie nie taki był cel mojego pierwszego komentarza.
komentarz 8 maja 2018 przez Comandeer Guru (607,330 p.)
Więc następnym razem po prostu napisz wprost, że nie chcesz w to głębiej wchodzić i tyle, a nie rób podchodów ;) Stracimy wówczas mniej czasu na wzajemnie niezrozumienie.
0 głosów
odpowiedź 24 listopada 2017 przez ProgramistaStepek Nałogowiec (27,020 p.)

Tak na szybko to wygląda całkiem nieźle, ale:

  • Rozdziel to na więcej plików, aby zwiększyć czytelność projektu.
  • Poczytaj o Dependency Injection, w kilku miejscach mógłbyś to zastosować.
  • Jeżeli korzystasz ze zmiennych globalnych, to nie chowaj ich gdzieś w środku, bo można łatwo się pogubić, tylko daj je na początek scopa
2
komentarz 24 listopada 2017 przez Tomek Sochacki Ekspert (227,490 p.)
Kolega nie ma zmiennych globalnych, ponieważ cały kod jest w IIFE (za to plusik jeśli to początki nauki). Deklaracje let/const jak najbardziej można robić dopiero w miejscach, od których są one potrzebne.
komentarz 24 listopada 2017 przez ProgramistaStepek Nałogowiec (27,020 p.)
Trochę źle się wyraziłem, chodziło oczywiście o początek zakresu.
komentarz 24 listopada 2017 przez Tomek Sochacki Ekspert (227,490 p.)

chodziło oczywiście o początek zakresu

?? Nie rozumiem o jaki zakres chodzi...?

komentarz 24 listopada 2017 przez ProgramistaStepek Nałogowiec (27,020 p.)
Zakres funkcji IIFE. Jednak jak się lepiej przyjrzałem na kod to wydaje mi się, że jednak mój pomysł z przeniesieniem deklaracji wyżej był nietrafiony.
komentarz 24 listopada 2017 przez Tomek Sochacki Ekspert (227,490 p.)
Ehh dopiero teraz zauważyłem, że ten komentarz z zakresem (gdzie rzekomo nie wiem o co chodzi) potraktowałem jako komentarz w innym temacie, gdzie akurat pojawiało się dość dużo komentów i taki koment zupełnie mi nie pasował do dyskusji :)

Podobne pytania

0 głosów
0 odpowiedzi 938 wizyt
0 głosów
1 odpowiedź 3,322 wizyt
pytanie zadane 5 lutego 2017 w JavaScript przez zawad Początkujący (270 p.)
0 głosów
1 odpowiedź 4,424 wizyt
pytanie zadane 22 września 2017 w C i C++ przez Geralt_z_Rivii Nowicjusz (240 p.)

93,604 zapytań

142,529 odpowiedzi

322,999 komentarzy

63,093 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

Kursy INF.02 i INF.03
...