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

Pomoc w wyjaśnieniu wzorca programowania - Polecenie

Object Storage Arubacloud
0 głosów
283 wizyt
pytanie zadane 15 maja 2020 w C i C++ przez Krzysiek Kowalczyk Początkujący (360 p.)

Witam. 

Przerabiam właśnie video poradnik od CS50 i lua (flappy bird). Wspomniano tam o książce nt wzorców projektowych Roberta Nystroma. Mam mały problem z rozszyfrowaniem wzorca command. Otóż wiem że trzeba utworzyć bazową funkcję która będzie uruchamiała wybrany kod. Później definiuje się konkretne funkcje. > Tworzy się "odnośniki" do komendy dla każdego przycisku. Ale za nic nie jestem w stanie zrozumieć ostatniego przykładu (obsługa danych wejściowych):

void InputHandler::handleInput()
{
  if (isPressed(BUTTON_X)) buttonX_->execute();
  else if (isPressed(BUTTON_Y)) buttonY_->execute();
  else if (isPressed(BUTTON_A)) buttonA_->execute();
  else if (isPressed(BUTTON_B)) buttonB_->execute();
}

kod zaczerpnięty z https://gameprogrammingpatterns.com/command.html

Nie wiem czy czegoś nie doczytałem czy jak. Skąd w powyższym przykładzie handler wie jakiego kodu ma użyć? ( dlacze samo execute() a nie np execute(jump()) ) Czy na podstawie wcześniej ustalonej kolejności poszczególnych akcji? 

Będę bardzo wdzięczny za wyjaśnienie ;)

2 odpowiedzi

0 głosów
odpowiedź 15 maja 2020 przez j23 Mędrzec (194,920 p.)

Skąd w powyższym przykładzie handler wie jakiego kodu ma użyć?

A o polimorfizmie i funkcjach wirtualnych słyszał? Te cztery wskaźniki są typu Command*, czyli wskazują na klasę bazową. Ta ma w sobie deklarację metody wirtualnej execute, której implementacja jest dostarczana przez klasy pochodne. Ot i cała magia ;)

0 głosów
odpowiedź 15 maja 2020 przez Krzysiek Kowalczyk Początkujący (360 p.)

W klasach pochodnych w przykładzie jest jak byk 

class JumpCommand : public Command
{
public:
  virtual void execute() { jump(); }
};

class FireCommand : public Command
{
public:
  virtual void execute() { fireGun(); }
};

// You get the idea...

no i są tworzone pointery 

class InputHandler
{
public:
  void handleInput();

  // Methods to bind commands...

private:
  Command* buttonX_;
  Command* buttonY_;
  Command* buttonA_;
  Command* buttonB_;
};
void InputHandler::handleInput()
{
  if (isPressed(BUTTON_X)) buttonX_->execute();
  else if (isPressed(BUTTON_Y)) buttonY_->execute();
  else if (isPressed(BUTTON_A)) buttonA_->execute();
  else if (isPressed(BUTTON_B)) buttonB_->execute();
}

ale skąd bierze się to:A controller, with each button mapped to a corresponding 'button_' variable which in turn is mapped to a function.

nie widzę nigdzie aby był podstawiany fire command czy jump command. Za to u pana Zelenta w filmie o polimorfizmie w main widnieje :

 

komentarz 15 maja 2020 przez j23 Mędrzec (194,920 p.)

To komentarz do mojej odpowiedzi, czy tak ogólnie? Jeśli to pierwsze, to powinien znaleźć się w komentarzu do mojej odpowiedzi.

Dyskusje prowadzimy w komentarzach.


nie widzę nigdzie aby był podstawiany fire command czy jump command.

Nie ma, bo to artykuł opisujący wzorzec projektowy, a nie pokazujący krok po kroku, jak napisać jakąś tam klasę. Dla kogoś wiedzącego, czym jest i jak działa polimorfizm, myślę, że przekaz jest jasny.

Sam autor napisał, że "This is the Command pattern in a nutshell".

komentarz 15 maja 2020 przez Krzysiek Kowalczyk Początkujący (360 p.)
odświeżam sobie programowanie z lua i jeszcze nie doszedłem do tematu polimorfizmu. Stąd moja nie wiedza. Dzięki za łopatologiczne wytłumaczenie.

Podobne pytania

+5 głosów
3 odpowiedzi 1,275 wizyt
pytanie zadane 1 lipca 2015 w PHP przez Hatter Gaduła (3,180 p.)
–1 głos
3 odpowiedzi 3,971 wizyt
pytanie zadane 3 września 2017 w C i C++ przez Adamk Nowicjusz (210 p.)
+5 głosów
10 odpowiedzi 2,953 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...