• 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

VPS Starter Arubacloud
0 głosów
280 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,197 wizyt
pytanie zadane 1 lipca 2015 w PHP przez Hatter Gaduła (3,180 p.)
–1 głos
3 odpowiedzi 3,955 wizyt
pytanie zadane 3 września 2017 w C i C++ przez Adamk Nowicjusz (210 p.)
+5 głosów
10 odpowiedzi 2,894 wizyt

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

61,854 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!

...