Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 10 de Novembro de 2025
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
38 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  [Intermediário] - Chain of Reponsability - Padrões de Projeto no Delphi Parte I
Publicado por rboaro : Segunda, Setembro 23, 2013 - 09:58 GMT-3 (339 leituras)
Comentários comentar   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Marcos Salles Situações podem ocorrer corriqueiramente em nossos projetos e não damos conta de sua recursividade e para cada “novo”/velho desafio uma solução é lançada. Dando a impressão que sempre se acha uma nova e “melhor” solução, a cada fez que refazermos o problema. Padrões de Projeto visa exatamente isto ,Definir um Padrão de comportamento na arquitetura de problemas velhos e já documentados . Hoje iremos tratar de um Padrão Chain of Responsability definido na categoria Comportamentais, que não é muito divulgado no Delphi, por ser RAD, o Delphi nos facilita o uso de Ifs e Cases na resolução nova de problemas velhos. Vamos propor o processamento de um Documento seguindo algumas regras que geralmente são detectadas na elaboração da UML quando abstraimos para o mundo “programático” problemas do mundo Real. A idéia é termos vários objetos instanciados , com a capacidade de processar um determinado protocolo e iremos definir qual desses objetos irá fazer a solicitação seguindo certas Validações .

Como exemplo desta Abstração podemos ter :
1. O sistema de compras de uma companhia, onde os Compradores podem submeter os pedidos de compra sem necessitar uma aprovação se o pedido tiver certas características (digamos, um limite máximo de valor) mas que, conforme estas características vão variando, o pedido deve ser submetido a aprovação por níveis hierárquicos cada vez mais altos (supervisor, gerente, diretor, presidente).
2.Sistema de Recebimento de uma concessionária , cujo o recebimento de ativos/produtos/serviços segue alguns critérios como o valor (por várias razões entre essas segurança não existe mais a possibilidade de entrar com um pacote de dinheiro debaixo do braço e sair montado num Carro) . Podendo o Pagamento ser feito no Balcão , no Caixa, com o Gerente ou através de uma Conta (Agência Bancaria )
3.Imagine uma máquina de refrigerantes, na qual vai-se adicionando moedas até o valor do refrigerante ser alcançado para a sua aquisição. Como existem infinitos tipos de moedas, além das moedas que já são antigas e não possui mais validade monetária, a máquina de refrigerantes tem que descobrir qual moeda entrou através de possíveis padrões, como por exemplo, a espessura, raio e peso. Então temos várias classes que representam os diversos valores de moedas , (lembramos ainda que podemos ter moedas de um mesmo valor porém com formatos diferentes) .

Nos dois primeiros cenários proprosto , ao primeiro olhar que traçamos á cerca do Problema/solução nos remete a acharmos mais simples e mais conveniente a utilização de ifs que podemos aplicar na condição e dependendo do resultado processar a requisição com o objeto adequado

if Pedido.valor > condicaoA and < condicaoB then
Supervisor.Compra // requisicao sendo processada
else
if Pedido.Valor => CondicaoB and < CondicaoC then
Gerente.Compra // requisicao sendo processada
else
Pedido.Valor => CondicaoC and < CondicaoD
Diretor.Compra // requisicao sendo processada
e ai Segue o Codigo testando para as Demais condições atê
Chagar no Presidente.Compra

Nos segundo cenário , poderemos implementar uma solução semelhante , já o terceiro cenário no caso das moedas implementar esses IFS , (são muitas as condiçoes a serem testadas .”a espessura”, “raio” e “peso”. ) e muitas as classes Moedas que existem e ainda virão a existir . Toda e qualquer moeda nova com outras especificações , mais condiçoes deverão ser testadas , ficando esta solução muito inviável e no bom sentido da POO um “código que Cheira mal” . Atê o momento estamos falando apenas do ponto de vista de Ifs encadeados o que dificulta a leitura e a manutenção dos códigos , estamos fazendo vista grossa a cerca de outros problemas como o auto Acoplamaneto da classe Form com as demais classe (moedas), a alta coesão existentes entre essas classes, e a Responsabilidade do Form , que deveria ser apenas um “Viewn dos Dados” , fica ainda ter que processar informaçoes , sem contar que toda e qualquer alteração que possa existir (Nova Moeda) , teremos que fazer alteraçoes na nossa classe Formulário ( Um classe deve ser aberta para expansão e nunca para Edição ). O que propõem esta série de artigos que será dividia em três partes é tentar resolver este problema de modo elegante , reutilizável , com baixo acoplamento entre as classes de modo Orientado a Objeto. Para isto recorremos ao Padrão Chain of Responsability onde a requisição feita por um objeto Cliente é transmitida ao longo de uma sequência de Classes até que a requisição seja suprida por uma delas , onde essas requisições envolvem alçadas de aprovação.

Queremos de antemão , dizer que o código que será apresentado visa criar um Modelo Genérico que atenda a qualquer Documento e que tenha válidade tanto para o exemplo simplório do Problema (Compra/Recebimento) abrangendo também o cenário das Moedas.

No momento vou ficando por aqui pela sua atenção meu muito Obrigado …

Link Original do Artigo:
http://marcosalles.wordpress.com/2012/02/27/chain-of-responsability-cadeia-de-responsabidades-padrao-de-projeto-no-delphi-design-patterns-parte-i/



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados