Ajuda com Maquina de Estados e Encapsulamento

0 respostas
F

Bom é o seguinte, postei em três fóruns diferentes sobre as duvidas que eu tenho e nao tive retorno

[url]http://social.msdn.microsoft.com/Forums/pt-br/vscsharppt/thread/13390785-2685-46ed-b6b7-0431a043adc8[/url]
[url]http://www.unidev.com.br/phpbb3/viewtopic.php?f=61&t=54420[/url]
[url]http://stackoverflow.com/questions/8297246/finite-state-machine-and-enclosing[/url]

Mesmo pra quem não goste de programção de jogos, acho que minha duvida é válida ja que trata-se de Encapsulamento e DDD

depois que eu vi um video do giovanni bassi sobre DDD e artigos sobre Tell Dont ask, eu percebi que tem um monte de projeto aqui na empresa com programação estruturada (entidades burras e um monte de gerenciadores)

Então, se minha classe tiver uma propriedade com descrevi nos Foruns:

public class Entidade
    {
        public StateMachine StateMachine { get; set; }
        public int Vida { get; set; }
    }

    public class Estado1: Estado
    {
        private readonly Entidade _entidade;

        public Estado1(Entidade entidade)
        {
            _entidade = entidade;
        }

        public void Logica()
        {
            if (_entidade.Vida > 30)
                _entidade.StateMachine.ChangeState(new Estado2(_entidade));
        }
    }
eu estaria violando a Lei de Demeter, acessando a StateMachine da _entidade e o que diz o Tell Dont Ask
http://unplugged.giggio.net/unplugged/post/Tell-dont-ask.aspx
Eu pensei em fazer assim
public class Entidade
    {
        public StateMachine StateMachine { get; set; }
        public int Vida { get; set; }


        public void ChangeState(Estado estado)
        {
            StateMachine.ChangeState(estado);
        }
    }

    public class Estado1: Estado
    {
        private readonly Entidade _entidade;

        public Estado1(Entidade entidade)
        {
            _entidade = entidade;
        }

        public void Logica()
        {
            if (_entidade.Vida > 30)
                _entidade.ChangeState(new Estado2(_entidade));
        }

      
    }

mas imagina que a StateMachine tem muitos outros metodos ficando

public class Entidade
    {
        public StateMachine StateMachine { get; set; }
        public int Vida { get; set; }


        public void ChangeState(Estado estado)
        {
            StateMachine.ChangeState(estado);
        }

        public void BackToPreviousStates()
        {
            StateMachine.BackToPreviousStates();
        }

        public void SetGlobalState(Estado estado)
        {
            StateMachine.SetGlobalState(estado);
        }

        public void SetCurrentState(Estado estado)...
      
    }

E por aí vai, se eu adiciona-se uma outra propriedade na Entidade teria:

public class Entidade
    {
        public StateMachine StateMachine { get; set; }
        public int Vida { get; set; }
        public Weapon Weapon { get; set; }

        public void Atack()
        {
            Weapon.Atack();
        }

ou seja, cada ves que eu criar classes para tirar a responsabilidade das costa de minha entidade eu adicionarei de qualquer forma metodos a mais nela...
Desculpe o Codigo em C#, mas é o que tenho aqui, se não entenderem eu mudo para java...

minhas referencias para esta codigo são
[url]http://sofiaia.wordpress.com/2008/07/11/maquina-de-estados/[/url]
[url]http://www.ai-junkie.com/architecture/state_driven/tut_state1.html[/url]
[url]http://www.guj.com.br/java/24029-lei-de-demetrio-e-agregacao[/url]

Criado 1 de dezembro de 2011
Respostas 0
Participantes 1