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

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
86 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 II
Publicado por rboaro : Terça, Setembro 24, 2013 - 08:03 GMT-3 (258 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 No moduloI deste Artigo foi proposto a criação de um algoritmo no estilo máquina de Refrigerantes . Onde moedas com as propriedades (Peso , diâmetro , espessura) serão adicionadas na máquina e esta retornará o Valor desta Moeda com base nesta propriedades ( regras de aprovação) . A dificuldade está no número elevado de classes moedas que já existem e que virão , e se nosso Algorítmo não for centrado em um Modelo POO certamente iremos ter “n” problemas no futúro . Para nosso exemplo didático iremos trabalhar com Três tipos de classe Moedas (TCinco_Centavos , TDez_Centavos , TVinteCinco_Centavos) . Estas Classes são especialização da classe TMoeda a qual definiremos abaixo

unit uMoedas;

interface

uses
rtti,
uTWBusinessObj,
uDocumentoMoedas,
uIBusiness,
uIDocumento;
type
TMoedas = class(TWBusinessObj)
public
private
FEspessura:double;
FPeso:Double;
FDiametro:Double;
FValor:Double;
protected
constructor create;
public
function RequisitaAprovacao(aDoc:IDocumento):TValue;override;
property Espessura:Double read FEspessura Write FEspessura;
property Peso:Double read FPeso Write FPeso;
property Diametro:Double read FDiametro Write FDiametro;
property Valor:Double read FValor Write FValor;
end;

implementation

Alguma observaçõess neste momento se fazem necessárias
◾ Em primeiro lugar perceba que esta Classe não Morde . Não precisa olhar para ela com esta cara e nem ter medo dela . Ela é simples
◾Todas as moedas terão (Espessura , Peso , Diametro , Valor )
◾A classe TMoeda herda da classe TWBusinessObj , a qual falaremos dela mais adiante
◾O coração desta classe é o método RequisitaAprovacao cuja a implementaçção segue abaixo

//falaremos mais Adiante sobre a instanciação de Documento******
constructor TMoedas.create;
begin
Documento:=TDocumento_Moeda.Create;
end;

//para nos o imprtante no momento é o método RequisitaAprovacao
function TMoedas.RequisitaAprovacao(aDoc: IDocumento): TValue;
begin
with TDocumento_Moeda(adoc) do
if (Espessura = self.FEspessura)and
(Peso = self.FPeso)and
(Diametro = self.FDiametro) then
result:=FValor
else
if Assigned(sucessor) then
result:=sucessor.RequisitaAprovacao(aDoc);
end;

Neste método fazemos um TypeCast do Documento para a classe TDocumento_Moeda e testámos as suas Propriedades (espessura , peso , Diâmetro) , caso verdadeiro retornamos Fvalor e caso falso chamamos o Sucessor e replicamos o teste RequisitaAprovacao . Neste ponto “complicamos” , estamos falando em adoc:IDocumento , estamos falando em TValue . Amigo Marco , eu quero é TMoeda e eu quero retorno de Real e não TValue ( uses RTTI ). Sem falar nesta classe TDocumento_Moeda e este tal de Sucessor . Simples , no canto direito desta tela lá em cima tem um “X” , clico nele , ufa que alivio , mando este sucessor para ….

Espere , calma , tá muito nervoso . Eu “num” disse que seria fácil , não foi para mim ao desenvolver esta classe e muito pior ao escrever este artigo .. O que você tem que entender que nosso objetivo não é simplesmente desenvolver o Padrão Chain of Responsability para classe TMoeda , mas sim para todo Documento . E nem todo documento é um Moeda e muito menos tem um ( Fvalor=Real ) para ser retornado . aqui deixo uma sugestão , quer reaproveitamento de seus códigos ? , que utilizar a roda ?, implemente sua Solução utilizando Interfaces .

Vi que você não apertou o “X”, os outros dez já se mandaram , ficamos só nós , e iremos adiante atê a próxima estação … O próximo passo é definir a interface IDocumento

unit uIDocumento;

interface

Type
IDocumento = Interface
['{9A806655-2C58-460B-B094-956F73EF668D}']
End;

implementation

end.


Ué , isto é meu IDocumento ???? Mas não tem nada ai … Literalmente Nada .. Vá na primeira esquina , encontre uma loja de afins , compre um Luneta e olhe para o céu . Procure pelo buraco Negro e veja que tb não tem Nada ( certo ??? ) . Pois é IDocumento é nosso Buraco Negro . Podemos seguir adiante , alguma dúvida sobre buraco Negro . Não né

Vamos agora implementar nosso documento Moeda

unit uDocumentoMoedas;

interface

uses uIDocumento;

Type
TDocumento_Moeda = class(TInterfacedObject,IDocumento)
public
class var Espessura:double;
class var Peso:double;
class var diametro:Double;
end;

implementation
{ TDocumento_Moeda }
end.


Perceba que a nossa classe TDocumento_Moeda tem as variáveis (Peso , Diâmetro , espessura ) que serão consumidas pela regra de validação < RequisitaAprovacao> da classe TMoeda , e o mais importante implementa o nosso Buraco Negro (a Interface IDocumento )

E as nossas especializaçoes da classe TMoeda (TCinco_Centavos , TDez_Centavos , TVinteCinco_Centavos) , iremos implementa-las sem falar delas (pois são muito simples)

unit uCinco_Centavos;

interface

uses
uIBusiness;

var
Cinco_Centavos:IBusiness;

implementation
uses
uMoedas;

type
TCinco_Centavos = class (TMoedas)
constructor Create;
end;

constructor TCinco_Centavos.Create;
begin
Espessura:=3;
Peso:=5;
Diametro:=5;
Valor:=5;
inherited;
end;

initialization
Cinco_Centavos:=TCinco_Centavos.Create;
end.


As demais classes seguem a mesma linha com a diferença nas especificações

constructor TDez_Centavos.Create;
begin
Espessura := 4;
Peso := 10;
Diametro := 10;
Valor := 10;
inherited;
end;

constructor TVinteCinco_Centavos.Create;
begin
Espessura := 5;
Peso := 15;
Diametro := 15;
Valor := 25;
inherited;
end;


Considerações Finais…
◾Sei que não esta fácil , porém a dificuldade inicial será compensada pela simplicidade adiante a maneira como o modelo é expansivel para diversa outras classes
◾Quando se trata de uma abstração temos uma certa autonomia para idealizamos um solução . Esta solução é pessoal e muitas das vezes esta longe de ser a melhor . Não me entenda como a resposta , mas sim , como a pergunta
◾Atê a data de hoje não vi um trabalho genérico desta natureza para o Delphi o que em encorajou a tentar generalizar o Modelo. Quero frisar que pode e deve ser melhorado , temperado e servido a gosto .
◾O Artigo final ainda esta sendo processado

Por fim vou ficando por aqui , minha cordialidade e meu abraço amigo, deixando claro que estarei apto a tentar ajudar no que for preciso. O feedback é de graça , mesmo críticas contrárias serão acatada , pois não ha nada melhor do que aprender . Espero você no próximo Buraco Negro ..

ps) Detalhe adicional . Menti para Você . Não foram somente dez que clicaram no “X” , foram muito mais , é porque tive vergonha de contar a verdade e não quiz desanimar você . Mas “bá” ,vamos esquecer este assunto ..

Link Original do Artigo:
http://marcosalles.wordpress.com/2012/03/04/chain-of-responsability-cadeia-de-responsabilidades-padrao-de-projeto-no-delphi-design-patterns-parte-ii/



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