Princípios de Design e Programação Orientada a Objetos – Solid

Já precisou trabalhar em um código criado por um terceiro, ou mesmo por você a muito tempo? Teve dificuldades? Todos nós gostaríamos de poder abrir nosso código ou mesmo de outras pessoas e ver que eles são fáceis de entender, de modificar sem causar transtornos em várias outras partes do sistema. O objetivo deste artigo é iniciar uma conversa sobre princípios de programação orientados a objetos.

 

O simples fato de seu sistema ser orientado a objetos, não significa que ele seja um bom código, e como podemos identificar se um código é de qualidade ou não? Para que um código/sistema tenha qualidade interna ele deve ser bem modular, ter cada classe em seu devido lugar e com sua responsabilidade bem definida. Foi pensando nisso que Michael Feather intitulou 5 principios de programação como SOLID, e estes princípios foi bastante difundido pelo Uncle Bob, cada letra da palavra SOLID representa um dos princípios de programação orientado a objetos, são eles:

 

SRP – Single Responsibility Principle, ou princípio da responsabilidade única. Segundo este princípio cada classe deve ter sua responsabilidade muito bem definida, isto é, serem coesas, desta maneira fica fácil entender o que uma determinada classe em seu sistema faz, e fácil de identificar qual parte do sistema deve ser alterada em casos de atualização.

 

OCP – Open Close Principle, ou principio do Aberto e Fechado. Este diz que as classes devem ser facilmente estendidas, seja através de herança, interface ou composição, sem que se tenha a necessidade de abrir a classe para realização de mudanças.

 

LSP – Liskov Substitution Principle, ou princípio da substituição de Liskov. Este principio foi definido por Bárbara Liskov, segundo o mesmo uma classe derivada  deverá poder ser substituída por sua classe base.

 

ISP – Interface Segregation Principle, ou princípio da segregação de interfaces. Este princípio trata da coesão das nossas classes, segundo ele é melhor termos muitas interfaces do que uma única interface com muitas funcionalidades.

 

DIP – Dependency Inversion Principle, ou princípio da inversão de dependências. Já este princípio prega que devemos depender de abstrações e não de classes concretas.

 

Seguindo estes princípios, teremos uma maior possibilidade de obtermos um código com melhor qualidade. Em breve irei detalhar cada um dos 5 princípios com exemplos.

 

 

 

ASSECIG

A ASSECIG é uma associação sem fins lucrativos com o objetivo de desenvolver atividades educativas e culturais para as pessoas mais carentes da cidade de Igarapé.

 

Verificamos que apesar de ter um grande trabalho educativo na cidade a associação não tinha uma divulgação adequada do seu trabalho, com isso resolvemos desenvolver o site de forma a atrair as pessoas mais abastadas da cidade para contribuírem com a mesma, além de ser um meio de divulgação das empresas que ajudam atualmente a associação, e, portanto isso instiga para que novas empresas venham a participar de forma voluntária da ASSECIG.

 

O desenvolvimento ocorreu em cinco etapas:

 

1. Na primeira etapa foi feita uma entrevista com a responsável pela associação para se obter a real necessidade da associação e qual benefício o site deveria trazer.

2. De posse dos requisitos fiz um estudo através de pesquisas no Google como as associações estavam se apresentando na internet, o que elas forneciam em termos de informação e quais funcionalidades interativas tinham, com isso pude começar o trabalho de desenvolvimento em si.

3. Na terceira etapa e de posse das informações referentes a concorrência e da análise dos requisitos constatei que a necessidade primordial é mostra os trabalhos realizados pela associação e deixar bem localizado no site quais as formas de se contatar a associação. Foi feita então uma primeira proposta de layout.

a. A Proposta (a) não foi aceita pela associação, pois a usabilidade não estava adequada, deixando as informações muito agrupadas com grande quantidade de fotos o que tirava o foco das informações.

b. A segunda proposta (b) foi prontamente aprovada, ela trás um layout mais “limpo” com as informações bem localizadas e seguindo alguns quesitos de usabilidade como facilitar a identificação de onde o internauta está no site.

4. Após aprovação do layout, deu-se inicio a codificação do mesmo, foi utilizada a linguagem XHTML juntamente com o CSS.

5. Na quinta etapa ocorreu a publicação no site, que foi registrar o domínio www.assecig.com.br no registro.br, hospedar o site em um provedor específico e fazer todos os testes de navegação para verificar possíveis falhas.

 

