|
Usuários |
|
86 Usuários Online
|
|
[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)
comentar Enviar para um amigo Versão para impressão
|
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 pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|