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

W jaki sposob pisać taki kod

VPS Starter Arubacloud
+1 głos
325 wizyt
pytanie zadane 28 marca 2021 w JavaScript przez wsnofi Bywalec (2,680 p.)

Witam, tworze sobie hobbystycznie grę RPG typu visual-novel (te z opcjami dialogowymi do klikania), jest klasa która odpowiada za wyswietlanie scen/ dialogów oraz interakcje z nimi/ innymi czesciami interfejsu, ogółem wszystko

jest klasą abstrakcyjną, sama nie może działać jako obiekt, ta klasa główna nazywa się "Scena"

aby utworzyć np. dialog w sklepie, trzeba rozszerzyć nową scenę z sklepem o tą abstrakcyjną o nazwie Scena

np. class Sklep extends Scena

nowa klasa Sklep musi przyjmować 1 tablicę w konstruktorze (z dialogami i informacjami) oraz metodą Change();


A dziala to tak

class Sklep extends Scena () {

constructor(){
super()

// tutaj sa dialogi jakie będą w scenie
this.dialogs = 
 [
  {
idSceny:'scenaPierwsza'
napisNaScenie:'Ten tekst sie pojawi nad opcjami do wyboru'
opcjeDoWyboru: [{id:'opt1',text:'Wejdz do sklepu'},{id:'opt2',text:'Omin sklep'}]
  },
 ]

}


// ta metoda wykonuje sie przed każdym wyświetleniem opcji
change(dialog){

const zlotoGracza= app.player.stats.get('gold'); // pobiera jako int ilosc waluty gracza

if(dialog.idSceny === 'scenaPierwsza' && zlotoGracza < 1000){dialog.opcjeDoWyboru.shift()} 
// jesli scena to "scenaPierwsza" i gracz ma mniej niz 1000 zlota, to usuwa mu pierwszą opcje

}

}

metoda Change jest po to aby manipulować dialogami, zmieniać kolor elementow, na podstawie statystyk wybierać opcje, losować je i wprowadzać dowolne zmiany w obiekcie przed jego wyświetleniem.

 

Ale dałem sobie sprawę, że mogę takie coś zrobić w głównej klasie Scena, dodać opcjonalny parametr do opcji który sprawdza czy ma ona zostać wyświetlona np.

opcjeDoWyboru: [{id:'opt1',text:'Wejdz do sklepu',  need: function () {return app.player.stats.get('gold') >= 1000}  },{id:'opt2',text:'Omin sklep'}]

I teraz się zastanawiam, czy ta metoda Change() ma w ogóle sens, czy lepiej jest rozbudować klase tak aby pracowała na samych obiektach z this.dialogs, czy zostawić ta metoda która ingeruje w scene przed jej wyswietleniem do rzadziej wykonywanych sytuacji o które nie ma sensu rozbudowywać glownej sceny

Nie wiem jak to wygląda w innych wzorcach, jak się powinno robić, będę wdzięczny za pomoc

1 odpowiedź

+3 głosów
odpowiedź 28 marca 2021 przez edutomek Dyskutant (8,380 p.)
wybrane 30 marca 2021 przez wsnofi
 
Najlepsza

1) Odpowiedź (?) na pytanie.

jest klasa która odpowiada za wyswietlanie scen/ dialogów oraz interakcje z nimi/ innymi czesciami interfejsu

Wielkim znawcą (ani zwolennikiem) OOP nie jestem, ale już tu widzę problem: złamanie zasady SRP (ang. Single Resposibility Principle). Każda klasa (ogólniej: moduł, funkcja, etc.) powinna być odpowiedzialna tylko za jedno zadanie. (Dosłowne tłumacznie zasady SRP na polski jest chyba takie, że dla każdej klasy powinien być TYLKO JEDEN powód, aby zmienić kod.)

Jeśli klasa ma być odpowiedzialna za (1) wyświetlanie, oraz za (2) interakcje, to powody do zmiany będą przynajmniej dwa.