Conclusão

 

Conclui que o principal objetivo de um site para uma Associação Educativa é mostrar o que ela faz e já fez com o objetivo de atingir um publico específico que são as pessoas dispostas a serem voluntárias na Associação e empresas que pode entrar com ajuda financeira e material para a mesma e ter sua marca vista por toda uma comunidade.
Para o profissional de Análise de sistemas também tem grandes vantagens já que terá seu nome divulgado na sociedade e as empresas o poderão contratar para possíveis trabalhos remunerados desta forma é interessante esse tipo de projeto para a carreira do Analista.

Recuperando Índice IGP-M com PHP

<?php
/**
 * Faz consulta ao webservice do banco central e retorna o IGP-M atual
 * @author Julio Cezar - <[email protected]>
 */
class SOAP extends SOAPClient {

    private static $instance;

    private function SOAP($url) {
        return parent::__construct($url, array('soap_version'   => SOAP_1_1));
    }

    public static function getInstance($dados) {
        if (empty(self::$instance))
            self::$instance = new SOAP($dados);

        return self::$instance;
    }

    public function call($configuracoes) {
        return parent::__soapCall($configuracoes[0], $configuracoes[1]);
    }

}

class IGPM {
    private $url = "https://www3.bcb.gov.br/sgspub/JSP/sgsgeral/FachadaWSSGS.wsdl";
    
    /**
     *Função para acessar soap
     * @access public
     * @param array contendo os itens necessários para o retorno do webservice
     * @return objeto XML 
     */
    public function soap($conf){
        $cliente = SOAP::getInstance($this->url);

        $resultado = $cliente->call($conf);
        return simplexml_load_string($resultado);        
    }
   
    /**
     *Soma o indice dos ultimos 12 meses
     * @access public
     * @param type XML retornado da função soap
     * @return A soma dos indices
     */
    public function somaUltimos12Meses($xml){
        $soma = 0;
        foreach ($xml->SERIE->ITEM as $item) {
            $soma += (float) $item->VALOR;
        }

        return $soma;        
    }
    /**
     *
     * @param type XML retornado da função soap
     * @return O ultimo indíce convertido em float.
     */
    public function converterIndiceFloat($xml){
        /**
         * O valor será retornado como X.XXX,XX se usar o number_format, ou mesmo converter direto para float
         * o mesmo será truncado para baixo. Neste caso substituir o . da milhar por vazio e a , por ponto de modo a converter considerando
         * as casas decimais.
         */        
        return ((float) str_replace(",", ".", str_replace(".", "", (string) $xml->SERIE->VALOR)));       
    }    

    /**
     *
     * @return type XML contendo o ultimo indice do IGP-M
     */
    public function getUltimoIndiceXML() {
        $conf[0] = 'getUltimoValorXML';
        $conf[1] = array('codigoSerie' => 189);

       
        return $this->soap($conf);
    }

    /**
     *
     * @return type Os indices dos ultimos 12 meses em formato XML
     */
    public function getUltimos12Meses() {
        $mes = date('m');
        $ano = date('Y');

        $dataInicio = date("d/m/Y", strtotime("-12 month", mktime(0, 0, 0, $mes, 01, $ano)));
        $dataFim = date("d/m/Y", mktime(0, 0, 0, $mes + 1, 0, $ano));
        
        $conf[0] = 'getValoresSeriesXML';
        $conf[1] = array('codigoSeries' => array(189), 'dataInicio' => $dataInicio, 'dataFim' => $dataFim);

        return $this->soap($conf);
    }
}


/**
 * Teste das classes acima.
 */
echo "<pre>";

$teste_igpm = new IGPM();

$xml_indice = $teste_igpm->getUltimoIndiceXML();

echo "<br />--------------XML ULTIMO INDICE---------------<br />";

print_r($xml_indice);
echo "<br />";
echo "<br />--------------VALOR ULTIMO INDICE---------------<br />";
echo $teste_igpm->converterIndiceFloat($xml_indice);

echo "<br />";

echo "<br />--------------XML ULTIMO 12 MESES---------------<br />";

$xml_12_ult_indice = $teste_igpm->getUltimos12Meses();

print_r($xml_12_ult_indice);
echo "<br />--------------SOMA 12 MESES---------------<br />";
echo $teste_igpm->somaUltimos12Meses($xml_12_ult_indice);
?>