• 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

0 głosów
539 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 (195,220 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 (195,220 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 2,012 wizyt
pytanie zadane 1 lipca 2015 w PHP przez Hatter Gaduła (3,200 p.)
–1 głos
3 odpowiedzi 4,556 wizyt
pytanie zadane 3 września 2017 w C i C++ przez Adamk Nowicjusz (210 p.)
+5 głosów
10 odpowiedzi 4,331 wizyt

93,776 zapytań

142,736 odpowiedzi

323,388 komentarzy

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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...