28
Orientação a Objetos na Prática Erick Sasse Cadena Sistemas [email protected] m.br

Orientação a Objetos na Prática Erick Sasse Cadena Sistemas [email protected]

Embed Size (px)

Citation preview

Page 1: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Orientação a Objetos na Prática

Erick SasseCadena [email protected]

Page 2: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

interface

• Por que OO?Por que OO?• Dicas básicas de OO em DelphiDicas básicas de OO em Delphi• Encapsulando componentes de terceirosEncapsulando componentes de terceiros• Coleções (listas de objetos)Coleções (listas de objetos)• Templates em Delphi (Generics cover)Templates em Delphi (Generics cover)• OPFsOPFs• PrevalênciaPrevalência• InterfacesInterfaces

Page 3: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Erick Sasse

• De Americana, SPDe Americana, SP• Desenvolvedor há uns 15 anos (Clipper, Delphi)Desenvolvedor há uns 15 anos (Clipper, Delphi)• Delphi desde a primeira versãoDelphi desde a primeira versão• Desenvolvedor PalmOS (PocketStudio)Desenvolvedor PalmOS (PocketStudio)• Aventuras em C# (VS.NET), PHP (pequenos Aventuras em C# (VS.NET), PHP (pequenos

projetos)projetos)• Analista de sistemas, MBA em TI pela FGV/Ohio Analista de sistemas, MBA em TI pela FGV/Ohio

UniversityUniversity• Palestrante BorCon, DDD, FDDPalestrante BorCon, DDD, FDD• Ex-MSX (Expert DDPlus)Ex-MSX (Expert DDPlus)• Ex-BBSeiroEx-BBSeiro• Aspirante a mergulhadorAspirante a mergulhador

Page 4: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Por que OO?

• Para simplificar o desenvolvimento de software, que Para simplificar o desenvolvimento de software, que obrigatoriamente ficam mais complexos a cada dia.obrigatoriamente ficam mais complexos a cada dia.– Sistema operacional evoluiSistema operacional evolui– Equipamentos evoluemEquipamentos evoluem– Softwares evoluemSoftwares evoluem

• Centralizar lógica em pequenos componentes Centralizar lógica em pequenos componentes independentes.independentes.

• Aumentar reutilização de código.Aumentar reutilização de código.• Ame ou odeie, mas você tem que entender como funciona.Ame ou odeie, mas você tem que entender como funciona.

– .NET é totalmente OO..NET é totalmente OO.• Muitos desenvolvedores Delphi não tem noção do poder que Muitos desenvolvedores Delphi não tem noção do poder que

têm em mãos. têm em mãos. • Não seja um plugador de componentes!Não seja um plugador de componentes!

Page 5: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Pilares da OO

• AbstraçãoAbstração• PolimorfismoPolimorfismo• HerançaHerança

•EncapsulamenEncapsulamentoto

Page 6: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Dicas básicas para OO em Delphi

• Um form é uma classe, não um objeto!Um form é uma classe, não um objeto!• Desabilite o auto-create dos forms e delete a variável global Desabilite o auto-create dos forms e delete a variável global

que o Delphi cria para os forms, pois só serve para dificultar que o Delphi cria para os forms, pois só serve para dificultar o entendimento de OO.o entendimento de OO.

type type TForm1 = TForm1 = classclass(TForm) (TForm) private private { Private declarations } { Private declarations } public public { Public declarations } { Public declarations } endend; ;

var var Form1: TForm1;Form1: TForm1; Remova isso!

Page 7: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Dicas básicas - Variáveis globais

• Variáveis globais (declaradas na Variáveis globais (declaradas na interfaceinterface das das units) são do mal, evite ao máximo.units) são do mal, evite ao máximo.

• Utilize variáveis privadas (declaradas em Utilize variáveis privadas (declaradas em privateprivate) ) para guardar dados de um form (ou outra classe para guardar dados de um form (ou outra classe qualquer).qualquer).

• Utilize variáveis locais (declaradas na Utilize variáveis locais (declaradas na implementationimplementation das units) para compartilhar das units) para compartilhar dados entre várias instâncias de um mesmo form.dados entre várias instâncias de um mesmo form.

• Quando precisar compartilhar dados entre forms Quando precisar compartilhar dados entre forms de tipos diferentes, crie uma classe global.de tipos diferentes, crie uma classe global.

• Mão na massa!Mão na massa!

