I am working on some project to learn how to make bigger and better software (multiplayer game) and I found a problem about having in my code a design pattern Command Pattern and anti-pattern God Object. Often I do end up win the latter one and I know that Fascades are okay, but my understanding of something being right and wrong in OOP is very blurry.
I've implemented the Command Pattern. Shortly, my command:
public interface IGameCommand : ICommand
{
bool Execute(Game game);
}
And an executor
public interface IExecutor<TState, TCommand>
{
void Execute(TCommand command);
}
Let's say that I have a command that does a lot: modifies some data, plays sound etc.
So, in my case, this should look like this:
public class MagicSpell: IGameCommand
{
int x; int y; int damage; string soundClipName; string effectName;
bool Execute(Game game)
{
game.gameState.map[x][y].unit.TakeDamage(damage);
...
game.soundPlayer.PlaySound(soundClipName);
...
game.specialEffectPlayer.PlayEffect(effectName);
...
}
}
As you can see, this forces my Game class to become a God object... or doesn't it? Since my Game class contains specialized classes that do their thing I am fulfilling the Single responsibility principle. I have some bad experience with ending up with a God Object, but is my solution viable and acceptable with OOP?
Or maybe is something wrong with my Command Pattern implementation and Execute(Game game)
?
Maybe making some specialized commands would help?
Aucun commentaire:
Enregistrer un commentaire