Desenvolvimento - C#

Strategy - Padrão de Projeto com Microsoft .NET C#

Veja neste artigo o padrão de projetos Strategy, usando .Net C#.

por Flávio Secchieri Mariotti



Introdução

Padrão de Projeto ou em inglês Design Patterns, é uma forma organizada de criar soluções para os problemas recorrentes do dia a dia de um programador.

1. Porque devo usar Padrão de Projeto

É possível desenvolver software sem utilizar padrões de projetos, e o fato de usar não característica um código ou software de qualidade, padrão de projeto é somente um dos vários detalhes que compõem um software. Usar padrão de projeto é uma escolha que cabe a cada desenvolvedor/time. Existem casos onde as empresas desenvolvem seus próprios padrões de projetos e suas framework de trabalho.

O conceito de padrão de projeto foi criado na década de 70 pelo arquiteto e matemático Christopher Alexander um australiano que foi um dos principais críticos da arquitetura moderna. Alexander definiu dois pontos fundamentais para criação de um padrão, apontando as características e formato básico que um "objeto" deve ter para ser classificado como padrão.

Características

· Encapsulamento

· Generalidade

· Equilíbrio

· Abstração

· Abertura

· Combinatoriedade

Formato

· Nome

· Exemplo

· Contexto

· Problema

· Solução

Agora podemos entender o que existe em comum no trabalho de Alexander com o desenvolvimento de software, podemos compreender o que é necessário para criação de um padrão. Vamos então entender quais os benefícios e vantagens que ao desenvolver software utilizando padrões de projetos o desenvolvedor/time pode obter.

 Alguns acontecimentos são comuns no dia a dia das fabricas de software, tais como: giro de funcionários; mudanças no sistema em produção; correção de erros; implementação de novos recursos; customizações especificas e etc. Os padrões de projetos tem como objetivo facilitar o desenvolvimento de software com a reutilização de soluções já implementadas. Atenção! Não estamos falando de reutilização de código e sim em um desenvolvimento padronizado com: vocabulário unificado; facilidade para comunicação e leitura do código; documentação padronizada; compreensão rápida do código para novos e antigos integrantes do time de TI.

2. Strategy - Padrão de Projeto

Em alguns artigos ou livros pode-se encontrar uma definição simples e objetiva do padrão de projeto strategy. É um conjunto de algoritmos encapsulados e intercambiáveis, sendo que a estratégia permite que o algoritmo se diversifique independentemente dos clientes que os utilizam.

2.1 Explorando um pouco mais

Para os desenvolvedores mais experientes, a definição acima pode ser o suficiente para esclarecer o comportamento e a importância do padrão strategy. Porem vamos explorar um pouco mais a teoria para deixar claro seu principal objetivo.

O padrão strategy funciona como um plano de ação para alcançar um terminado objetivo após receber as condições certas de entrada. Portanto o padrão strategy é semelhante a um algoritmo ou um método que processa e produz resultados a partir de um conjunto de entradas.

A principal intenção do padrão strategy é encapsular abordagens alternativas em classes distintas mas com uma operação comum.

2.1.1 Como funciona a operação

A operação estratégica funciona da seguinte forma: a estratégia define as entradas e saídas da operação, mas deixa a implementação para as classes individualmente. Com isso as classes implementam diversas abordagens para a mesma ação, sendo portando, intercambiáveis.

São chamados de intercambiáveis as operações que contém diferentes comportamentos, mas com a mesma interface para o cliente.

2.1.2 Cuidados necessários

Uma dica muito importante para os arquitetos e desenvolvedores é trabalhar sempre com o senso de necessidade.

Quando múltiplas estratégias começam a fazer parte do seu código, o mesmo pode se tornar complexo. A inclusão do padrão strategy deve ser estudada e avaliada com cuidado, buscando obter as principais vantagens do seu objetivo e evitar a complexidade do código.

3. Classificação

Padrões de projetos descreve 23 modelos de desenho, porem cabe ressaltar que existem centenas de padrões. No famoso livro Design Patterns dos autores Gamma, Helm, Johnson e Vlissides é apresentado 23 padrões de projeto, documentados e já conhecidos no mundo do desenvolvimento de software. É importante saber que isso não significa que esses padrões são os mais uteis para se implementar, sendo assim vale a pena pesquisar padrões de outras fontes.

Estes 23 padrões são divididos em padrões de criação, padrões estruturais e padrões comportamentais. Vamos explorar os 23 padrões de projeto na serie de artigo sobre o assunto. O padrão de projeto Strategy está classificado como padrão comportamental/operação.

4. Implementando o padrão de projeto Strategy

Vamos agora colocar em prática a teoria discutida acima. Para isso vamos tentar aplicar o padrão de projeto strategy em um exemplo real.

4.1 Projeto calculo de comissão

