Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Otimização de código

Salve galera, alguém consegue pensar num jeito melhor de fazer isso? O sorteio da Loteria Nacional da Irlanda acontece duas vezes por semana na quarta-feira e um sábado às 20 horas. Escreva uma função ou classe que calcula e retorna a próxima data do sorteio válido com base na data e hora atual e também em uma data e hora opcionalmente fornecida.

class IrishLottery
{

    private $now;

    private $wednesday;

    private $saturday;

    public function __construct($optionalDate = null)
    {
        try {

            $this->now = new DateTime($optionalDate);
            $currentDay = clone $this->now;
            $this->wednesday = clone $this->now;
            $this->saturday = clone $this->now;
            $currentDay->modify('this day 20:00');
            $ordinal = $this->now <= $currentDay ? 'this' : 'next';
            $this->wednesday->modify($ordinal . ' wednesday 20:00');
            $this->saturday->modify($ordinal . ' saturday 20:00');
        } catch (Exception $e) {
            die($e->getMessage());
        }
    }

    public function getNextDraw()
    {
        return $this->wednesday < $this->saturday ? $this->wednesday : $this->saturday;
    }
}
3 respostas

Oi Franklin, tudo bom?

Acho que da pra refatorar e remover algumas variáveis mas o algoritmo em sí parece bem justo. A lógica bate bem com o enunciado. A API de datas do PHP orientado a objetos é essa mesma e o método modify é a abordagem mais simples pra manipular o tempo em cima das datas.

A chamada do clone também é imprescindível porque sem ela você alteraria a mesma instância na memória.

Acho que também é possivel remover a lógica do construtor e receber a data como parâmetro no método getNextDraw.

Isso porque desse jeito você não seria obrigado a instânciar uma nova IrishLotery sempre que quisesse chamar o método getNextDraw e o código ficaria menos acoplado a classe, mais com cara de serviço =)

Abraço

Valeu André, bem pensando a parte de passar a variável pro método e não no construtor, eu pensei só no agora. A parte das variáveis eu já li e reli e não vi quem remover :(

solução!

Oi Franklin, tudo bom?

Perdão pela demora no retorno.

A variavel currentDay é uma copia exata do atributo now, você pode remover um dos dois, não? =)

O Try/Catch do __construct também pode ser removido já que estamos pegando a exception para terminar o sistema, que seria a mesma coisa de deixar estourar

Abraço