1
resposta

[Dúvida] Como instanciar um estado ao recuperar de um "banco de dados"

Vamos supor que o eu crie um Orçamento na minha plataforma. Meu orçamento se inicia como estado "Em Aprovação", agora vamos supor que eu só possa tomar alguma ação com esse Orçamento que não agora. Ou seja eu teria que salvar essa informação no meu Banco de Dados. Ao recuperar o meu orçamento do meu BD como que eu poderia instanciar essa classe de estado para que o meu Orçamento tenha seu estado carregado corretamente ?

1 resposta

Interessante! Acho que o melhor a se fazer seria criar CONSTANTES dentro da classe Orcamento para representar o estado, por exemplo:

        private const STATUS_EM_APROVACAO = 0;
        private const STATUS_APROVADO = 1;
        private const STATUS_OUTRO_STATUS = 2;

então a partir dessas constantes inserir um atributo e uma função interna para setar este atributo de acordo com o domínio:

        private int $status = null;

        private function setStatus(int $value)
        {
            switch ($value) {
                case STATUS_EM_APROVACAO:
                    $this->status = STATUS_EM_APROVACAO;
                    break;
                case STATUS_APROVADO:
                    $this->status = STATUS_APROVADO;
                    break;
                case STATUS_OUTRO_STATUS:
                    $this->status = STATUS_OUTRO_STATUS;
                    break;
            }
        }

OBS: Para este caso, como a função é privada, não teria problema em manter o valor $value em aberto para inserção do status desejado, acredito.

finalmente este atributo 'status' seria salvo junto ao orcamento no banco de dados, para sempre que se instanciar um objeto Orcamento do banco o valor do status já estaria disponível.

Quanto a usar algum design pattern para representar o 'status', acho que não seria necessário, ao menos que o modelo de negócio exija um sistema com o status de forma mais complexa, e/ou que mude com frequencia, pois assim as constantes e funcoes representativas do status sempre teriam de ser alteradas :(

APPEND:

Um jeito até melhor seria criar uma classe para representar Status, como abaixo:

        class Status
        {
            public const STATUS_EM_APROVACAO = 0;
            public const STATUS_APROVADO = 1;
            public const STATUS_OUTRO_STATUS = 2;

            private int $status;

            public function setStatus(int $value)
            {
                switch ($value) {
                    case STATUS_EM_APROVACAO:
                        $this->status = STATUS_EM_APROVACAO;
                        break;
                    case STATUS_APROVADO:
                        $this->status = STATUS_APROVADO;
                        break;
                    case STATUS_OUTRO_STATUS:
                        $this->status = STATUS_OUTRO_STATUS;
                        break;
                }
            }

            public function get(): int
            {
                return $this->status;
            }
        }

Então poderia utilizar um objeto de Status no construtor ded Orcamento, como abaixo:

        class Orcamento
        {
            private Status $status;

            public function __construct(Status $status)
            {
                $this->status = $status;

                $this->status->setStatus(Status::STATUS_EM_APROVACAO);

                echo $this->status->get();
            }
        }