Page 8: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Delphi faz “errado”• O Delphi na tentativa de ajudar o programador iniciante, expõe todos os O Delphi na tentativa de ajudar o programador iniciante, expõe todos os

componentes dos forms, violando o principio básico de OO, o componentes dos forms, violando o principio básico de OO, o encapsulamento. encapsulamento.

• Os componentes deveriam ser privados.Os componentes deveriam ser privados.

type type TForm1 = TForm1 = classclass(TForm) (TForm) Button1: TButton; Button1: TButton; Edit1: TEdit; Edit1: TEdit; Label1: TLabel; Label1: TLabel; private private { Private declarations } { Private declarations } public public { Public declarations } { Public declarations } endend; ;

Errado

Page 9: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Dicas básicas - Propriedades em forms

• Evite acessar componentes de um outro form Evite acessar componentes de um outro form diretamente.diretamente.

• Quando possível, exponha suas propriedades Quando possível, exponha suas propriedades através de propriedades do form.através de propriedades do form.

• Propriedades lhe dão muito mais poder, podem Propriedades lhe dão muito mais poder, podem incluir código adicional quando se lê e quando se incluir código adicional quando se lê e quando se grava um valor.grava um valor.

• Mão na massa!Mão na massa!

Page 10: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Dicas básicas - Métodos estáticos

• São executados independentes de uma São executados independentes de uma instância de classe, ou seja, não precisa instância de classe, ou seja, não precisa existir um objeto para que funcionem.existir um objeto para que funcionem.

• Mão na massa!Mão na massa!• Exemplo: Form ExecutávelExemplo: Form Executável

Page 11: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

TSQLF – Formatando dados para SQL

• Centralizando a formatação de dados para Centralizando a formatação de dados para composição de instruções SQL válidas para composição de instruções SQL válidas para o banco em uso.o banco em uso.

• Mão na massa!Mão na massa!

Page 12: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Dicas básicas – Owner (dono do objeto)

• O owner, quando destruido, é responsável por O owner, quando destruido, é responsável por destruir qualquer objeto que ele possua.destruir qualquer objeto que ele possua.

• É importante entender o conceito de owner É importante entender o conceito de owner para usar corretamente.para usar corretamente.

• Especialmente importante para programação Especialmente importante para programação Win32, quando objetos não destruidos Win32, quando objetos não destruidos provocam memory leaks (vazamento de provocam memory leaks (vazamento de memória).memória).

• Mão na massa!Mão na massa!

Page 13: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Construtores e Destrutores

• São os métodos chamados no momento que o São os métodos chamados no momento que o objeto é criado, e no momento em que é objeto é criado, e no momento em que é destruído.destruído.

• Os construtores são usados para criar objetos Os construtores são usados para criar objetos internos e configurar o estado inicial do objeto.internos e configurar o estado inicial do objeto.

• Os destrutores são usados para liberar os objetos Os destrutores são usados para liberar os objetos internos e executar qualquer operação adicional internos e executar qualquer operação adicional na finalização do objeto.na finalização do objeto.

• O construtor normalmente é sobrecarregado e O construtor normalmente é sobrecarregado e tem várias versões, para facilitar.tem várias versões, para facilitar.

• Mão na massa!Mão na massa!

Page 14: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Encapsulando componentes de terceiros

• Você não deixa seu código dependente de Você não deixa seu código dependente de componentes de terceiros.componentes de terceiros.

• Você consegue trocar de componente com Você consegue trocar de componente com extrema facilidade.extrema facilidade.

• Mão na massa!Mão na massa!• Encapsulando envio de mail, relatórios Encapsulando envio de mail, relatórios

simples e compactação de arquivos.simples e compactação de arquivos.

Page 15: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Sobrecarga de métodos

• Permite que um mesmo método seja Permite que um mesmo método seja chamado com parâmetros diferentes.chamado com parâmetros diferentes.

TPessoa.Create; TPessoa.Create;

TPessoa.Create(‘João’); TPessoa.Create(‘João’);

TPessoa.Create(‘João’, ‘Rua Martins Fontes, 71’, ‘São Paulo, SP’);TPessoa.Create(‘João’, ‘Rua Martins Fontes, 71’, ‘São Paulo, SP’);

Page 16: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Desenvolvimento 100% OO

• Substituição de registros e tabelas por objetos e lista de Substituição de registros e tabelas por objetos e lista de objetos.objetos.