No i człowiek potem zaczyna się zastanawiać, czy dana funkcja na pewno należy do tej klasy, bo równie dobrze mogłaby się znaleźć w innej...

A trzeba po prostu zacząć od zaprojektowania właściwej architektury oprogramowania.

W ogóle może pomyśleć o MVC (ang. Model View Controller)?

2) Uwagi do samego kodu.

Pomieszanie angielskiego z polskim:
this.dialogs, a za chwilę napisNaScenie
const zlotoGracza = app.player.stats.get('gold');

Zawsze zalecam język angielski. Jak ktoś nie zna - uczyć się i nieco bardziej trudzić przy pisaniu kodu (wiem, że to nie jest łatwe, sam też przez to przechodziłem).

No ale zdecydować się na jedno - albo wszystko po angielsku (co wygląda bardziej profesjonalnie, nawet jak człowiek popełnia błędy językowe), albo po polsku.

3) Pisanie gry typu Visual Novel.

Uwaga dodatkowa: rozumiem, nauka nauką, ale do pisania gier typu Visual Novels są dostępne specjalne narzędzia, jak np. RenPy. Też warto o tym wiedzieć.

komentarz 28 marca 2021 przez wsnofi Bywalec (2,680 p.)
1. Głównie chodziło o to czy zostawić tą metodę change, czy wszystko co potrzebuje dodać w głównej klasie i potem po prostu dopisywać w obiektach dialogowych jako opcjonalne parametry (np. zamiast kontroli wyswietlania jednej opcji w metodzie change(), dodać wartość "need" do opcji obiektu i jeśli istnieje i się spełnia, to wyświetlić tą opcje)

Bo w większości takie rzeczy pisałem w tej metodzie, ale zaczeły się powtarzać w roznych klasach/ scenach i pomyslalem ze mozna edytować główną klasę / rodzica i dodać aby potrzebne rzeczy było interpretowane przez wartości obiektu, a nie metodą change()

 

2. Nazwa zmiennych miała być dla przykładu aby łatwiej zrozumieć, stosuje tylko i wyłącznie angielski

3. Właśnie cała zabawa polega na pisaniu silnika i jego możliwości pod własne potrzeby, a wielu z opcji ktorych potrzebuje obecnie silniki nie posiadają
komentarz 28 marca 2021 przez edutomek Dyskutant (8,380 p.)

No to poniekąd sam sobie odpowiadasz na zadane pytanie. AFAIR, to paradygmat OOP polega (m.in.) na tym, aby wspólne metody zamieszczać w klasie, po której się dziedziczy (zapomniałem już, jak się taką klasę nazywa - nadrzędną? bazową?). Generalnie powtarzanie takiego samego (albo bardzo podobnego) kodu do dobrych praktyk nie należy (znowu mógłbym przytoczyć znaną zasadę DRY - Don't Repeat Yourself).

Wystarczy chwilę pomyśleć: co będzie, jeśli będziesz miał np. 10 klas, w których będą takie metody jak change, robiące właściwie to samo, a potem nagle się okaże, że trzeba zmienić sposób ich implementacji? Odpowiedź: trzeba będzie zmieniać implementację we wszystkich klasach. (A spróbuj zapomnieć o jednej z nich, to będziesz miał błąd...)

A przy jednej klasie, po której ta metoda jest dziedziczona, to wystarczy modyfikacje w tej jednej klasie i po sprawie.

Podobne pytania

0 głosów
1 odpowiedź 566 wizyt
pytanie zadane 6 kwietnia 2018 w HTML i CSS przez niezalogowany
0 głosów
1 odpowiedź 282 wizyt
pytanie zadane 21 lipca 2021 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
+2 głosów
1 odpowiedź 213 wizyt
pytanie zadane 4 kwietnia 2018 w Grafika i multimedia przez niezalogowany

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...