Vamos desenvolver um sistema que calcula a comissão dos vendedores da empresa "XVendeTudo". O processo de comissionamento da XVendeTudo funciona da seguinte forma: Os vendedores recebem 5% de todos os produtos vendidos, e os produtos na categoria especiais, o responsável pelo setor comercial ganha 2.5% da parcela de comissão do produto, sendo assim, o vendedor recebe somente 2.5% destes itens.

A figura 1 representa graficamente as classes e interfaces que pertencem ao sistema.


Figure 1. Diagrama de classes do projeto de Calculo de Comissão

Entendendo os objetos da figura 1.

            ClassConteudo: A classe conteúdo representa o objeto que faz referencia para a interface Strategy, ou seja, é conjunto de instruções do sistema que faz a chamada e passa as diretrizes          de entrada para o método de estratégia.

          InterfaceComissão: Este objeto define a interface que vai dar suporte as classes de estratégia. A           classe de conteúdo usa essa interface para chamada dos algoritmos definidos pelo interface.

          ConcreteStrategy (ClassComissaoIndividual, ClassComissaoConjunta): Implementação de           algoritmos que faz uso da interface strategy

4.1 Código do projeto

Implementação do objeto de interface.

interface InterfaceComissao {

        double CalcularComissao(double _vrTotalVenda, double _vrPercentual);

    }

Classes que representam o ConcreteStrategy.

class ComissaoIndividual : InterfaceComissao {

        public double CalcularComissao(double _vrTotalVenda, double _vrPercentual)

        {

            return ((_vrTotalVenda * _vrPercentual)/100);

        }

    }

class ComissaoConjunta : InterfaceComissao {

        public double CalcularComissao(double _vrTotalVenda, double _vrPercentual)

        {

            _vrPercentual = _vrPercentual / 2; // Representa parcela do gerente.

            return ((_vrTotalVenda * _vrPercentual) / 100);

        }

    }

   

Classe que representa o ClassConteudo.

class Conteudo {

        private InterfaceComissao _vrStrategy;

        public Conteudo(InterfaceComissao _vrStrategy) {

            this._vrStrategy = _vrStrategy;

        }

        public double ExecutaEstrategia(double _vrTotalVenda, double _vrPercentual) {

            return this._vrStrategy.CalcularComissao(_vrTotalVenda, _vrPercentual);

        }

    }

Classe principal do projeto.

class Program {

        static void Main(string[] args)

        {

            // Recupera da base de parâmetros o percentual de comissão

            double _vrPercentualComissao = 5;

            // Recupera da base de dados o valor total de venda de produtos normais.

            double _vrTotalPNormais = 5000;

           

            // Recupera da base de dados o valor total de venda de produtos especiais.

            double _vrTotalPEspeciais = 6000;

            Conteudo _clConteudo;

            _clConteudo = new Conteudo(new ComissaoIndividual());

            double _vrComissaoVendedor = _clConteudo.ExecutaEstrategia(_vrTotalPNormais,                                                                                         _vrPercentualComissao);

            _clConteudo = new Conteudo(new ComissaoConjunta());

            _vrComissaoVendedor += _clConteudo.ExecutaEstrategia(_vrTotalPEspeciais,                                                                                                _vrPercentualComissao);

            Console.WriteLine("A comissão total do vendedor é: {0}",                                                                                    _vrComissaoVendedor.ToString("N2"));

            _clConteudo = null;

        }

    }

Conclusão

O uso de estratégia é totalmente recomendável para qualquer segmento, sendo assim, não seria diferente para o desenvolvimento de software.

Pode-se concluir então que o padrão de projeto strategy permite que o conteúdo faça chamada a estratégia usando polimorfismo para executar a estratégia certa, o permite o desenvolvimento de um código limpo e simples.

Comunicado Importante

Espero que tenham gostado do conteúdo explorado neste artigo, caso exista interesse em conhecer um pouco mais sobre padrão de projeto strategy. Informe seu interesse usando o recurso de "comentários" neste artigo ou qualquer dúvida relacionada ao conteúdo do mesmo.

Referência

Eric T Freeman; Elisabeth Robson; Bert Bates; Kathy Sierra. Head First Design Patterns, O'Reilly Media, Inc 2004.

Steven John Metsker. Design Patterns in C#, Addison-Wesley Professional, 2004.

Erich Gramma; Richard Helm; Ralph Johnson; John Vlissides. Design Patterns Elements of Reusable Object-Oriented Software, Addison-Wesley Professional, 1994.

Flávio Secchieri Mariotti

Flávio Secchieri Mariotti - Especialista em Engenharia e Arquitetura de Software. Pós Graduado pelo Instituto de Pesquisa Avançada de Tecnologia IBTA em Engenharia de Software baseado em SOA. Bacharel em Sistemas de Informação pela UNIUBE e técnico em Processamento de Dados pela FEB. Consultor independente no desenvolvimento de software em arquitetura OO, SOA, GIS e Plataforma .NET.