1
resposta

Problemas ao executar a lógica desse modelo

Conforme o modelo apresentado, foi executado e exibido td certinho.

Ao declarar uma segunda fila, como no modelo abaixo descrito, o resultado esperado não é o correto.

from FilaFactory import FilaFactory
from Constantes import TIPO_FILA_NORMAL, TIPO_FILA_PRIORITARIA

# Instancia fila normal
fila1 = FilaFactory.pega_fila(TIPO_FILA_NORMAL)
fila1.atualiza_fila()
fila1.atualiza_fila()
fila1.atualiza_fila()
print(fila1.chama_cliente(8))
print(fila1.chama_cliente(15))

# Instancia fila prioritária
fila2 = FilaFactory.pega_fila(TIPO_FILA_PRIORITARIA)
fila2.atualiza_fila()
fila2.atualiza_fila()
fila2.atualiza_fila()
print(fila2.chama_cliente(6))
print(fila2.chama_cliente(2))

Ao executar imprime a seguinte saída:

E:\Desenvolvimento\Anaconda3\envs\bytebank\python.exe E:/Desenvolvimento/EstudosAlura/Python/bytebank/main.py
Caixa 8 livre. Senha NR1 chamada.
Caixa 15 livre. Senha NR2 chamada.
Caixa 6 livre. Senha NR3 chamada.
Caixa 2 livre. Senha PR1 chamada.

Process finished with exit code 0

Para o caixa 6, a senha a ser chamada deveria ter sido a PR1 e não NR3.

Os fontes para apreciação estão no meu github: https://github.com/lucazcabral/-bytebank-pip8/tree/erro_logica

1 resposta

Oi Lucas, tudo bem com você?

Quando executamos o método atualiza_fila() é similar a pegarmos uma etiqueta de senha fisicamente. Então imagine o seguinte:

  • Primeiro usuário da fila normal pega uma etiqueta (Foi gerada uma senha)
  • Segundo usuário da fila normal pega uma etiqueta (Foi gerada outra senha)
  • Terceiro usuário da fila normal pega uma etiqueta (Foi gerada outra senha)
  • Passa um tempo...
  • O caixa chama o primeiro usuário..
  • Passa um tempo...
  • O caixa chama o segundo usuário..

Observe que temos uma senha gerada para o terceiro usuário, mas ele não foi chamado na fila normal. No seu código o que acontece é que o próximo caixa que for fazer uma chamada, irá atender a senha gerada para o terceiro usuário. Veja:

fila1 = FilaFactory.pega_fila(TIPO_FILA_NORMAL)
fila1.atualiza_fila()
fila1.atualiza_fila()
fila1.atualiza_fila()
print(fila1.chama_cliente(8))
print(fila1.chama_cliente(15))

Geramos 3 senhas, mas só utilizamos duas. E do modo como o código foi implementado(com atributos estáticos para as classes, ou seja, compartilhados entre elas), ao chamar o próximo cliente, mesmo que tenhamos aberto o caixa prioritário, ele chamará a pessoa que gerou uma senha, mas ainda não foi atendida. Por isso que no caixa 6 temos a saída de NR3.

Um modo simples de corrigir isso é atualizar a fila com o mesmo número de clientes que iremos atender. Exemplo: vamos atender dois clientes, então atualizamos(geramos a senha) a fila duas vezes:

from FilaFactory import FilaFactory
from Constantes import TIPO_FILA_NORMAL, TIPO_FILA_PRIORITARIA

# Instancia fila normal
fila1 = FilaFactory.pega_fila(TIPO_FILA_NORMAL)
fila1.atualiza_fila()
fila1.atualiza_fila()
print(fila1.chama_cliente(8))
print(fila1.chama_cliente(15))

# Instancia fila prioritária
fila2 = FilaFactory.pega_fila(TIPO_FILA_PRIORITARIA)
fila2.atualiza_fila()
fila2.atualiza_fila()
print(fila2.chama_cliente(6))
print(fila2.chama_cliente(2))

Qualquer dúvida é só falar. Abraços e bons estudos!