• Objetos de negócioObjetos de negócio– TClienteTCliente– TProdutoTProduto– TUsuarioTUsuario

• Listas de objetos no lugar de DataSets.Listas de objetos no lugar de DataSets.• Muito trabalhoso, porém, muito poderoso.Muito trabalhoso, porém, muito poderoso.• O banco de dados passa a ser um mero armazenador, com O banco de dados passa a ser um mero armazenador, com

muito menos importância.muito menos importância.• Poucos usam.Poucos usam.• A principal barreira é a persistência dos objetos em bancos A principal barreira é a persistência dos objetos em bancos

de dados relacionais. Possíveis soluções:de dados relacionais. Possíveis soluções:– OPFs (Object Persistence Frameworks)OPFs (Object Persistence Frameworks)– Prevalência.Prevalência.

Page 17: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Coleções (listas de objetos)

• Agrupa objetos do mesmo tipo como o Agrupa objetos do mesmo tipo como o TDataSet faz com os registros de uma TDataSet faz com os registros de uma tabela.tabela.

• Não tipadas, aceitam qualquer objeto:Não tipadas, aceitam qualquer objeto:– VCL (Win32 e .NET): TObjectListVCL (Win32 e .NET): TObjectList– .NET (FCL): ArrayList.NET (FCL): ArrayList

• Mão na massa!Mão na massa!

Page 18: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Coleções tipadas

• Checagem de tipo pelo compilador.Checagem de tipo pelo compilador.• Evitam casts no código.Evitam casts no código.• Precisam ser criadas na mão. Precisam ser criadas na mão.

– Em Win32, criar uma classe que encapsule um Em Win32, criar uma classe que encapsule um TObjectList e implementar os métodos necessários ou TObjectList e implementar os métodos necessários ou herdar de TList. Prefiro a primeira opção.herdar de TList. Prefiro a primeira opção.

– Em .NET, herdar de CollectionBase, que já implementa Em .NET, herdar de CollectionBase, que já implementa interfaces úteis no .NET.interfaces úteis no .NET.

• Generics (.NET 2.0) permite “tipar” coleções na Generics (.NET 2.0) permite “tipar” coleções na declaração da variável.declaração da variável.

• Mão na massa!Mão na massa!

Page 19: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Templates no Delphi• Em Win32 provavelmente nunca teremos Generics e mesmo em .NET, Em Win32 provavelmente nunca teremos Generics e mesmo em .NET,

enquanto não temos, podemos usar uma estratégia interessante.enquanto não temos, podemos usar uma estratégia interessante.

typetype TCliente = classTCliente = class ...... end;end;

_ITEM_TYPE_ = TCliente;_ITEM_TYPE_ = TCliente;

{$I ListTemplateClass.inc}{$I ListTemplateClass.inc}

TClienteList = _LIST_IMPL_CLASS_;TClienteList = _LIST_IMPL_CLASS_;

• Onde ListTemplateClass.inc contem a implementação genérica de uma lista Onde ListTemplateClass.inc contem a implementação genérica de uma lista tipada.tipada.

• Mão na massa!Mão na massa!

Page 20: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

OPFs

• Frameworks de persistência de objetos.Frameworks de persistência de objetos.• Mapeiam objetos para tabelas de bancos de dados Mapeiam objetos para tabelas de bancos de dados

relacionais.relacionais.– Win32Win32

• tiOPFtiOPF• DePO, mantido pelo brasileiro César Romero.DePO, mantido pelo brasileiro César Romero.

– .Net.Net• Borland ECO (muito mais que um OPF)Borland ECO (muito mais que um OPF)• NHibernateNHibernate• NEONEO• WilsonORMapperWilsonORMapper• ObjectSpaces (Microsoft, ainda não lançado)ObjectSpaces (Microsoft, ainda não lançado)

Page 21: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Prevalência

• Todos os objetos ficam em memória no Todos os objetos ficam em memória no “servidor de objetos”.“servidor de objetos”.

• Não existe necessidade de um banco de Não existe necessidade de um banco de dados.dados.– Win32Win32

• XDAXDA

