A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Orientação a Objetos na Prática Erick Sasse Cadena Sistemas

Apresentações semelhantes


Apresentação em tema: "Orientação a Objetos na Prática Erick Sasse Cadena Sistemas"— Transcrição da apresentação:

1 Orientação a Objetos na Prática Erick Sasse Cadena Sistemas

2 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

3 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 projetos)Aventuras em C# (VS.NET), PHP (pequenos projetos) Analista de sistemas, MBA em TI pela FGV/Ohio UniversityAnalista de sistemas, MBA em TI pela FGV/Ohio University Palestrante BorCon, DDD, FDDPalestrante BorCon, DDD, FDD Ex-MSX (Expert DDPlus)Ex-MSX (Expert DDPlus) Ex-BBSeiroEx-BBSeiro Aspirante a mergulhadorAspirante a mergulhador

4 Por que OO? Para simplificar o desenvolvimento de software, que obrigatoriamente ficam mais complexos a cada dia.Para simplificar o desenvolvimento de software, que obrigatoriamente ficam mais complexos a cada dia. –Sistema operacional evolui –Equipamentos evoluem –Softwares evoluem Centralizar lógica em pequenos componentes independentes.Centralizar lógica em pequenos componentes 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. Muitos desenvolvedores Delphi não tem noção do poder que têm em mãos.Muitos desenvolvedores Delphi não tem noção do poder que têm em mãos. Não seja um plugador de componentes!Não seja um plugador de componentes!

5 Pilares da OO AbstraçãoAbstração PolimorfismoPolimorfismo HerançaHerança EncapsulamentoEncapsulamento

6 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 que o Delphi cria para os forms, pois só serve para dificultar o entendimento de OO.Desabilite o auto-create dos forms e delete a variável global que o Delphi cria para os forms, pois só serve para dificultar o entendimento de OO.type TForm1 = class(TForm) TForm1 = class(TForm) private private { Private declarations } { Private declarations } public public { Public declarations } { Public declarations } end; end; var Form1: TForm1; Remova isso!

7 Dicas básicas - Variáveis globais Variáveis globais (declaradas na interface das units) são do mal, evite ao máximo.Variáveis globais (declaradas na interface das units) são do mal, evite ao máximo. Utilize variáveis privadas (declaradas em private ) para guardar dados de um form (ou outra classe qualquer).Utilize variáveis privadas (declaradas em private ) para guardar dados de um form (ou outra classe qualquer). Utilize variáveis locais (declaradas na implementation das units) para compartilhar dados entre várias instâncias de um mesmo form.Utilize variáveis locais (declaradas na implementation das units) para compartilhar dados entre várias instâncias de um mesmo form. Quando precisar compartilhar dados entre forms de tipos diferentes, crie uma classe global.Quando precisar compartilhar dados entre forms de tipos diferentes, crie uma classe global. Mão na massa!Mão na massa!

8 Delphi faz “errado” O Delphi na tentativa de ajudar o programador iniciante, expõe todos os componentes dos forms, violando o principio básico de OO, o encapsulamento.O Delphi na tentativa de ajudar o programador iniciante, expõe todos os componentes dos forms, violando o principio básico de OO, o encapsulamento. Os componentes deveriam ser privados.Os componentes deveriam ser privados.type TForm1 = class(TForm) TForm1 = class(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 } end; end; Errado

9 Dicas básicas - Propriedades em forms Evite acessar componentes de um outro form diretamente.Evite acessar componentes de um outro form diretamente. Quando possível, exponha suas propriedades através de propriedades do form.Quando possível, exponha suas propriedades através de propriedades do form. Propriedades lhe dão muito mais poder, podem incluir código adicional quando se lê e quando se grava um valor.Propriedades lhe dão muito mais poder, podem incluir código adicional quando se lê e quando se grava um valor. Mão na massa!Mão na massa!

10 Dicas básicas - Métodos estáticos São executados independentes de uma instância de classe, ou seja, não precisa existir um objeto para que funcionem.São executados independentes de uma instância de classe, ou seja, não precisa existir um objeto para que funcionem. Mão na massa!Mão na massa! Exemplo: Form ExecutávelExemplo: Form Executável

