Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Crítica sobre mudança de estado (DP State)

Olá. Eu estava vendo o design pattern State e me incomodou a forma de transição entre os estados. Cada estado tem seu próprio método incluso em TODAS as classes de estado sendo obrigatórias por serem métodos abstratos da classe pai. A maioria dali lança exceção, a única vantagem que eu enxerguei foi de retornar uma mensagem específica.

Talvez eu não tenha enxergado a praticidade disso, mas eu faria diferente.

Eu faria um método genérico de mudança de estado que recebesse como parâmetro uma classe de estado ou uma instância do estado desejado. A classe do estado atual teria uma lista de estados aceitos para transitar (ou o inverso caso a implementação fique melhor - no caso, estados proibidos). Portanto, é feita a mudança para o estado que veio como parâmetro caso ele passe na condição.

Exemplo:

class Estado_1(Classe_pai):
    estados_transitaveis = [Estado_2, Estado_7]
    def muda_estado(self, Classe_estado):
        if Classe_estado in estados_transitaveis:
        self.estado_atual = Classe_estado()
    else:
        raise Exception("Não é possível a mudança de estado de %s para %s".format(str(self.estado_atual),  str(Classe_estado))

Nota, pode ter algum erro sintático pq não testei 100%, mas creio que passei a ideia.

Quero saber se concordam comigo ou se eu deixei algo importante passar nomeu intendimento desse pattern na parte de transição de estados.

1 resposta

Oi Paulo, tudo bem?

A ideia principal desse pattern é que você tenha comportamentos em comum em diferentes estados e caso selecionado um comportamento X, você saberá para qual outro estado terá que mudar em tempo de execução.

Sua ideia de fazer um "seletor" de estados não está errada, é sim um modo de implementar/agregar a este padrão. As definições de padrões de projeto são geralmente as mais genéricas possíveis para dar suporte a qualquer problema e para que, outros desenvolvedores entendam mais facilmente o código... mas, você pode implementar o padrão de acordo com o seu problema.

Talvez o exemplo dado em aula não tenha ficado muito claro sobre o poder deste padrão, por isso deixarei abaixo duas referências a respeito:

Abraços e bons estudos!