Bom é o seguinte, postei em três fóruns diferentes sobre as duvidas que eu tenho e nao tive retorno
http://social.msdn.microsoft.com/Forums/pt-br/vscsharppt/thread/13390785-2685-46ed-b6b7-0431a043adc8
http://www.unidev.com.br/phpbb3/viewtopic.php?f=61&t=54420
http://stackoverflow.com/questions/8297246/finite-state-machine-and-enclosing
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:
[code] 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));
}
}[/code]
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
[code] 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));
}
}[/code]
mas imagina que a StateMachine tem muitos outros metodos ficando
[code] 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)...
}[/code]
E por aí vai, se eu adiciona-se uma outra propriedade na Entidade teria:
[code] public class Entidade
{
public StateMachine StateMachine { get; set; }
public int Vida { get; set; }
public Weapon Weapon { get; set; }
public void Atack()
{
Weapon.Atack();
}[/code]
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
http://sofiaia.wordpress.com/2008/07/11/maquina-de-estados/
http://www.ai-junkie.com/architecture/state_driven/tut_state1.html
http://www.guj.com.br/java/24029-lei-de-demetrio-e-agregacao