11 TSQLF – Formatando dados para SQL Centralizando a formatação de dados para composição de instruções SQL válidas para o banco em uso.Centralizando a formatação de dados para composição de instruções SQL válidas para o banco em uso. Mão na massa!Mão na massa!

12 Dicas básicas – Owner (dono do objeto) O owner, quando destruido, é responsável por destruir qualquer objeto que ele possua.O owner, quando destruido, é responsável por destruir qualquer objeto que ele possua. É importante entender o conceito de owner para usar corretamente.É importante entender o conceito de owner para usar corretamente. Especialmente importante para programação Win32, quando objetos não destruidos provocam memory leaks (vazamento de memória).Especialmente importante para programação Win32, quando objetos não destruidos provocam memory leaks (vazamento de memória). Mão na massa!Mão na massa!

13 Construtores e Destrutores São os métodos chamados no momento que o objeto é criado, e no momento em que é destruído.São os métodos chamados no momento que o objeto é criado, e no momento em que é destruído. Os construtores são usados para criar objetos internos e configurar o estado inicial do objeto.Os construtores são usados para criar objetos internos e configurar o estado inicial do objeto. Os destrutores são usados para liberar os objetos internos e executar qualquer operação adicional na finalização do objeto.Os destrutores são usados para liberar os objetos internos e executar qualquer operação adicional na finalização do objeto. O construtor normalmente é sobrecarregado e tem várias versões, para facilitar.O construtor normalmente é sobrecarregado e tem várias versões, para facilitar. Mão na massa!Mão na massa!

14 Encapsulando componentes de terceiros Você não deixa seu código dependente de componentes de terceiros.Você não deixa seu código dependente de componentes de terceiros. Você consegue trocar de componente com extrema facilidade.Você consegue trocar de componente com extrema facilidade. Mão na massa!Mão na massa! Encapsulando envio de mail, relatórios simples e compactação de arquivos.Encapsulando envio de mail, relatórios simples e compactação de arquivos.

15 Sobrecarga de métodos Permite que um mesmo método seja chamado com parâmetros diferentes.Permite que um mesmo método seja chamado com parâmetros diferentes.TPessoa.Create;TPessoa.Create(‘João’); TPessoa.Create(‘João’, ‘Rua Martins Fontes, 71’, ‘São Paulo, SP’);

16 Desenvolvimento 100% OO Substituição de registros e tabelas por objetos e lista de objetos.Substituição de registros e tabelas por objetos e lista de objetos. Objetos de negócioObjetos de negócio –TCliente –TProduto –TUsuario 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 muito menos importância.O banco de dados passa a ser um mero armazenador, com muito menos importância. Poucos usam.Poucos usam. A principal barreira é a persistência dos objetos em bancos de dados relacionais. Possíveis soluções:A principal barreira é a persistência dos objetos em bancos de dados relacionais. Possíveis soluções: –OPFs (Object Persistence Frameworks) –Prevalência.

17 Coleções (listas de objetos) Agrupa objetos do mesmo tipo como o TDataSet faz com os registros de uma tabela.Agrupa objetos do mesmo tipo como o TDataSet faz com os registros de uma tabela. Não tipadas, aceitam qualquer objeto:Não tipadas, aceitam qualquer objeto: –VCL (Win32 e.NET): TObjectList –.NET (FCL): ArrayList Mão na massa!Mão na massa!

18 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 TObjectList e implementar os métodos necessários ou herdar de TList. Prefiro a primeira opção. –Em.NET, herdar de CollectionBase, que já implementa interfaces úteis no.NET. Generics (.NET 2.0) permite “tipar” coleções na declaração da variável.Generics (.NET 2.0) permite “tipar” coleções na declaração da variável. Mão na massa!Mão na massa!

19 Templates no Delphi Em Win32 provavelmente nunca teremos Generics e mesmo em.NET, enquanto não temos, podemos usar uma estratégia interessante.Em Win32 provavelmente nunca teremos Generics e mesmo em.NET, enquanto não temos, podemos usar uma estratégia interessante.type TCliente = class TCliente = class end; end; _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 tipada.Onde ListTemplateClass.inc contem a implementação genérica de uma lista tipada. Mão na massa!Mão na massa!

