1
resposta

Exercício Filtro Novo

Mudei o método filtra da classe FiltroMesmoMes para

      public function filtra($contas) {
        $filtrada = array();
        foreach($contas as $c) {
          $timestamp = strtotime($c->getDataAbertura());
          /*
          if($c->getDataAbertura()->get("month") == date("m") && 
            $c->getDataAbertura()->get("year") == date("Y")) {
          */
          if(date("m", $timestamp) == date("m") && 
             date("Y", $timestamp) == date("Y")) {           
              $filtrada[] = $c;
          }
        }

e fiz um index dessa forma abaixo

<?php

    error_reporting(E_ALL);
    ini_set("display_errors", 1);

    require "Banco.php";
    require "Conta.php";
    require "Filtro.php";
    require "FiltroMenorQue100Reais.php";
    require "FiltroMaiorQue500MilReais.php";
    require "FiltroMesmoMes.php";

    $banco = new Banco("Banco Template", "23451234", "Primeiro endereço 123", "primeiro@email.com", "Simples");

    //$conta1 = new Conta("001", "A1", "Primeiro", "CSV", date("d/m/Y", "01/01/2018"));
    $conta1 = new Conta("001", "A1", "Primeiro", "CSV", DateTime::createFromFormat("m-d-Y", "01-01-2018")->format("Y-m-d"));
    //$conta2 = new Conta("002", "A2", "Segundo", "CSV", date("d/m/Y", time()));
    $conta2 = new Conta("002", "A2", "Segundo", "CSV", date("Y-m-d"));
    $conta3 = new Conta("003", "A3", "Terceiro", "CSV", date("Y-m-d"));
    $conta4 = new Conta("004", "A4", "Quarto", "CSV", date("Y-m-d"));            

    $conta1->deposita(90);
    $conta2->deposita(200);
    $conta3->deposita(300);
    $conta4->deposita(510000);

    $banco->addConta($conta1);
    $banco->addConta($conta2);
    $banco->addConta($conta3);
    $banco->addConta($conta4);

    $contas = $banco->getContas();

    foreach ($contas as $conta){
        echo "Conta: ".$conta->getNumero()." ".$conta->getNome()." Data: ".$conta->getDataAbertura()." Saldo: ".$conta->getSaldo()."<BR />";
        //echo "Mes: ".$conta->getDataAbertura()->get("month")." Ano: ".$conta->getDataAbertura()->get("year")."<BR />";
        $timestamp = strtotime($conta->getDataAbertura()); 
        echo "Conta aberta no mes: ".date("F", $timestamp)." de ".date("Y", $timestamp)."<BR />";
    }    

    echo "Aqui<BR />";

    $filtro = new FiltroMenorQue100Reais();

    $filtradas = $filtro->filtra($contas);

    echo "Contas com menos de R$ 100,00<BR />";
    echo "-----------------------------<BR />";

    foreach ($filtradas as $conta){
        echo "Conta: ".$conta->getNumero()." ".$conta->getNome()." Saldo: ".$conta->getSaldo()."<BR />";
    }

    $filtro = new FiltroMaiorQue500MilReais();

    $filtradas = $filtro->filtra($contas);

    echo "Contas com mais de R$ 500.000,00<BR />";
    echo "-----------------------------<BR />";

    foreach ($filtradas as $conta){
        echo "Conta: ".$conta->getNumero()." ".$conta->getNome()." Saldo: ".$conta->getSaldo()."<BR />";
    }

    $filtro = new FiltroMesmoMes();

    $filtradas = $filtro->filtra($contas);

    echo "Contas abertas em ".date("F")."<BR />";
    echo "-----------------------------<BR />";

    foreach ($filtradas as $conta){
        echo "Conta: ".$conta->getNumero()." ".$conta->getNome()." Data: ".$conta->getDataAbertura()."<BR />";
    }

?>

Mas não fiz nenhuma chamada de um Filtro dentro de outro

1 resposta

Oi João, tudo bom?

Sem o relacionamento entre os filtros, não temos o comportamento do decorator.

Nesse caso, a ideia é estruturar os filtros em cadeia assim a gente consegue criar cenários como contas abertas no mesmo mes com mais de 500 reais e contas abertas no mesmo mês com menos de 100 .

Além disso, cuidado ao utilizar as funções date(). Nesse caso Não é muito nocivo, mas se você fosse escrever testes automatizados pras suas classes você teria bastante dor de cabeça =)

A melhor abordagem é sempre utilizar a api da classe DateTime.

abraço!