– .NET.NET• XPrevail (XPrevail (http://xprevail.sourceforge.net/http://xprevail.sourceforge.net/), mantido ), mantido

pelo brasileiro FernandoVM.pelo brasileiro FernandoVM.

Page 22: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Interfaces

• Recurso extremamente poderoso.Recurso extremamente poderoso.• Possibilita a criação de classes mais Possibilita a criação de classes mais

“desacopladas” (independentes), “desacopladas” (independentes), diminuindo a utilização de herança.diminuindo a utilização de herança.

• Permite desenvolver classes ainda mais Permite desenvolver classes ainda mais flexíveis e reutilizáveis.flexíveis e reutilizáveis.

• ““Malas” para usar em Win32 devido a Malas” para usar em Win32 devido a contagem de referência.contagem de referência.

• Muito mais simples em .NET.Muito mais simples em .NET.

Page 23: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Interfaces

IImprimivel = interfaceIImprimivel = interfaceprocedure Imprimir;procedure Imprimir;procedure Visualizar;procedure Visualizar;

end;end;

• Quando um objeto implementa a interface Quando um objeto implementa a interface IImprimivel, ele é obrigado a implementar os dois IImprimivel, ele é obrigado a implementar os dois métodos da interface (Imprimir e Visualizar).métodos da interface (Imprimir e Visualizar).

• Desta forma, uma outra classe que receba objetos Desta forma, uma outra classe que receba objetos para impressão, pode saber se o objeto é para impressão, pode saber se o objeto é imprimível ou não checando se ele implementa a imprimível ou não checando se ele implementa a interface IImprimivel.interface IImprimivel.

Page 24: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Interfaces

TDocumento = class(System.Object, IImprimivel)TDocumento = class(System.Object, IImprimivel)......publicpublic

......procedure Imprimir;procedure Imprimir;procedure Visualizar;procedure Visualizar;

end;end;

TClienteLista = class(CollectionBase, IImprimivel)TClienteLista = class(CollectionBase, IImprimivel)......publicpublic

......procedure Imprimir;procedure Imprimir;procedure Visualizar;procedure Visualizar;

end;end;

Page 25: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Interfaces

TImpressora = classTImpressora = classpublicpublic procedure Imprimir(Obj: System.&Object);procedure Imprimir(Obj: System.&Object);end;end;

procedure TImpressora.Imprimir(Obj: TObject);procedure TImpressora.Imprimir(Obj: TObject);beginbegin if Supports(Obj, IImprimivel) thenif Supports(Obj, IImprimivel) then (Obj as IImprimivel).Imprimir(Obj as IImprimivel).Imprimir elseelse MessageBox.Show(‘Objeto não suporta impressão!');MessageBox.Show(‘Objeto não suporta impressão!');end;end;

Page 26: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Conclusão

• Boas práticas em OO requerem mais Boas práticas em OO requerem mais código do que simplesmente ligar código do que simplesmente ligar componentes e codificar eventos.componentes e codificar eventos.

• Mas esse é o preço para desenvolver Mas esse é o preço para desenvolver software mais robusto e flexível.software mais robusto e flexível.

• Se ficou mais difícil com objetos, você Se ficou mais difícil com objetos, você provavelmente está fazendo errado.provavelmente está fazendo errado.

• SEMPRE obtive melhores resultados SEMPRE obtive melhores resultados quando usei OO corretamente.quando usei OO corretamente.

Page 27: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Referências

• OODesignOODesignhttp://www.oodesign.com.br/http://www.oodesign.com.br/

• Templates em DelphiTemplates em Delphihttp://bdn.borland.com/article/0,1410,27603,00.htmlhttp://bdn.borland.com/article/0,1410,27603,00.html

• SQLFSQLFhttp://delphi.about.com/od/adptips2005/qt/sqlformatvalue.htmhttp://delphi.about.com/od/adptips2005/qt/sqlformatvalue.htm

• Design Patterns em DelphiDesign Patterns em Delphihttp://bdn.borland.com/borcon2004/article/paper/0,1963,32129,00.http://bdn.borland.com/borcon2004/article/paper/0,1963,32129,00.htmlhtml

• Borland NewsGroupsBorland NewsGroupsnntp://nntp://newsgroupsnewsgroups..borland.comborland.com

• Crítica a OOCrítica a OOhttp://www.geocities.com/tablizer/oopbad.htmhttp://www.geocities.com/tablizer/oopbad.htm

Page 28: Orientação a Objetos na Prática Erick Sasse Cadena Sistemas erick.sasse@cadena.com.br

Obrigado!

• Erick SasseErick Sasse• [email protected]@cadena.com.br• www.ericksasse.com.brwww.ericksasse.com.br (meu blog) (meu blog)