20 OPFs Frameworks de persistência de objetos.Frameworks de persistência de objetos. Mapeiam objetos para tabelas de bancos de dados relacionais.Mapeiam objetos para tabelas de bancos de dados relacionais. –Win32 tiOPFtiOPF DePO, mantido pelo brasileiro César Romero.DePO, mantido pelo brasileiro César Romero. –.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)

21 Prevalência Todos os objetos ficam em memória no “servidor de objetos”.Todos os objetos ficam em memória no “servidor de objetos”. Não existe necessidade de um banco de dados.Não existe necessidade de um banco de dados. –Win32 XDAXDA –.NET XPrevail (http://xprevail.sourceforge.net/), mantido pelo brasileiro FernandoVM.XPrevail (http://xprevail.sourceforge.net/), mantido pelo brasileiro FernandoVM.http://xprevail.sourceforge.net/

22 Interfaces Recurso extremamente poderoso.Recurso extremamente poderoso. Possibilita a criação de classes mais “desacopladas” (independentes), diminuindo a utilização de herança.Possibilita a criação de classes mais “desacopladas” (independentes), diminuindo a utilização de herança. Permite desenvolver classes ainda mais flexíveis e reutilizáveis.Permite desenvolver classes ainda mais flexíveis e reutilizáveis. “Malas” para usar em Win32 devido a contagem de referência.“Malas” para usar em Win32 devido a contagem de referência. Muito mais simples em.NET.Muito mais simples em.NET.

23 Interfaces IImprimivel = interface procedure Imprimir; procedure Visualizar; end; Quando um objeto implementa a interface IImprimivel, ele é obrigado a implementar os dois métodos da interface (Imprimir e Visualizar).Quando um objeto implementa a interface IImprimivel, ele é obrigado a implementar os dois métodos da interface (Imprimir e Visualizar). Desta forma, uma outra classe que receba objetos para impressão, pode saber se o objeto é imprimível ou não checando se ele implementa a interface IImprimivel.Desta forma, uma outra classe que receba objetos para impressão, pode saber se o objeto é imprimível ou não checando se ele implementa a interface IImprimivel.

24 Interfaces TDocumento = class(System.Object, IImprimivel)...public... procedure Imprimir; procedure Visualizar; end; TClienteLista = class(CollectionBase, IImprimivel)...public... procedure Imprimir; procedure Visualizar; end;

25 Interfaces TImpressora = class public procedure Imprimir(Obj: System.&Object); procedure Imprimir(Obj: System.&Object);end; procedure TImpressora.Imprimir(Obj: TObject); begin if Supports(Obj, IImprimivel) then if Supports(Obj, IImprimivel) then (Obj as IImprimivel).Imprimir (Obj as IImprimivel).Imprimir else else MessageBox.Show(‘Objeto não suporta impressão!'); MessageBox.Show(‘Objeto não suporta impressão!');end;

26 Conclusão Boas práticas em OO requerem mais código do que simplesmente ligar componentes e codificar eventos.Boas práticas em OO requerem mais código do que simplesmente ligar componentes e codificar eventos. Mas esse é o preço para desenvolver software mais robusto e flexível.Mas esse é o preço para desenvolver software mais robusto e flexível. Se ficou mais difícil com objetos, você provavelmente está fazendo errado.Se ficou mais difícil com objetos, você provavelmente está fazendo errado. SEMPRE obtive melhores resultados quando usei OO corretamente.SEMPRE obtive melhores resultados quando usei OO corretamente.

27 Referências OODesign Templates em Delphi em Delphi SQLF Design Patterns em Delphi Patterns em Delphi Borland NewsGroups nntp://newsgroups.borland.comBorland NewsGroups nntp://newsgroups.borland.com nntp://newsgroups.borland.com Crítica a OO a OO

28 Obrigado! Erick SasseErick Sasse (meu blog)www.ericksasse.com.br (meu blog)www.ericksasse.com.br


Carregar ppt "Orientação a Objetos na Prática Erick Sasse Cadena Sistemas"

Apresentações semelhantes


Anúncios Google