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

Ocena kodu źródłowego.

VPS Starter Arubacloud
0 głosów
165 wizyt
pytanie zadane 11 lutego 2019 w C i C++ przez Huberti Gaduła (4,500 p.)
edycja 11 lutego 2019 przez Huberti

Witam, proszę o ocenę poniższego kodu źródłowego. Jego głównym zadaniem jest obsługa zdarzeń klawiatury, aby umożliwić graczowi ruch. 

MovementKeys.h (klawisze do sterowania graczem)

#pragma once

#include <SFML/Window/Keyboard.hpp>

class MovementKeys {
public:
	MovementKeys(sf::Keyboard::Key up,
				 sf::Keyboard::Key down,
				 sf::Keyboard::Key left,
				 sf::Keyboard::Key right)
		: up(up), down(down), left(left), right(right) {}

	bool isUp(sf::Keyboard::Key key) const { return key == up; }

	bool isDown(sf::Keyboard::Key key) const { return key == down; }

	bool isLeft(sf::Keyboard::Key key) const { return key == left; }

	bool isRight(sf::Keyboard::Key key) const { return key == right; }

private:
	const sf::Keyboard::Key up;
	const sf::Keyboard::Key down;
	const sf::Keyboard::Key left;
	const sf::Keyboard::Key right;
};

PlayerEvent.h

#pragma once

class PlayerEvent {
public:
	void turnOnMovingUp() { movingUp = true; }
	void turnOffMovingUp() { movingUp = false; }
	bool isMovingUp() const { return movingUp; }

	void turnOnMovingDown() { movingDown = true; }
	void turnOffMovingDown() { movingDown = false; }
	bool isMovingDown() const { return movingDown; }

	void turnOnMovingLeft() { movingLeft = true; }
	void turnOffMovingLeft() { movingLeft = false; }
	bool isMovingLeft() const { return movingLeft; }

	void turnOnMovingRight() { movingRight = true; }
	void turnOffMovingRight() { movingRight = false; }
	bool isMovingRight() const { return movingRight; }

private:
	bool movingUp = false;
	bool movingDown = false;
	bool movingLeft = false;
	bool movingRight = false;
};

PlayerEventHandler.h

#pragma once

#include <SFML/Window/Event.hpp>

class PlayerEvent;
class MovementKeys;

class PlayerEventHandler {
public:
	void handleEvent(PlayerEvent& playerEvent,
					 const MovementKeys& movementKeys,
					 const sf::Event& event) const;

private:
	void handlePressedKey(PlayerEvent& playerEvent,
						  const MovementKeys& movementKeys,
						  const sf::Event::KeyEvent& keyEvent) const;

	void handleReleasedKey(PlayerEvent& playerEvent,
						   const MovementKeys& movementKeys,
						   const sf::Event::KeyEvent& keyEvent) const;
};

PlayerEventHandler.cpp

#include "PlayerEventHandler.h"
#include "PlayerEvent.h"
#include "MovementKeys.h"

void PlayerEventHandler::handleEvent(PlayerEvent& playerEvent,
									 const MovementKeys& movementKeys,
									 const sf::Event& event) const
{
	switch (event.type) {
	case sf::Event::KeyPressed:
		handlePressedKey(playerEvent, movementKeys, event.key);
		break;
	case sf::Event::KeyReleased:
		handleReleasedKey(playerEvent, movementKeys, event.key);
		break;
	}
}

void PlayerEventHandler::handlePressedKey(PlayerEvent& playerEvent,
										  const MovementKeys& movementKeys,
										  const sf::Event::KeyEvent& keyEvent) const
{
	const sf::Keyboard::Key key = keyEvent.code;
	if (movementKeys.isUp(key))
		playerEvent.turnOnMovingUp();
	else if (movementKeys.isDown(key))
		playerEvent.turnOnMovingDown();
	else if (movementKeys.isLeft(key))
		playerEvent.turnOnMovingLeft();
	else if (movementKeys.isRight(key))
		playerEvent.turnOnMovingRight();
}

void PlayerEventHandler::handleReleasedKey(PlayerEvent& playerEvent,
										   const MovementKeys& movementKeys,
										   const sf::Event::KeyEvent& keyEvent) const
{
	const sf::Keyboard::Key key = keyEvent.code;
	if (movementKeys.isUp(key))
		playerEvent.turnOffMovingUp();
	else if (movementKeys.isDown(key))
		playerEvent.turnOffMovingDown();
	else if (movementKeys.isLeft(key))
		playerEvent.turnOffMovingLeft();
	else if (movementKeys.isRight(key))
		playerEvent.turnOffMovingRight();
}

Player.h

#pragma once

#include "MovementKeys.h"
#include "PlayerEvent.h"
#include "PlayerEventHandler.h"
#include <SFML/Window/Event.hpp>

class Player {
public:
	Player(const MovementKeys& movementKeys)
		: movementKeys(movementKeys) {}

	void handleEvent(const PlayerEventHandler& eventHandler, const sf::Event& event)
	{
		eventHandler.handleEvent(playerEvent, movementKeys, event);
	}

private:
	const MovementKeys movementKeys;
	PlayerEvent playerEvent;
};

Generalnie, czy wykorzystanie klasy PlayerEventHandler ma sens? Jej metoda  handleEvent przyjmuje aż 3 argumenty, a przecież równie dobrze można to zaimplementować bezpośrednio w klasie Player.

Uogólniając, czy wydzielenie zachowania obiektu od jego danych to dobry pomysł? Jeżeli tak, to czy warto dane pakować w strukturę, aby ułatwić przekazywanie ich do klas obsługujących zachowanie?

1
komentarz 11 lutego 2019 przez j23 Mędrzec (194,920 p.)

Generalnie, czy wykorzystanie klasy PlayerEventHandler ma sens?

Według mnie nie ma sensu.

1 odpowiedź

0 głosów
odpowiedź 11 lutego 2019 przez Bondrusiek Maniak (61,370 p.)

Witam,

nie znam się szczegółowo na SFML ale wydaje mi się że powinieneś używać include guard(nie znam polskiej nazwy) zamiast pragma once

#pragma once

//zamień na

#ifndef HEADER_H
#define HEADER_H

...

#endif // HEADER_H

https://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard

1
komentarz 11 lutego 2019 przez Arkadiusz Sikorski Pasjonat (20,160 p.)

Po polsku mówi się na to "strażnik nagłówka".

A co do pragma once, to obecne kompilatory raczej to wspierają, więc dopóki nie pisze kodu na jakiś archaiczny kompilator (na przykład na jakąś specjalistyczną platformę), to pragma once jest jak najbardziej w porządku.

komentarz 11 lutego 2019 przez Huberti Gaduła (4,500 p.)
edycja 11 lutego 2019 przez Huberti
Dzięki za sugestie, ale póki co to kompilator MSVC jest dla mnie wystarczający, więc nie zwracam uwagi na kompatybilność z resztą.

Podobne pytania

0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 3 marca 2019 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
0 odpowiedzi 110 wizyt
pytanie zadane 19 lutego 2019 w C i C++ przez Huberti Gaduła (4,500 p.)
0 głosów
2 odpowiedzi 191 wizyt
pytanie zadane 3 stycznia 2019 w C i C++ przez Huberti Gaduła (4,500 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 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!

...