Escolar Documentos
Profissional Documentos
Cultura Documentos
Desenvolvimento
Frameworks de Desenvolvimento
Contedo
Unidade 1 Definio de Framework
Profissionais Envolvidos
10
11
Ambiente Eclipse
18
Viso Geral
19
19
19
20
21
A abordagem .NET
24
25
25
25
26
26
28
28
Conhecendo a IDE
29
29
Componentes da IDE
31
Menu
13
31
Frameworks de Desenvolvimento
32
Toolbox
32
Solution Explorer
35
Properties
36
Janela de Design
38
38
38
40
41
41
43
47
47
50
52
Herana e Agregao
56
Interfaces
63
Tratamento de excees
69
75
81
81
A importncia do StrongName
82
SQL Injection
86
47
88
Camada Desconectada
88
Camada Conectada
88
Frameworks de Desenvolvimento
89
Camada Desconectada
89
Camada Conectada
90
91
91
93
96
99
99
99
Erros de Semntica
99
A Classe Debug
100
Habilitando a Depurao
100
Adicionando BreakPoints
101
101
101
102
102
Depurao Remota
102
Tracing
102
Classe TraceContext
103
104
Dados do Trace
104
Categorias do Trace
104
106
Frameworks de Desenvolvimento
Unidade 1
Definio de Framework
Observe que um framework uma aplicao quase completa, mas com pedaos faltando.
Ao receber um framework, seu trabalho consiste em prover os pedaos que so especficos
para sua aplicao.
5
Frameworks de Desenvolvimento
Frameworks de Desenvolvimento
Frameworks de Desenvolvimento
Profissionais Envolvidos
No processo de desenvolvimento de um framework deve-se produzir uma estrutura de classes
com a capacidade de adaptar-se a um conjunto de aplicaes diferentes.
A principal caracterstica buscada ao desenvolver um framework a generalidade em relao
aos conceitos e funcionalidades do domnio tratado. Alm disso, fundamental que a
estrutura produzida seja flexvel.
Pode-se afirmar que o desenvolvimento de um framework diferente do desenvolvimento de
uma aplicao padro. A distino mais importante que frameworks tem que cobrir todos os
conceitos relevantes do domnio enquanto uma aplicao se preocupa somente com os
conceitos mencionados nos requisitos da aplicao (Bosh, 1999).
A complexidade em se desenvolver um framework deve-se aos seguintes fatores (Silva,
2000):
Necessidade de considerar os requisitos de um conjunto significativo de aplicaes de modo
a torn-lo genrico.
Necessidade de ciclos de evoluo voltados a dotar a estrutura de classes do framework de
alterabilidade (capacidade de alterar suas funcionalidades sem conseqncias imprevistas
sobre o conjunto da estrutura) e extensibilidade (capacidade de ampliar a funcionalidade
presente sem conseqncias imprevistas sobre o conjunto da estrutura).
Em termos prticos, dotar um framework de generabilidade, alterabilidade e extensibilidade
requerem uma cuidadosa identificao das partes que devem ser flexveis e a seleo de
solues de projetos de modo a produzir uma arquitetura bem estruturada. Isto conduz a
observao de princpios de projeto orientados a objetos.
Em termos ideais, um framework deve abranger todos os conceitos gerais de um domnio de
aplicao, deixando apenas aspectos particulares para serem definidos nas aplicaes
especficas (Silva, 2000).
No contexto de desenvolvimento, a existncia do framework estar sempre relacionada
existncia de outros artefatos que so originadores do framework, originados a partir dele ou
que exercem influncia na definio das estruturas de classes.
A figura mostra as vrias fontes de informao que influem na definio da estrutura de um
framework: artefatos de software existentes, artefatos de software produzidos a partir do
framework e o conhecimento do desenvolvedor do framework (ou a equipe de
desenvolvimento). As setas representam o fluxo de informaes que levam produo da
estrutura de classes do framework.
Como um framework geralmente no consegue ser uma construo completa de um domnio,
mas sim uma descrio aproximada, possvel que a construo de aplicaes sob um
framework leve obteno de novos conhecimentos do domnio tratado, que talvez no
estivessem disponveis durante a construo do framework. Estas novas informaes podem
levar necessidade de alterar o framework, causando a sua evoluo como ilustra a figura:
8
Frameworks de Desenvolvimento
Silva (2000) aborda que o desenvolvimento tradicional de aplicaes envolve dois tipos de
indivduos: o desenvolvedor de aplicao e o usurio de aplicao (ambos podem
corresponder a grupos de indivduos com diferentes funes).
Desenvolvedores devem levantar os requisitos de uma aplicao, desenvolv-la e entreg-la
aos usurios, que por sua vez interagem com a aplicao apenas atravs de sua interface.
O desenvolvimento de frameworks introduz outro indivduo, a saber, o desenvolvedor de
framework . Nesse contexto, o papel do usurio de aplicao o mesmo descrito acima. O
papel do desenvolvedor de aplicaes difere do caso anterior pela insero do framework no
processo de desenvolvimento de aplicaes. Com isto, o desenvolvedor de aplicaes um
usurio de um framework que deve estender e adaptar a estrutura deste framework para a
produo de aplicaes.
De forma genrica as atividades macros so descritas a seguir:
Anlise de domnio - processo de identificar e organizar o conhecimento sobre alguma
classe de problemas o domnio do problema para dar suporte descrio e soluo destes
(Arango e Prieto-Daz, 1991).
Projeto de framework o objetivo ao realizar essa atividade obter um framework flexvel.
A atividade rdua j que difcil encontrar as abstraes corretas e identificar as partes
estveis e variveis do framework. Para aumentar a extensibilidade e flexibilidade do
framework padres de projeto podem ser usados (Mattsson, 2000).
Instanciao do framework a instanciao difere dependendo do tipo de framework: caixa
branca (o usurio constri classes a partir das classes disponveis), caixa preta (o usurio tem
que escolher uma das classes fornecidas). Um framework pode ser instanciado uma ou mais
vezes dentro da mesma aplicao ou instanciado em diferentes aplicaes (Mattsson,2000).
Frameworks de Desenvolvimento
10
Frameworks de Desenvolvimento
Unidade 2
Plataforma de Desenvolvimento Java
Tecnologias Java
A plataforma Java constituda de um grande nmero de tecnologias, cada uma prov uma
poro distinta de todo o ambiente de desenvolvimento e execuo de software. Os usurios
finais, tipicamente, interagem com a mquina virtual Java (Java Virtual Machine, ou JVM) e
um conjunto padro de bibliotecas de classe.
11
Frameworks de Desenvolvimento
Existe um grande nmero de maneiras de se utilizar uma aplicao Java, inclundo applets
embutidas em pginas web, aplicativos de uso geral em desktops, aplicativos em aparelhos
celulares e em servidores de aplicaes para Internet.
Os desenvolvedores de aplicaes em Java utilizam um conjunto de ferramentas de
desenvolvimento, o JDK.
12
Frameworks de Desenvolvimento
Ambiente Eclipse
Eclipse um IDE (ambiente de desenvolvimento integrado) de cdigo aberto. Existe mais
ferramentas similares de cdigo aberto disponveis, mas o Eclipse IDE acabou tornando-se
uma tima alternativa em virtude da quantidade de plug-ins disponveis para dar suporte
aos diversos tipos de tecnologias que envolvem o desenvolvimento de softwares e sistemas.
Sua instalao muito simples, podemos baix-lo de http://www.eclipse.org em forma de
arquivo ZIP e s temos que descompact-lo na pasta onde quisermos t-lo instalado.
No site oficial, h opes para download que sugerem um desenvolvimento mais focado para
uma ou outra rea. Isso se deve ao fato de que essas opes de download j trazem embutidos
alguns plug-ins necessrios para facilitar o desenvolvimento dos projetos focados em uma ou
outra rea.
Para execut-lo basta acionar o arquivo Eclipse.exe. Uma vez iniciado abrir uma tela
inicial solicitando onde queremos que o Eclipse v salvando os projetos que criarmos:
Obs.: Nessa apostila optamos por usar a verso Eclipse IDE for Java EE Developers, que j
traz o suporte para o desenvolvimento de aplicaes web.
13
Frameworks de Desenvolvimento
Aps escolher a rea de trabalho (onde sero criados os diretrios - projetos com seus
cdigos), abrir a primeira tela da IDE, dando as boas vindas.
Essa pgina inicial pode ser fechada. Atrs dela est efetivamente o ambiente de
desenvolvimento.
Caso seja de seu interesse, navegue pelas opes que aparecem nessa tela inicial para obter
maiores informaes sobre a IDE.
14
Frameworks de Desenvolvimento
A primeira tela realmente significativa do Eclipse IDE possui uma srie de informaes
organizadas em painis.
O Package Explorer, que est no lado esquerdo da tela, a rea onde estaro dispostas as
informaes bsicas do seu projeto arquivos, diretrios, plugins, etc.
Os outros painis no so to importantes e alguns podem at ser fechados de acordo com a
preferncia do desenvolvedor.
Todos os painis podem ser abertos/fechados atravs do menu Window, em Show View.
Outro painel interessante o Outline, que fornece informaes sobre as classes, mtodos e
outros recursos usados no seu projeto.
Para vermos esses painis em pleno funcionamento, criaremos um exemplo bsico Ol
Mundo, como segue:
- V ao menu File e escolha New e dentro dessa opo Java Project.
15
Frameworks de Desenvolvimento
16
Frameworks de Desenvolvimento
- Na etapa seguinte, voc dever criar um novo arquivo, vinculado ao projeto Java que voc
acabou de criar.
- D um nome (Mundo) para esse novo arquivo (classe Java), escolha se voc quer que essa
nova classe j venha com o cdigo referente ao mtodo main e construtores da superclasse
(caso esteja herdando de outra classe).
17
Frameworks de Desenvolvimento
Unidade 3
Introduo ao Framework .NET
18
Frameworks de Desenvolvimento
Viso Geral
Nesse captulo veremos os componentes chaves do Framework .NET, assim como o papel
que cada um desempenha.
A Common Language Runtime (CLR) a mquina virtual do Framework .NET. Ela roda
em sistemas operacionais Windows (XP, Vista, Server, etc), e sua funo executar as
aplicaes .NET compiladas em um formato bytecode denominado MSIL (Microsoft
Intermediate Language). Durante a execuo, o CLR JIT (Just-in-time ) compila o
bytecode em linguagem de mquina nativo e executa a aplicao. Ou ainda, o cdigo
MSIL pode j estar precompilado em cdigo nativo, e nesse caso o JIT no necessrio, o
que aumenta o desempenho da aplicao.
Gerenciamento de thread
19
Frameworks de Desenvolvimento
Gerenciamento de excees
Segurana
Aplicaes console
Aplicaes windows
Windows services
Aplicaes ASP.NET
Web Services
20
Frameworks de Desenvolvimento
21
Frameworks de Desenvolvimento
Apenas para ilustrar um pouco a situao atual, vamos apresentar um pequeno estudo de caso.
Para simplificar o nosso problema, vamos considerar apenas as solues Microsoft.
Imaginemos uma situao hipottica na qual solicitada uma soluo de home banking que
aceite requisies de um browser da Internet ou qualquer outro dispositivo como handheld,
telefone celular etc.; vejamos qual seria a resposta imediata dos recursos de software que eu
iria precisar:
1. Uma linguagem de programao para desenvolver as pginas dinmicas: de cara, VBScript
ou JScript.
2. Precisamos desenvolver alguns objetos COM ou COM+ no servidor, mas por questes de
performance e poder de linguagem, escolhemos a linguagem C++, e claro, o compilador C++
do MS Visual Studio.
3. Vamos precisar de alguns componentes para executar no MS Queue server ou ento no MS
transaction server, e escolhemos a linguagem Visual Basic porque temos pessoal que j fez
esse tipo de trabalho usando VB.
4. Bem, vamos falar o bvio, mas precisamos tambm de Web designers com domnio de
HTML, Flash, ferramentas de editorao grfica etc.
5. Ainda temos um problema para resolver, que o fato de termos clientes heterogneos que
no conseguem ler um formato padro como uma Web page em HTML.
Ok, agora o momento de correr atrs do pessoal com todas essas competncias, tentar
gerenciar essa salada de tecnologias e linguagens de programao e, de quebra, fazer
funcionar tudo direitinho.
22
Frameworks de Desenvolvimento
E esta era uma situao bem comum no desenvolvimento de software at pouco tempo atrs:
ter de costurar uma srie de linguagens + ferramentas + tecnologias + modelos de objetos +
linguagens de script vs. linguagens de programao completas + linguagens de marcao.
Usando o .NET podemos proporcionar uma soluo alternativa, de menor complexidade de
implementao, mais integrada:
1. Uma linguagem de programao para desenvolver as pginas dinmicas no servidor Web:
C# usando o Visual Studio.
2. Uma linguagem de programao para desenvolver objetos reusveis, armazenados em uma
DLL no servidor: C# usando o Visual Studio.
3. Uma linguagem de marcao malevel o suficiente de sorte que permita mostrar o
contedo em diversos dispositivos: XML, gerado pelo C# ou pr-montado para alguns casos.
4. Todo o trabalho de formatao e transformao dos documentos XML gerados pela
soluo de homebank ser feito usando XSL para gerar a linguagem de marcao suportada
no lado cliente. Ah! Com que linguagem vamos fazer estas transformaes? Com C# claro!
Mas os nossos desenvolvedores tm um background muito forte em VB, de forma que ns
descartamos o C# como alternativa. No tem problema, tudo o que foi dito acima continua
vlido, vamos mudar apenas a linguagem de C# para VB. A plataforma .NET permite que
usemos a linguagem de programao da qual mais temos domnio e mesmo assim
continuamos a usufruir todo o seu potencial.
O exemplo anterior foi apenas para ilustrar o contexto atual de desenvolvimento de sistemas
complexos, onde temos de realmente fazer uma ginstica muito grande integrar todas as
partes constituintes da nossa soluo. A boa notcia que, como mostramos no exemplo, com
.NET esta situao est, digamos assim, findando esse problema, porque, como voc pode ter
percebido, a sua soluo caiu de trs linguagens de programao para apenas uma, e o resto
das tecnologias que usamos (COM+, por exemplo) se integra perfeitamente com o restante da
soluo.
Apenas falando no quesito da clareza e reutilizao de cdigo, algumas bibliotecas de classes,
como MFC (Microsoft Foundation Class), surgem nesse nterim, mas tm como foco a
linguagem C/C++ e no podem ser usadas a partir do Power Builder, por exemplo, ou ento
Delphi, que tem a sua prpria biblioteca de componentes reutilizveis. O que equivale a dizer
que essas bibliotecas no podem ser usadas a partir de qualquer linguagem de programao, o
que torna o reaproveitamento de cdigo ainda mais difcil.
Frameworks de Desenvolvimento
A abordagem .NET
Citaremos a seguir algumas das caractersticas de .NET que visam a resolver os problemas
citados acima:
Independncia de linguagem de programao: o que permite a implementao do mecanismo
de herana, controle de excees e depurao entre linguagens de programao diferentes.
Reutilizao de cdigo legado: o que implica em reaproveitamento de cdigo escrito usando
outras tecnologias como COM, COM+,ATL, DLLs e outras bibliotecas existentes.
Tempo de execuo compartilhado: o runtime de .NET compartilhado entre as diversas
linguagens que a suportam, o que quer dizer que no existe um runtime diferente para cada
linguagem que implementa .NET.
Sistemas auto-explicativos e controle de verses: cada pea de cdigo .NET contm em si
mesma a informao necessria e suficiente de forma que o runtime no precise procurar no
registro do Windows mais informaes sobre o programa que est sendo executado. O
runtime encontra essas informaes no prprio sistema em questo e sabe qual a verso a ser
executada, sem acusar aqueles velhos conflitos de incompatibilidade ao registrar DLLs no
Windows.
Simplicidade na resoluo de problemas complexos.
24
Frameworks de Desenvolvimento
Unidade 4
A Arquitetura .NET
Para melhor entendermos tudo o que temos dito at aqui, vamos falar um pouco da arquitetura
de .NET e os seus principais componentes.
25
Frameworks de Desenvolvimento
26
Frameworks de Desenvolvimento
27
Frameworks de Desenvolvimento
Unidade 5
Criando Aplicaes com o
Visual Studio
1.0
1.1
2.0
3.0
3.5
Frameworks de Desenvolvimento
verses anteriores. Sem a necessidade de migrar toda a aplicao de uma s vez. Voc pode
tambm, criar uma nova aplicao voltada a uma verso anterior do Framework, bastando
para isso indicar a verso desejada ao criar um novo projeto.
Conhecendo a IDE
Ao iniciar o Visual Studio 2008, temos acesso a sua interface:
Ser exibida a caixa de diligo New Project, que exibir os templates de aplicaes do Visual
Studio.
Um grande nmero de templates de projetos e itens de projeto j vem pr-instalados com o
Visual Studio. Esses templates aparecem como tipos de projetos dentro do menu File > New
Project. Voc pode utilizar qualquer um desses templates para criar um projeto bsico que
criar para voc um conjunto mnimo de itens que sua aplicao necessita como classes,
29
Frameworks de Desenvolvimento
controles, e referncias a bibliotecas do framework. Voc pode usar os templates tanto para
criar aplicaes desktop Windows Forms, como aplicaes Web.
30
Frameworks de Desenvolvimento
Selecione a linguagem Visual C#, nos templates Windows Forms Application e clique em
OK. Um novo projeto vazio ser criado.
Componentes da IDE
Menu
A barra de menu contm os comandos do Visual Studio como o menu File, para criao de
novos projetos, abertura de projetos existentes, opo de salvar projetos formulrios, etc.
31
Frameworks de Desenvolvimento
Toolbox
A Toolbox contm todos os controles que voc pode utilizar em suas aplicaes. Voc pode
arrastar os controles da toolbox para dentro do painel de design da sua aplicao.
Cada aba da toolbox contm controles agrupados para fins especficos. Voc pode criar sua
prpria tab para armazenar seus prprios controls. Para tanto basta clicar com o boto direito
na Toolbox e selecionar Add Tab.
32
Frameworks de Desenvolvimento
Para adicionar controles a Toolbox, clique com o boto direiton na aba em que voc quer
adicion-los e selecione a opo Choose Items. Abrir a caixa de dilogo Choose Toolbox
Itens.
Frameworks de Desenvolvimento
Componentes COM
Componentes WPF
Atividades de Workflow
Voc tambm pode clicar no boto Browse e procurar pela DLL que contm os controles que
voc quer adicionar a aplicao. Outra maneira de adicionar controles Toolbox arrastando
a DLL para dentro da Toolbox.
Voc pode reposicionar a Toolbox arrastando e colocando ela dentro de um dos pontos de
ancoramento que aparecero na tela:
Se voc tiver problema de espao em seu monitor, pode ainda, utilizar o boto Auto Hide para
ganhar algum espao na tela.
34
Frameworks de Desenvolvimento
Solution Explorer
Na aba Solution Explorer, temos todos os arquivos e recursos utilizados em nosso projeto. A
soluo pode conter um ou mais projetos. Os botes diponveis na barra de ferramentas dessa
aba so:
Properties
Show All Files
Refresh
View Code
View Designer
View Class Diagram
Esses botes so sensveis ao contexto, ou seja, alguns deles podem no estar visveis
dependendo do tem que estiver selecionado. Por exemplo, ao selecionar o nome do projeto,
os botes View Code e View Designer no so mostrados.
Para adicionar novos itens como Formulrios ou Classes ao seu projeto, clique com o boto
direito sobre o nome do projeto no Solution Explorer, e selecione Add, e escolha o item a ser
adicionado:
35
Frameworks de Desenvolvimento
Voc tambm pode adicionar projetos novos em File>Add New Project ou existentes em File
> Existing Project. Quando voc tem mais de um projeto na aplicao, um dos projetos deve
ser marcado como StartUp Project. Que ser o projeto que ir ser depurado ao se pressionar
F5. Para alterar o projeto inicial, clique com o boto direito sobre o projeto que voc deseja
que seja o inicial e selecione Set as Startup Project.
Properties
A janela de propriedades mostra as propriedades associadas ao diversos itens selecionados no
projeto (Windows Forms, controles, projetos, solues etc).
A figura abaixo mostra a janela de propriedades de um objeto Windows Form. Por default as
propriedades so listadas por categoria, mas voc pode optar por visualiz-las em ordem
36
Frameworks de Desenvolvimento
37
Frameworks de Desenvolvimento
Janela de Design
A janela de Design permite voc visualizar e desenhar a interface da sua aplicao.
Dependendo do tipo de projeto que voc estiver desenvolvendo, um tipo diferente de janela
aparecer para voc arrastar controles para ela.
Para alternar para o code-behind da aplicao, voc pode tanto usar um duplo clique na
interface, ou usar um clique com o boto direito sobre o Solution Explorer e selecionar o item
View Code.
Voc pode organizar as tabs tanto horizontalmente como verticalmente, clicando com o boto
direito e selecionado New Horizontal Tab Group ou New Vertical Tab Group.
Frameworks de Desenvolvimento
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Windows.Forms;
namespace HelloWorld
{
public partial class frmHello : Form
{
public frmHello()
{
InitializeComponent();
}
private void btnOla_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello world!");
}
}
}
Seu formulrio deve ficar como o a seguir:
39
Frameworks de Desenvolvimento
Para execut-lo, v em Debug > Start Debugging ou pressione F5 ou ainda, clique no boto
Start Debugging da barra de ferramentas do Visual Studio. A aplicao deve executar
corretamente, se no hover erros, abrindo o formulrio, e ao clicar no boto aparecer a
seguinte mensagem:
Frameworks de Desenvolvimento
Crie um novo Projeto em File > New Project, em Project Types selecione Visual C# >
Windows, e em Templates selecione Windows Forms Application. No campo nome escreva
Calculadora e clique Ok.
Controle Label
Text: Primeiro Operador
Name: lblOperador1
Controle Textbox
Name: txtOperador1
Controle Label
Text: Segundo Operador
Name: lblOperador2
Controle Texbox:
Name: txtOperador2
Controle Label
Name: lblResultado
Text: 0
41
Frameworks de Desenvolvimento
Controle Button:
Text: +
Name: btnSomar
Controle Button:
Text: Name: btnSubtrair
Controle Button
Text: *
Name: btnMultiplicar
Controle Button
Text: /
Name: btnDividir
Controle Button
Text: Pot
Name: btnPotenciacao
Controle Button
Text: Limpar
Name: btnLimpar
Controle Button
Text: Sair
Name: btnSair
Ajuste a forma, disposio e tamanho de cada controle conforme for necessrio e salve seu
projeto.
Seu formulrio deve ficar parecido com o a seguir:
42
Frameworks de Desenvolvimento
Primeiro vamos adicionar o cdigo para cculo da soma. Clique duas vezes sobre o boto +
e adicione o cdigo abaixo ao evento Click do mesmo:
using
using
using
using
using
43
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
Frameworks de Desenvolvimento
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Calculadora
{
public partial class frmCalculadora : Form
{
double op1;
double op2;
double resultado;
public void converteEntradas() {
op1 = 0;
op2 = 0;
if (txtOperador1.Text != "")
{
Double.TryParse(txtOperador1.Text, out op1);
}
if (txtOperador2.Text != "")
{
Double.TryParse(txtOperador2.Text, out op2);
}
}
public frmCalculadora()
{
InitializeComponent();
}
}
}
Agora adicionaremos o cdigo ao evento click do boto somar. Para isso, alterne para a aba
Form1.cs [Design] e clique duas vezes sobre o boto +, adicione o seguinte cdigo:
private void btnSomar_Click(object sender, EventArgs
e)
{
converteEntradas();
resultado = op1 + op2;
lblResultado.Text = resultado.ToString();
}
Frameworks de Desenvolvimento
Observe que esse procedimento necessrio, pois ao fazer isso o Visual Studio,
automaticamente liga a funo sendo criada ao evento click do controle. O que pode ser
verificado na janela de propriedades, ao se clicar no boto Events
Da mesma forma para os demais botes com o cdigo abaixo:
private void btnMultiplicar_Click(object sender,
EventArgs e)
{
converteEntradas();
resultado = op1 * op2;
lblResultado.Text = resultado.ToString();
}
private void btnDividir_Click(object sender, EventArgs
e)
{
converteEntradas();
resultado = op1 / op2;
lblResultado.Text = resultado.ToString();
}
private void btnPotenciacao_Click(object sender,
EventArgs e)
{
converteEntradas();
resultado = Math.Pow(op1, op2);
lblResultado.Text = resultado.ToString();
}
private void btnLimpar_Click(object sender, EventArgs
e)
{
txtOperador1.Text = "";
45
Frameworks de Desenvolvimento
txtOperador2.Text = "";
}
private void btnSair_Click(object sender, EventArgs e)
{
Application.Exit();
}
46
Frameworks de Desenvolvimento
Unidade 6
Programao Orientada a Objetos
Introduo
A programao orientada a objetos (OOP) veio para ficar, sem dvida nenhuma. Ela permite
que sistemas complexos sejam desenvolvidos com mais facilidade, tanto na implementao
inicial quanto na manuteno. O produto mais popular do Visual Studio at hoje tem sido o
Visual Basic. Porm, reclamava-se muito da ausncia de um suporte mais completo a todos os
requisitos que caracterizavam uma linguagem de programao orientada a objetos (OOP).
Com a arquitetura .NET, a Microsoft parece ter resolvido atender ao clamor da comunidade
de desenvolvedores atacando em todos os flancos. Vrios melhoramentos foram feitos no
Visual Basic, de forma que ele pode ser considerado agora como orientado a objetos; mas
em C#, sem dvida alguma, que se ter acesso a uma linguagem de programao que
implementa, de maneira simples e direta (sem as complicaes do C++), todos os requisitos
de uma linguagem OOP em conjunto com uma forte tipagem de dados (um dos pontos fracos
do VB). Com isso, a programao torna-se mais slida e muitos erros podem ser eliminados
ainda em tempo de compilao.
Frameworks de Desenvolvimento
x = x + 1
Fim Enquanto
O exemplo acima muito simples, mas bastante ilustrativo. Mostra que existem dados
(variveis) e cdigos que manipulam esses dados (estruturas de controle). Qual o
inconveniente disso? Supondo que x fosse um valor que tivesse de ser exibido na tela, seria
necessrio acrescentar algum cdigo que fizesse isso. Ou seja, x no era capaz de se autoexibir na tela. O cdigo completo seria:
x = 0
Enquanto x < 10
x = x + 1
Fim Enquanto
PosicionarCursor 0,0
Imprimir x
Se fosse feita outra alterao no valor de x, voc teria de executar novamente os comandos de
impresso para que o valor fosse atualizado na tela. O ponto a que queremos chegar que
dados e cdigos eram concebidos como elementos separados. Havia, inclusive, uma definio
que dizia: dados + cdigo = programa.
Com a OOP, uma das idias bsicas era eliminar essa distncia entre dados e cdigo e fazer
com que ambos ficassem mais interligados. Ambos seriam capazes de interagir de forma mais
homognea e autnoma. Primeiramente, expandiu-se a idia de procedimento para a idia de
classe. Uma classe permite que vrios procedimentos e dados sejam armazenados dentro dela.
Os procedimentos passaram a chamar-se mtodos e os dados passaram a chamar-se
propriedades. Mas no foi uma mera maquiagem e uma mudana de nome para a mesma
coisa. De fato, o conceito de classe mudou radicalmente a viso da programao. Uma classe
define como um objeto deve funcionar. Fazendo uma analogia clssica, como o projeto de
uma casa: estabelece como as coisas tm de ser. A partir dessa planta, podem ser construdas
vrias casas idnticas. Isso chamado de instncia em OOP. Quando dizemos instanciar uma
classe, significa colocar no ar um objeto baseado na descrio da classe. Vamos usar o
prprio Windows como referncia. Uma das coisas mais comuns na interface do Windows o
boto OK. Voc provavelmente o ver na grande maioria das janelas que abrir. Observe que
ao clicar com o mouse sobre aquele boto, ele produz um efeito de forma que parece
realmente ter sido pressionado.
48
Frameworks de Desenvolvimento
Porm, no existem apenas botes OK. Voc encontra botes dos mais variados tipos nas
mais diversas janelas. Na figura anterior, voc nota que existem trs botes idnticos, cada
qual com um ttulo diferente. Internamente, a propriedade que define o rtulo do boto
chamada de Text. Assim como existe Text, existem diversas outras propriedades. Uma delas
Color, que define a cor do boto; outra define se o boto est pressionado ou no. Resumindo,
existem propriedades que definem diversos aspectos do boto. O grande detalhe que, ao
alterar uma propriedade, obtm-se um efeito imediato.
Exemplificando em forma de cdigo (fictcio):
BotaoOk.Pressionado = Verdadeiro
Ou
BotaoOk.Pressionar
Ambos os cdigos produzem um efeito imediato. Observe aqui duas coisas: primeiro, que a
propriedade ou mtodo vm sempre atrelados a um objeto. Segundo, que se parece muito com
a atribuio de uma varivel no primeiro caso ou lembra meramente a execuo de algum
procedimento no segundo cdigo. Voc poderia tambm ter os cdigos inversos:
49
Frameworks de Desenvolvimento
Herana e Polimorfismo.
Herana significa partir de algo j pronto e modific-lo com o propsito de deix-lo mais
adequado a determinada finalidade. Supondo que voc tem uma classe boto com
propriedades bsicas; voc pode herdar aquelas caractersticas bsicas e adicionar ainda mais
funcionalidade.O detalhe que, ao derivar uma classe a partir de outra, voc no precisa
conhecer o cdigo da classe anterior. A sua nova classe no trar os cdigos da classe pai.
Eles continuaro encapsulados l e voc poder us-los se quiser.O dado importante que
voc no precisa manipular os cdigos da classe pai.
Como a inteno seria criar um boto com caractersticas de funcionamento diferentes, muitas
das propriedades anteriores passariam a funcionar de modo diferente. Observe esquerda do
painel do Media Player que existem botes com os ttulos de Now Playing, Media Guide,
CD Audio etc. de se imaginar que exista uma propriedade Text para aquele tipo de boto
tambm. Ou seja, vamos assumir neste caso que existe a propriedade Text para todos os
botes do Windows. Mas por que alguns Texts so diferentes dos outros? Isso se chama
Polimorfismo. Ou seja, cada novo descendente de uma classe pode entender a propriedade
Text de uma forma diferente e aplicar seus prprios cdigos de modo a redefinir seu
comportamento. Resumindo, Herana, Polimorfismo e Encapsulamento so os trs
mecanismos bsicos que uma linguagem deve comportar para ser considerada inteiramente
orientada a objetos.
50
Frameworks de Desenvolvimento
Orientao a eventos
Um tpico que no deve ser confundido com orientao a objetos a orientao a eventos.
Uma linguagem de programao pode ser orientada a objetos sem ser orientada a eventos e
vice-versa. A unio desses dois conceitos, entretanto, produz resultados muito mais
interessantes que os dois separadamente. Como o prprio nome sugere, uma linguagem
orientada a eventos uma linguagem capaz de responder a determinados acontecimentos
dentro de um determinado ambiente. Os eventos podem ser muitos: o clique do mouse, uma
tecla pressionada, uma informao que chega pela placa de rede etc.
Em ambientes grficos, isso tem uma importncia essencial. O mouse, sem dvida alguma,
foi o dispositivo que mais causou reviravolta no mundo da programao orientada a eventos.
No tempo das telas de texto, muito comuns no ambiente DOS, mainframes e verses mais
antigas de Unix, o principal dispositivo de entrada de dados era o teclado. Vejamos um
exemplo de programa com interface de texto:
Numa tela como essa, se o usurio quisesse pular de um campo para o outro, teria de usar o
teclado e necessariamente passar pelos campos dentro de uma determinada seqncia.Como
advento do mouse, passou a ser possvel que o usurio se posicionasse em qualquer campo e
houve uma quebra de estratgia. Nos tempos da tela de texto, era o programador quem dava
as cartas e estabelecia a seqncia de operao de um programa. Hoje as coisas so diferentes,
o programa tem de estar preparado para responder a seqncia de eventos que o usurio achar
mais conveniente. Os sistemas operacionais tambm se tornaram multitarefa e vrias aes
podem estar acontecendo ao mesmo tempo. Programar com orientao a objetos combinada
com orientao a eventos significa criar mtodos que sero acionados quando determinadas
situaes ocorrerem. Geralmente, esses mtodos tm nomes como Obj_Click (Obj_Clicar),
Obj_KeyPress (Obj_PressionarTecla), assim facilitando sua identificao. Resumindo, o que
51
Frameworks de Desenvolvimento
52
Frameworks de Desenvolvimento
Evidentemente, esse exemplo est muito simplificado, mas traz a idia bsica: voc tem de
planejar quais sero as propriedades, os mtodos, os construtores, destrutores e seus escopos e
tipos.
Exemplo:
Frameworks de Desenvolvimento
{
// Cdigo para gravao
return true;
}
}
Em C#, a regra para definir um construtor muito simples: basta criar um mtodo cujo nome
seja idntico ao da classe. Toda vez que uma instncia da classe for criada, o construtor ser
automaticamente disparado. Observe tambm que, no exemplo anterior, foram criados dois
construtores para a mesma classe. Isso, em OOP, chamado de sobrecarga (overload) de
mtodo. A palavra sobrecarga pode trazer a idia de estresse ou excesso de trabalho, mas
nesse caso um elemento que nos ajuda e muito! Quando um mtodo sobrecarregado, o
editor do Visual Studio d uma indicao clara disso. Vamos tomar como exemplo o
MessageBox. Ao digitar MessageBox.Show, o editor mostra que existem doze alternativas
diferentes para o mtodo Show:
{
// Construtor 'default' chamado
Cadastro Ficha1 = new Cadastro( );
// Construtor otimizado chamado
Cadastro Ficha2 = new Cadastro( "123", "De Oliveira Quatro" );
}
54
Frameworks de Desenvolvimento
Um detalhe importante que criamos duas instncias da mesma classe e ambas jamais se
misturam. Outro detalhe que o chamado construtor default, o qual no recebe nenhum
parmetro, existe em todas as classes. Porm, se voc criar um novo construtor customizado
com parmetros, o construtor default silenciosamente removido. No nosso exemplo, a
reescrita do construtor default se tornou obrigatria a partir do momento em que quisemos
usar a inicializao padro de uma classe.
Vamos agora entender os escopos (visibilidade) de uma classe e de seus membros. Uma
propriedade (ou campo) ou mtodo podem ser public, protected, private ou internal. Em C#,
eles so chamados de modificadores de acesso.
Veja os significados:
Quando voc cria um objeto, muitos de seus elementos so visveis e outros esto escondidos.
Fazendo uma comparao com o mundo real, quando usamos um carro, muitos de seus
elementos (ou propriedades) so facilmente acessveis enquanto outros permanecem mais
bem-guardados. A velocidade, o nvel do combustvel, o cmbio, todos esses elementos so
visveis externamente. Outros permanecem mais escondidos e so usados indiretamente: a
injeo eletrnica, as vlvulas, os eixos de trao etc. Criar uma classe passa pela mesma
idia. Na verdade, a criao de uma classe lida com dois alvos: existe uma parte pensada no
programador que usar a classe em seu sistema e outra pensada no usurio, que normalmente
ver apenas a superfcie do objeto criado. Veremos o uso desses modificadores com
exemplos prticos e isso se tornar mais claro.
55
Frameworks de Desenvolvimento
Herana e Agregao
O trabalho de desenvolvimento de um nico sistema pode resultar na criao e/ou utilizao
de dezenas ou mesmo centenas de classes. Muitas dessas classes tm funcionalidades muito
distintas, mas outras se cruzam e se complementam. Por causa desses eventuais
cruzamentos de classes, fundamentalmente necessrio entender o modo como elas se
relacionam. Assim como na vida real com as mais diversas pessoas, duas classes podem se
relacionar baseada no ser e no ter. No caso do ser, diz-se que uma classe foi derivada
de outra e ambas tm uma relao de parentesco. Pelo outro lado, o ter especifica que uma
classe incorporou outra e ambas tm uma relao de
amizade.
Vamos tomar um exemplo da vida real: como se constri um computador? Existem muitas
peas que formam uma mquina completa hoje em dia: processador, HD, monitor etc.
Observe que a Intel produz novos processadores a partir dos preexistentes. A partir disso,
nota-se uma linha genealgica: 8086, 286, 386, 486, Pentium, Pentium II e por a vai. Cada
novo processador herda as caractersticas da gerao anterior e agrega novos recursos e mais
potncia. Ento podemos dizer que temos uma classe onde cada novo processador filho da
gerao anterior. Concluso: todos eles SO processadores.O relacionamento entre eles
baseado em ser. J um computador seria uma classe que agrega vrias outras. Assim como
o exemplo do processador, HDs, Impressora e tantos outros perifricos tambm tm sua linha
evolutiva. A gente diz que um computador TEM memria, disco rgido etc. Ou seja, trata-se
de uma classe que incorpora diversas outras.O relacionamento do computador com os demais
elementos do tipo ter. Fcil de entender na teoria, no ? Pois vejamos agora um pouco de
cdigo:
class Processador
{
public double Megahertz;
public int AnoFabricacao;
}
class Intel386 : Processador
{
public Intel386( )
{
56
Frameworks de Desenvolvimento
Megahertz = 33.3;
AnoFabricacao = 1993;
}
}
class DiscoRigido
{
public int CapacidadeGB;
}
class Computador
{
Intel386 MeuProcessador;
DiscoRigido MeuHD;
public Computador( )
{
MeuHD.CapacidadeGB = 70;
}
}
Criao de Propriedades
Frameworks de Desenvolvimento
class Cadastro2
{
protected string fCPF;
public string CPF
{
set
{
fCPF = value;
}
get
{
return fCPF;
}
}
}
Como dissemos anteriormente, temos trs elementos. As variveis fCPF e fNome so os campos
(fields) onde os valores so efetivamente armazenados. Observe que se trata de variveis do
tipo protected, o que significa que s sero vistas pelas classes descendentes (lembre-se do
conceito de ser) e no sero manipuladas por outras classes (lembre-se do conceito de
ter). O set e o get, como voc pode notar, servem para recuperar e gravar novos valores. A
palavra value reservada no C# para receber o valor passado para a propriedade. Veja o
exemplo:
58
Frameworks de Desenvolvimento
Para testar este cdigo, sugerimos que voc crie um projeto de teste bem simples,
apenas um formulrio com um boto e escreva o cdigo dentro do evento click desse boto.
Talvez voc esteja se perguntando agora quem foi o maluco que resolveu complicar tanto a
programao. Mas o fato que isso, acredite ou no, torna as coisas mais fceis. Se voc
tivesse de fazer com que um CPF fosse imediatamente validado ao ser atribudo, por
exemplo, ficaria muito mais fcil dessa forma. Ou seja, assim que o valor fosse informado, a
prpria classe seria capaz de identific-lo como vlido ou no. No nosso estudo de caso,
desenvolveremos um exemplo
baseado nessa idia.Uma das coisas que voc pode fazer com uma propriedade e no
consegue com uma varivel, por exemplo, torn-la somente leitura ou somente gravao.
No caso de ter uma propriedade somente leitura, implemente apenas o mtodo get. Se
implementar apenas o set, ela ser apenas de escrita. No caso de no ser uma propriedade
full e apenas um campo (atributo), a forma seria:
public readonly string CampoSomenteLeitura
Mtodos polimrficos
Vamos criar uma classe pensando em um mtodo cuja implementao seria diferente na
classe pai e na classe filha. Ou seja, a implementao da classe filha ser ligeiramente
diferente e melhorada em relao verso pai. Nesse caso, toda vez que temos um mtodo
que se modifica da classe pai para filho, esse mtodo chamado de virtual.
Em OOP, um mtodo virtual se caracteriza pela capacidade do compilador de detectar
mudanas de acordo com o contexto da classe e viabilizar o polimorfismo. Em bom
portugus: o mtodo camaleo.
class PrimeiraGeracao
59
Frameworks de Desenvolvimento
{
public virtual void Mensagem( string msg )
{
msg += " Primeira Gerao ";
MessageBox.Show( msg );
}
}
class SegundaGeracao : PrimeiraGeracao
{
public override void Mensagem( string msg )
{
msg += " Segunda Gerao ";
base.Mensagem( msg );
}
}
60
Frameworks de Desenvolvimento
Observe que na primeira gerao, o mtodo Mensagem definido como virtual. Nas duas
geraes posteriores, ele definido como override. Dentro de cada mtodo override, observe a
presena da palavra-chave base. Ela essencial para permitir que o polimorfismo acontea.
Sua finalidade acionar a codificao escrita na classe pai (o nvel imediatamente anterior).
Apenas a Primeira Gerao gera uma sada na tela. As outras classes apenas agregam mais
informao
mensagem final. A terceira passa para segunda, que passa para a primeira, que efetivamente
imprime. Exemplo de utilizao:
A grande vantagem por trs disso tudo que ao gerar uma nova verso do mtodo, voc no
precisa necessariamente conhecer o cdigo da classe pai para fazer a nova implementao. Se
quiser, pode at mesmo descartar o que foi escrito anteriormente, basta no incluir a chamada
atravs da palavra- chave base. Existe tambm uma outra palavra-chave bastante importante
nesse processo de herana e polimorfismo. Essa palavra this. A palavra this refere-se
sempre ao contexto atual. Na grande maioria dos casos, a palavra this pode ser omitida. Mas
quando existem coincidncias entre nomes de variveis ou parmetros com campos ou
propriedades de uma classe, conveniente usar this:
class ContextoPai
{
public string Nome; // this.Nome refere-se a este item
public ContextoPai( string Nome )
{
this.Nome = Nome;
}
}
Apenas para traar um paralelo, o this em C# seria idntico ao this em C++ e Java, idntico ao
me em Visual Basic e idntico ao self em Delphi.
61
Frameworks de Desenvolvimento
Bom, vamos dar alguns exemplos mais avanados de como criar mtodos em classes. Uma
das coisas que mais massacram as almas dos programadores estabanados, quando eles se
deparam com OOP, a necessidade primordial de planejamento. Muita gente simplesmente
senta na cadeira e comea a escrever, gerando um cdigo que muitas vezes complicado de
entender e dar manuteno. Para quem vai desenvolver classes, um mnimo de planejamento
absolutamente indispensvel no incio. como jogar xadrez. Se voc no consegue pensar
nos lances seguintes, o xeque-mate (e neste caso o seu rei ser o sacrificado) pode aparecer de
uma hora para outra. Baseado nessas premissas, no exagero dizer que a OOP requer um
nvel muito alto de abstrao por parte do programador. Um nvel de abstrao to alto que
ele pode simplesmente criar uma classe completamente vazia, oca, apenas para definir como
ser o seu formato final ou de seus descendentes. O C# suporta abstrao em classes atravs
de dois mecanismos: criao de classes e mtodos abstratos e interfaces. Uma classe abstrata,
como o prprio nome sugere, no traz uma implementao concreta. Ela serve para dar forma
a um projeto de classe. Veja o cdigo:
Normalmente, toda entrada de dados ter um contedo, o qual pode eventualmente ser
exibido. Isso uma premissa. Criar uma classe abstrata significa definir premissas. Nada
codificado concretamente na primeira gerao da classe. As classes filhas (atravs de
override) que definiro a funcionalidade de cada mtodo ou propriedade. Se voc tentar
instanciar uma classe abstrata, obter um erro do compilador:
62
Frameworks de Desenvolvimento
{
// Implementao
return "";
}
public override string Exibir( )
{
// Implementao
return "";
}
}
Interfaces
O recurso de criao de interfaces segue mais ou menos o mesmo princpio dos mtodos
abstratos: apenas define o formato de uma classe sem implementar seu cdigo. Porm, h
uma caracterstica que torna as interfaces bastante diferentes de simples classes abstratas: elas
fornecem subsdio para a criao de novas classes numa forma mais parecida com a
montagem de um quebra-cabea. O C# no suporta herana mltipla. Isso significa que uma
classe filha s pode ter um nica classe como pai. Interfaces permitem criar algo parecido
com herana mltipla em C++. Por definio, em OOP, Interfaces so colees de mtodos
abstratos relacionados semanticamente. Em bom portugus: peas de um quebra-cabea que
podem ser encaixadas conforme a convenincia de quem estiver jogando... Observe que, para
efeito de padronizao, comum identificar os nomes das interfaces com I maisculo no
incio. Vamos a um exemplo:
Frameworks de Desenvolvimento
{
void LeituraPadrao3of9( ); // Implicitamente abstrato
void LeituraPadraoEAN13( );
void MetodoIdentico( );
}
public interface IControleArmazenamento
{
void Localizador( );
void Categorizacao( );
void MetodoIdentico( );
}
public class Produto : ICodigoBarras, IControleArmazenamento
{
// Aqui viriam as implementaes
public void LeituraPadrao3of9( )
{
// Implementao
}
public void LeituraPadraoEAN13( )
{
// Implementao
}
public void Localizador( )
{
// Implementao
}
64
Frameworks de Desenvolvimento
Selando as classes
Para selar este assunto de criao de classes com chave de ouro, a linguagem C# permite criar
classes seladas. Por definio, classes seladas no permitem nenhum tipo de herana ou
derivao. Simplesmente so classes que devem ser entendidas como terminadas. Exemplo de
cdigo de classe selada:,
Frameworks de Desenvolvimento
Ferramentas de apoio
Se voc se empolgar com a criao de objetos e de repente se vir s voltas com mil e uma
classes, existem algumas ferramentas no editor do Visual Studio que tornaro a sua vida mais
fcil. Para ter uma viso global dos objetos criados dentro da sua aplicao, clique com o
boto direito do mouse dentro do editor e selecione Synchronize Class View. Voc ver no
canto superior direito da sua tela (essa posio pode variar) uma janela com todas as
definies de classes, mais ou menos com o seguinte formato:
66
Frameworks de Desenvolvimento
Ao clicar duas vezes sobre um mtodo, propriedade ou classe, o editor posicionar o cursor
dentro do cdigo correspondente. Uma vez dentro do cdigo, se no estiver interessado em
visualizar o cdigo de classes que considera que j esteja corretamente implementados, voc
pode usar os sinais de + e que ficam no canto da tela e contrair ou expandir os cdigos
das classes. Veja o exemplo com a classe Processador contrada, exibida na Figura 3.7.
At agora, temos falado de criar objetos, mas tambm igualmente importante saber como e
quando destru-los. Vimos que para criar uma nova instncia de uma classe basta usar a
palavra new:
x = new ClasseExemplo( )
O prprio runtime de .NET vai se encarregar de destruir o objeto quando ele no for mais
necessrio. A pergunta : como ele sabe que um objeto no mais necessrio? Resposta
simples e incompleta: o runtime libera a memria alocada pelo objeto quando no existe mais
nenhuma referncia ligada ao objeto dentro do contexto corrente. Exemplo:
67
Frameworks de Desenvolvimento
Existem diversos aspectos referentes a Garbage Collection (coleta de lixo) que esto fora do
escopo deste curso. Vamos nos deter em mostrar como programar a destruio de um objeto.
muito comum necessitarmos que determinados processos ocorram quando um objeto
finalizado. Os exemplos so muitos: liberao de recursos alocados como impressora ou porta
serial, fechamento de arquivos etc. Assim como temos em C# os construtores, tambm temos
os destrutores. Lembre-se de que a regra para a criao de um construtor muito simples:
basta criar um mtodo com o mesmo nome da classe. No caso do destrutor, basta tambm
criar um mtodo com o mesmo nome da classe, mas precedido por um til (~). Exemplo:
class Teste
{
~Teste( )
{
// Aqui voc escreve o cdigo de liberao de recursos
// Base.Finalize( ) chamado automaticamente em C#
68
Frameworks de Desenvolvimento
}
}
Evidentemente, se voc achar conveniente que a liberao de recursos seja feita em algum
momento que no necessariamente seja o da destruio do objeto, voc inteiramente livre
para criar algum mtodo que faa isso.
Tratamento de excees
O tradicional termo tratamento de erros agora chamado de tratamento de excees. E
veremos que faz mais sentido. Em C#, o tratamento de excees feito de maneira muito
elegante e simples.O C# adota um estilo relativamente comum em outras linguagens, que o
de tratar erros como objetos que encapsulam todas as informaes que necessitamos para
resolv-lo. Essa idia vlida para todo o ambiente .NET e foi batizada como SEH
(Structured Exception Handling). A idia bsica mais ou menos a seguinte: todo objeto que
representa uma exceo derivado de System.Exception. Essa classe possui os seguintes
membros:
Excees podem ser disparadas pelos mais diversos elementos. Podem ser disparadas a partir
de erros do sistema operacional, de erros de dispositivos, de inconsistncias de dados.
Tambm podemos criar nossas prprias excees. Vamos observar um exemplo de como
disparar uma exceo e como trat-la com a nossa classe de Cadastramento e validao do
CPF:
69
Frameworks de Desenvolvimento
70
Frameworks de Desenvolvimento
try
{
// Cdigo sujeito a excees
}
catch( TipoExcecao1 e )
{
// Tratamento para exceo tipo 1
}
catch( TipoExcecao2 e )
{
// Tratamento para exceo tipo 2
}
catch
{
// Tratamento para qualquer tipo de exceo
}
71
Frameworks de Desenvolvimento
finally
{
// Trecho que deve sempre ser executado, havendo ou no
exceo
}
A estrutura try..catch requer que exista pelo menos um bloco catch vazio. Os blocos de finally e
catch(exception) so opcionais. Nossa classe Cadastro deveria ser instanciada da seguinte forma:
try
{
Cadastro teste = new Cadastro( "123", "De Oliveira Quatro" );
}
catch
{
MessageBox.Show( "Impossvel instanciar o objeto Cadastro" );
}
Como voc deve ter observado no exemplo, entretanto, no existe uma pista clara de qual foi
o motivo que realmente fez a instanciao do objeto. Para termos um controle mais efetivo,
poderamos usar o catch com uma exceo customizada. Vamos criar uma exceo que ser
usada especificamente para o caso de encontrar um CPF invlido e colocar isso dentro de um
contexto com mais outras possibilidades de erro. O esboo do cdigo ficaria desta forma:
Frameworks de Desenvolvimento
Frameworks de Desenvolvimento
{
MessageBox.Show( "CPF Invlido" );
}
catch( Exception Erro )
{
MessageBox.Show( "Impossvel instanciar o objeto Cadastro: " +
Erro.Message );
}
finally
{
MessageBox.Show( "Sempre executado, haja erro ou no." );
}
O catch( Exception Erro) o trecho que captura toda e qualquer exceo. Ele praticamente
igual a um catch vazio conforme demonstrado antes, por uma razo muito simples: Exception
pai de todas as excees. Qualquer exceo sempre se encaixar em Exception por causa
disso. A razo pela qual usamos Exception em vez de um catch vazio foi a inteno de exibir a
mensagem enviada pelo sistema na ocorrncia do erro.
O bloco finally executado sempre, haja erro ou no. Neste caso, ele executado DEPOIS do
bloco catch que capturar a exceo. Se voc tem o costume de programar em Delphi, vai notar
que essa ordem invertida em C#.
Qualquer erro ocorrido dentro um bloco try desvia o fluxo de execuo para o catch
correspondente e NO retorna o fluxo de execuo para o ponto que originou o erro ou a
linha seguinte. Em outras palavras, no existe nada semelhante ao Resume, to popular no
VB, por exemplo.
A ordem dos fatores altera (e muito) os resultados. Se voc tentar, por exemplo, as inverses
sugeridas pelos comentrios no exemplo anterior, vai perceber que, no caso de alterar a ordem
dos catches, voc receber um erro do compilador: A previous catch clause already catches
all exceptions of this or a super type (System.Exception) (Uma clusula catch anterior j
captura todas as excees deste tipo ou de um tipo superior System.Exception). No caso de
inverter as linhas de cdigo, voc vai fazer com que diferentes catches sejam executados.
74
Frameworks de Desenvolvimento
Apenas um e somente um bloco catch executado para cada tratamento de exceo (try).
75
Frameworks de Desenvolvimento
A pergunta-chave para explicar o tpico de type cast de objetos seria: como posso criar um
mtodo que seja capaz de receber um objeto como parmetro, no importa qual seja e,
sabendo que alguns desses objetos tm o mtodo gravar e outros no, por exemplo, como
fazer para que meu cdigo seja inteligente o suficiente para saber com qual objeto est
lidando e realizar a ao da maneira mais adequada? Ok, vamos por partes. Seja qual for o
caso, teremos de fazer uso de dois operadores de typecast: is e as.O operador is permite que
voc verifique se o objeto de um tipo especfico e retorna verdadeiro ou falso, de acordo
com o resultado do teste. Exemplo:
if ( p is Intel286 )
{
// instrues
}
J o operador as permite usar uma classe como se ela fosse outra. Evidentemente, esse tipo de
personalidade trocada pode dar confuso e deve ser usada com cuidado. Como regra geral,
podemos dizer que quanto mais prximo for o parentesco entre duas classes, maiores as
chances de ter um typecast correto. Quanto mais distante, maior a possibilidade de erros no
seu typecast. Mas lembre- se que parentes prximos tambm podem brigar, portanto mais
do que conveniente planejar bem um typecast! Veja um exemplo:
(p as Intel286).ModoProtegido = true;
Nesse caso, estamos fazendo um typecast no objeto p para us-lo como um processador
Intel286. Se o typecast falhar, um objeto com valor nulo ser retornado e uma exceo ser
gerada. Vamos analisar os dois casos ilustrados no incio deste tpico. O primeiro caso seria
mais simples, por se tratar de herana linear pura e simples. Bastaria criar um mtodo que
recebesse como parmetro a classe mais superior, no caso, a classe Processador. Veja o
cdigo:
class Processador
{
public double Megahertz;
76
Frameworks de Desenvolvimento
Observe que a partir da gerao do 286, foi adicionado um novo campo indicando que o
processador dispe de um recurso chamado Modo Protegido e cujo valor padro false.
Caso queiramos ativar o modo protegido de um processador atravs de uma classe externa,
poderamos escrever uma classe com o seguinte formato:
class VerificarModoProtegido
{
public void AtivarModoProtegido( Processador p )
77
Frameworks de Desenvolvimento
{
if ( p is Intel286 )
{
// observe o type cast nesta linha:
(p as Intel286).ModoProtegido = true;
MessageBox.Show( "Modo protegido foi ativado" );
}
if ( p is Intel8086 )
{
MessageBox.Show( "Modo protegido no disponvel" );
}
}
}
Vamos agora escrever um cdigo que acionaria tudo de vez. Observe que esse cdigo possui
um truque:
Frameworks de Desenvolvimento
ativar o modo protegido, informar que o mesmo foi ativado e logo em seguida dir que o
processador no possui modo protegido!
Nossa classe anterior, portanto, teria de ser reescrita e ficaria mais consistente
desta forma:
class VerificarModoProtegido
{
public void AtivarModoProtegido( Processador p )
{
if ( p is Intel286 )
{
// observe o type cast nesta linha:
(p as Intel286).ModoProtegido = true;
MessageBox.Show( "Modo protegido foi desativado" );
}
else if ( p is Intel8086 )
{
MessageBox.Show( "Modo protegido no disponvel" );
}
}
}
Voc conseguiu enxergar a diferena? Todo e qualquer detalhe em programao pode ser
crucial! muito fcil deixar bugs no cdigo... Agora que sabemos como tratar objetos em
herana linear, como proceder em relao a objetos que no necessariamente tm
parentesco entre si? Eis aqui o grande detalhe: todos os objetos tm parentesco, sim. Todos
eles so filhos de System.Object. No precisa fazer exame de DNA, pode acreditar nisso! Veja
este exemplo de cdigo:
79
Frameworks de Desenvolvimento
Resumo
Neste mdulo voc foi exposto a uma srie de conceitos e tcnicas. Dominar a Programao
Orientada a Objetos dentro dos atuais ambientes de desenvolvimento absolutamente
essencial. Voc aprendeu todos os conceitos essenciais de OOP (Polimorfismo,
Encapsulamento, Herana) e viu de que forma eles so implementados e como se aplicam em
C#. Aprendeu tambm a diferena entre orientao a eventos e orientao a objetos. Vimos
tambm como construir classes, mtodos e propriedades. Outras informaes importantes
como tratamento de excees, interfaces, e type casting completaram o repertrio bsico de
informaes sobre OOP de que voc precisa para programar de maneira consistente nessa
tecnologia.
80
Frameworks de Desenvolvimento
Unidade 7
Segurana em Aplicaes .NET
O Common Language Runtime e o Framework .NET fornecem muitas classes e servios que
permitem aos programadores escrever cdigo para aplicaes seguras. Esses componentes
permitem aos administradores customizar o acesso que a aplicao ter a recursos
protegidos. O framework tambm fornece classes e servios que facilitam o uso de
criptografia e segurana por definio de papis de usurio.
Frameworks de Desenvolvimento
A importncia do StrongName
Todo e qualquer assembly possui algumas caractersticas que ajudam ao runtime determinar
a sua identidade. A identidade de qualquer assembly .NET composta por quatro
82
Frameworks de Desenvolvimento
informaes, a saber: nome, verso, cultura e uma chave pblica. O nome nada mais que o
nome do assembly, desconsiderando a sua extenso. A verso o nmero em que o projeto
se encontra, e que por padro 1.0. J a cultura determina se o assembly sensitivo
alguma cultura e, finalmente, a chave pblica, qual falaremos mais adiante.
Podemos utilizar vrias ferramentas para conseguir visualizar essas informaes. No nosso
caso, se abrirmos dentro do Reflector o componente que criamos inicialmente, aquele que
possui o cdigo legal, poderemos comprovar essas caractersticas que ajudam a identificar o
assembly:
RegrasDeNegocio, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null
Quando criamos a assembly ilegal, com o cdigo que multiplica a quantidade de horas extras
por dois, poderemos notar que o resultado ser idntico, ou seja, no h nada que diferencie a
identidade dos dois assemblies. Sendo assim, a substituio fsica o suficiente para
comprometer a regra de clculo de salrio, j que para a aplicao que a consome, acaba
sendo o mesmo componente. Se repararmos melhor, entre as quatro informaes que
compem a identidade do assembly, uma delas chamada de PublicKeyToken, e que est
nula (no definida). justamente nela que est a soluo para o nosso problema.
Dentro do .NET Framework existem dois tipos de assemblies: os que so fracamente
nomeados e os que so fortemente nomeados. Aqueles que so fracamente nomeados (que
o padro para todos os projetos .NET), so estruturalmente idnticos, possuindo o mesmo
formato e os mesmos tipos definidos, mas como est, d margem para esse tipo de problema.
Isso acontece porque quando efetuamos a referncia do componente RegrasDeNegocio.dll na
aplicao AplicacaoDeRH.exe, o .NET injeta no manifesto da AplicacaoDeRH, informaes
pertinentes ao assembly de regras de negcio. Se analisarmos o manifesto do EXE, veremos
a seguinte informao:
83
Frameworks de Desenvolvimento
Na imagem acima, podemos verificar que dentro da AplicacaoDeRH h uma referncia para o
componente RegrasDeNegocio, que inclui o nome e a verso dele. Como at ento o
componente ilegal possui a mesma identidade, a aplicao consome ele sem maiores
problemas, no sabendo que se trata de um componente malicioso.
Para resolver o nosso problema, vamos recorrer aos assemblies fortemente nomeados (strong
names). A nica e principal diferena em relaes aos assemblies fracamente nomeados, a
atribuio de uma chave nica, que no se repetir em nenhum lugar do mundo. A Microsoft
criou esse recurso, desde a primeira verso do .NET Framework, que utiliza um par de chaves
(pblica e privada) para garantir a unicidade do assembly. Antes de ver como elas funcionam,
vamos primeiramente entender como ger-la. O .NET Framework fornece uma ferramenta
chamada SN.exe, que responsvel por gerar e manipular essas chaves. Para gerar a nossa
chave, podemos executar o seguinte comando (atravs do prompt do Visual Studio .NET):
SN -k MinhasChaves.snk
O arquivo gerado possui as duas chaves, a pblica e a privada e voc pode nomear o arquivo
da forma que quiser. Com o par de chaves gerado, podemos criar um segundo arquivo para
acomodar somente a chave pblica, mas em um primeiro momento, isso desnecessrio. A
ideia aqui somente visualizarmos o que temos como chave pblica:
SN -p MinhasChaves.snk MinhaChavePublica.snk
Para visualizarmos a chave pblica, podemos utilizar o seguinte comando:
SN -tp MinhaChavePublica.snk
Public key is
00240000048000009400000006020000002400005253413100040000010001
00f1589e575d9c20
cc36a0fb7245d74c8d69ddc26a0c92ebee5e65dba7c94a6583701176cc5a8f
d795e11d7e366c49
a19f3ae28509fa8961e6eca103353fe98168a402dc35001b98d9d5325f6121
bde11bc698f268a3
e7e338b950b565be26e371c2550dfaee54f9ef8993dc476f60b2ab5ad69d5a
e832ddd7e35e43ad
6daafae2
Public key token is 0b8510fcd7fd739a
S que o arquivo snk por si s no funciona. Voc precisa vincul-lo ao assembly qual deseja
assinar. Para isso, voc pode abrir o arquivo AssemblyInfo.cs, e adicionar o atributo
AssemblyKeyFileAttribute, que recebe o caminho fsico at o arquivo que contm o par de
chaves, e que no nosso exemplo MinhasChaves.snk.
[assembly: AssemblyKeyFile(@"C:\MinhasChaves.snk")]
Ao compilar o assembly com a chave vinculada, veremos que a identidade do assembly j
mudar. Ao vincular a chave criada acima no nosso componente RegrasDeNegocio, a
identidade ir aparecer da seguinte forma:
84
Frameworks de Desenvolvimento
Com isso, qualquer pessoa maliciosa que tente refazer o assembly, por mais que ela se atente
a criar toda a estrutura de tipos e mtodos, definir o mesmo nome de assembly, e ainda,
assinar com um outro strong name, ela jamais conseguir reproduzir a mesma identidade e,
consequentemente, no conseguir mais alterar o componente que est instalado no cliente.
importante dizer que fisicamente, a substituio ainda poder ocorrer, mas quando a
aplicacao AplicacaoDeRH tentar acessar algum recurso do assembly RegrasDeNegocio,
uma exceo ser disparada, informando que o assembly solicitado no corresponde aquele
que foi inicialmente referenciado.
Observao: Toda essa segurana pode continuar vulnervel se voc deixar o arquivo com a
chave privada em mos erradas. Se a pessoa maliciosa conseguir ter acesso a esse arquivo, ela
ir gerar o assembly idntico como ela j fazia, mas ao invs de criar um novo par de chaves
para assinar o assembly, ela utilizar o mesmo que voc utilizou para assinar o seu, que o
verdadeiro, e com isso todo o problema volta a acontecer.
Para finalizar, vamos entender como todo esse mecanismo funciona e como o runtime do
.NET Framework assegura isso. Quando geramos a chave a partir do utilitrio SN.exe, um par
de chaves adicionado no arquivo MinhasChaves.snk. Quando compilamos o projeto com
esse arquivo vinculado a ele, o .NET gera um hash do componente utilizando o algoritmo
SHA1 e assina esse hash com a chave privada. O resultado deste processo adicionado no
prprio assembly, incluindo tambm a sua chave pblica, que est matematicamente
relacionada chave privada. A imagem abaixo ilustra esse processo:
85
Frameworks de Desenvolvimento
Como vimos acima, quando o componente referenciado na aplicao que o utiliza, a chave
pblica tambm adicionada aplicao. Durante a execuo, o .NET Framework ir aplicar
o mesmo algoritmo de hash no contedo do componente (DLL) e dar origem um novo
hash e a chave pblica embutida na aplicao que consome aquele componente, ser utilizada
para extrair o contedo (j "hasheado") que est embutido na DLL do componente. Para
determinar se a DLL a mesma ou no, o resultado do hash deve ser igual, do contrrio, a
DLL foi substituda e, felizmente, uma exceo ser disparada, evitando assim de consumir
um componente ilegal. A imagem abaixo ilustra esse processo:
Ao assinar uma aplicao/componente com um strong name, podemos tirar proveito de vrias
funcionalidades, como por exemplo, o refinamento de segurana, a instalao no GAC, que
por sua vez possibilita a centralizao, execuo lado a lado de mltiplas verses de um
mesmo componente, etc. Mas um dos principais benefcios fornecidos por ele, a unicidade
do componente, evitando que algum consiga reproduz-lo e, consequentemente, colocar em
risco a execuo e a confiabilidade das aplicaes que a consomem.
SQL Injection
A Injeo de SQL, mais conhecida atravs do termo americano SQL Injection, um tipo de
ameaa de segurana que se aproveita de falhas em sistemas que interagem com bases de
dados via SQL. A injeo de SQL ocorre quando o atacante consegue inserir uma srie de
instrues SQL dentro de uma consulta (query) atravs da manipulao das entrada de dados
de uma aplicao.
Para nos prevenirmos contra esse tipo de ataque, o ASP.NET fornece o objeto SqlCommand,
junto com a estrutura SqlParameter. Juntos, eles fazem a validao e ajustes nos dados que o
usurio envia e que venham a compor o comando SQL.
Exemplo de utilizao:
86
Frameworks de Desenvolvimento
87
Frameworks de Desenvolvimento
Unidade 8
Acessando Dados com ADO
O ADO.NET um conjunto de classes que voc pode utilizar para manipular dados, e
especificamente desenhado para gerenciar conexes em um ambiente desconectado. Alm de
ser uma boa opo para aplicaes web, o ADO.NET utiliza o formato XML para transmisso
de dados entre a aplicao e o banco de dados.
composto de duas camadas, uma conectada e outra desconectada.
Camada Desconectada
A camada desconectada consiste em um nmero de classes para armazenamento de dados e
relaes. A classe DataSet a classe principal de aramazenamento de dados em cach de
memria. Contm uma coleo ou mais de objetos DataTable que so compostos de linhas e
colunas de dados, chave primria, chave estrangeira, constraints, e informaes sobre os
relacionamentos dos dados nos objetos DataTable. Voc pode imaginar a classe DataSet
como uma representao em memria do banco de dados.
Camada Conectada
A camada conectada responsvel pelo trfego de dados entre a aplicao e a fonte de dados.
A camada conectada especfica para cada banco de dados, como o SQL Server ou arquivo
XML. A camada conectada tambm conhecida como provedora de dados e o ADO.NET j
vem com alguns provedores de dados prontos para uso, incluindo:
SQL Server .NET Framework Data Provider. Para acesso a bases SQL Server 7.0 e
verses posteriores.
OLE DB .NET Framework Data Provider. Para acessar qualquer fonte OLE DB que
voc tenha um provedor OLE DB.
ODBC .NET Framework Data Provider. Para acessar qualquer fonte ODBC para qual
voc prossua um driver ODBC.
Um grande nmero de terceiros,incluindo IBM e ORACLE, fornecem implementaes de
Data Providers para o Framework .NET.
88
Frameworks de Desenvolvimento
Descrio
Constraint
DataColumn
DataRelation
DataRow
DataSet
DataTable
89
Frameworks de Desenvolvimento
DataTableReader
DataView
Camada Conectada
A camada conectada, fornece um link entre a fonte de dados e a camada desconectada. Os
tipos bsicos, encontrados no namespace System.Data.Common esto listados abaixo.
A camada conectada inclui as classes DataAdapter, Connection, Command e DataReader.
Que so Data Providers desenhados para manipulao de dados e para rpida acessos leitura
de dados, forward-only, read-only.O objeto Commandpermite acesso a comandos do banco
de dados, permite retornar dados ao banco, modificar informao, executar stored procedures,
e enviar ou receber parmetros. A classe DataReader fornece um stream de dados de alta
performance. E a classe DataAdapter fornece a ponte entre o objeto DataSet e a fonte de
dados. A classe DataAdapter utiliza o objeto Command para executar comandos SQL na
fonte de dados tanto para caregar o DataSet como para reconciliar as mudanas que foram
feitas no objeto DataSet, de volta para banco.
DBCommand
DbConnection
DbDataAdapter
DbDataReader
Os tipos listados so tipos abstratos e precisam ser herdados. Voc precisa utilizar os
seguintes tipos para implementaes especficas de banco de dados:
90
Frameworks de Desenvolvimento
Para uso com SQL Server .NET Data Provider, voc precisa das classes
SqlDataAdapter, SqlDataReader, SqlCommand, e SqlConnection, encontrados no
namespace System.Data.SqlClient.
Para uso com OLE DB .NET Data Provider, voc tem OleDbDataAdapter,
OleDbDataReader, OleDbCommand, e OleDbConnection, todas sob o namespace
System.Data.OleDb.
Para uso com ODBC .NET Data Provider, voc tem OdbcDataAdapter,
OdbcDataReader, OdbcCommand e OdbcConnection, todas sob o namespace
System.Data.Odbc.
Para uso com Oracle .NET Data Provider, voc em OracleDataAdapter,
OracleDataReader, OracleCommand, and OracleConnection, todas sob o namespace
System.Data.OracleClient. Voc pode utilizar essas classes para os bancos Oracle
verso 8.1.7 ou mais recentes.
Observao: voc no pode misturar os tipos da camada conectada. Todos os tipos utilizados
para gerenciar dados em uma determinada fonte, devem vir do mesmo .NET Data Provider.
Na aba Server Explorer ( View >Server Explorer ), abra expanda o ramo Database.mdf e
clique com o boto direito sobre o item Tables:
91
Frameworks de Desenvolvimento
Clique com o boto direito, selecione Add New Table, e insira a seguinte definio:
Clique com o boto direito sobre a linha id, e selecione a opo Set Primary Key, e na aba
Properties marque a opo IsIdentity com Yes:
92
Frameworks de Desenvolvimento
Clique em File > Save Table, nomeie a tabela como Contatos e clique Ok.
Frameworks de Desenvolvimento
</tr>
<tr>
<td>
EMail:
</td>
<td>
<asp:TextBox ID="txtEMail"
runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
Telefone:
</td>
<td>
<asp:TextBox ID="txtTelefone"
runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
</td>
<td>
<asp:Button ID="btnSalvar" runat="server"
Text="Salvar" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
No modo de Design, clique duas vezes sobre o boto Salvar do formulrio e inclua os
namespaces na pgina:
using System.Data.SqlClient;
94
Frameworks de Desenvolvimento
using
using
using
using
using
using
using
using
using
using
using
using
System;
System.Configuration;
System.Data;
System.Linq;
System.Web;
System.Web.Security;
System.Web.UI;
System.Web.UI.HtmlControls;
System.Web.UI.WebControls;
System.Web.UI.WebControls.WebParts;
System.Xml.Linq;
System.Data.SqlClient;
Frameworks de Desenvolvimento
conn.Close();
Response.Redirect("Default.aspx");
}
}
Salve e execute a pgina em Debug > Start Debugging, e insira alguns registros.
OBSERVAO: para obter a string de conexo do banco, na aba Server Explorer, clique
com o boto direito sobre o banco de dados, selecione Properties, e copie a string que se
encontra na propriedade Connection String.
Frameworks de Desenvolvimento
Clique com o boto direito sobre o cdigo e selecione View Code e insira o seguinte cdigo
no evento Page_Load, tomando cuidado de importar o namespace using
System.Data.SqlClient;.
using
using
using
using
using
using
using
using
using
using
using
using
using
System;
System.Collections;
System.Configuration;
System.Data;
System.Linq;
System.Web;
System.Web.Security;
System.Web.UI;
System.Web.UI.HtmlControls;
System.Web.UI.WebControls;
System.Web.UI.WebControls.WebParts;
System.Xml.Linq;
System.Data.SqlClient;
Frameworks de Desenvolvimento
gvListagem.DataSource = ds;
gvListagem.DataBind();
// fecha a conexo
conn.Close();
}
}
Salve e execute a pgina em Debug > Start Debugging.
98
Frameworks de Desenvolvimento
Unidade 9
Depurando Aplicaes no Visual Studio
Quando voc desenvolve aplicaes, voc pode encontrar diversos tipos diferentes de erros.
Antes de solucion-los voc tem que identificar o tipo de erro e trat-lo apropriadamente.
Existem 3 tipos de erros que voc tem que lidar ao desenvolver um aplicativo: erro de sintaxe,
erros de runtime, e erros de semntica.
Erros de Semntica
So erros mais difceis de localizar pois sua aplicao ir executar e no ser emitido
nenhuma notificao. Mesmo assim, sua aplicao no executa a tarefa esperada. Por
exemplo, seu programa exibe um formulrio de entrada com os dados de um cliente e so
salvos sem erro nenhum. Mas ao visualizar novamente a informao, alguns dados no
aparecem corretamente ou no foi salvo. Isso significa que a semntica da aplicao no est
correta.
99
Frameworks de Desenvolvimento
A Classe Debug
A classe Debug oferece mtodos e propriedades que podem ajudar voc a depurar seu cdigo
exibindo informaese verificando seu cdigo com declaraes no cdigo. Usando a classe
Debug, voc tem a garantia de um cdigo robusto sem afetar a performance e tamanho do
cdigo do seu produto na release final. Isso por que os cdigos de depurao da classe no
so compilados com o programa na verso Release da aplicao. A classe Debug disponvel
globalmente na aplicao importando o namespace System.Diagnostics. No h necessidade
de instanciar a classe, ela no tem construtores, e voc no pode herdar a mesma pois do
tipo sealed.
Mtodos da Classe Debug
Mtodo
Descrio
Debug.Write
Debug.WriteLine
Debug.WriteIf
Debug.Print
Debug.Assert
Habilitando a Depurao
Voc deve habilitar a depurao caso voc deseje depurar a sua aplicao. Isso feito no
arquivo web.config. Dentro do mesmo voc precisa localizar o elemento compilation e
alterar o atributo debug para true.
<configuration>
<system.web>
<compilation debug="true">
...
</system.web>
<configuration>
100
Frameworks de Desenvolvimento
Adicionando BreakPoints
O Visual Studio nos fornece o recurso de BreakPoints, que so nada mais do que pontos de
parada da execuo de uma aplicao.
Voc pode colocar ou remover em qualquer ponto do seu cdigo C# um Break Point
pressionando a tecla F9, ou a partir do menu Debug > Toggle Breakpoint, ou ainda sobre a
linha de cdigo clicando o boto direito opo Breakpoint. Ou ainda, clicando sobre a bolinha
vermelha que marca o Break Point.
101
Frameworks de Desenvolvimento
Pressione F10 ou clique em Step Over no menu Debug, se voc quer que a linha atual seja
executada sem entrar no cdigo da instruo que est sendo executada, como um mtodo na
mesma classe ou em uma classe externa. A execuo ir parar na prxima linha de cdigo.
Pressione F11 ou clique na opo Step Into do menu Debug se voc quiser entrar no cdigo
da instruo da linha atual, se houver algum. Por default, propriedades so normalmente no
usam esse tipo de execuo por no conter cdigo sobre elas.
Depurao Remota
Para voc executar depurao remota, voc deve usar o programa Remote Debugging
Monitor ou msvsmon.exe, que uma aplicao qual o Visual Studio se conecta.
Por default, o Remote Debugging Monitor roda como uma aplicao Windows, voc pode
configur-lo para rodar como servio caso queira que ele seja executado em um servidor
remoto. Voc pode executar o assistente a partir do menu Start, pasta Tools.
Depois de iniciar o depurador remoto, voc deve configurar os ambientes em ambas as
mquinas. Voc tambm deve levar em considerao, as questes de seguranas relacionadas
ao acesso remoto.
Tracing
Tracing o processo de receber informao sobre a execuo da aplicao em tempo de
execuo. uma maneira de monitorar a sua aplicao. Essa informao pode lhe auxiliar a
identificar problemas ou analisar performance, de uma maneira que no afeta a
aplicao.Tracing normalmente utilizado em ambiente de produo em que no possvel
executar depurao.
102
Frameworks de Desenvolvimento
Classe TraceContext
a classe usada para escrever mensagens em uma pgina ou no trace log em memria.
Mtodos da Classe TraceContext:
Write : escreve uma mensagem de trace no log
Warn : similar ao mtodo Write, porm as mensagens aparecem em vermelho.
Ambos os mtodos possuem 3 overloads, todos os 3 possuem uma mensagem de tracing, e
adicionalmente um nome de categoria, e um parmetro to tipo Exception que indica que voc
pode informar um erro capturado ou uma exceo definida pelo usurio.
Exemplo:
Trace.Warn("Ateno");
Trace.Write("Mensagem de Trace");
Trace.Write("Categoria", "Mensagem de Trace");
Trace.Write("Categoria", "Mensagem de Trace", new
Exception("mensagem da exceo"));
Sada:
O parmetro trace permite voc classificar a sada do Trace por categoria alterando o cdigo:
103
Frameworks de Desenvolvimento
Dados do Trace
As informaes do trace a nvel de pgina so adicionadas ao final da pgina .aspx em que
estiver habilitado.
Categorias do Trace
Os dados do Trace so divididos em diversas categorias conforme listado:
104
Frameworks de Desenvolvimento
Categoria
Descrio
Request Details
Trace Information
Control Tree
Session State
Application State
Headers Collection
Form Collection
Querystring
Collection
Server Variables
105
Frameworks de Desenvolvimento
Unidade 10
Compilando, Testando e Distribuindo
Aplicaes .NET
Depois de pronta sua aplicao precisa ser distribuida para todos que querem ou precisam
us-la. Para usar a sua aplicao, o nico requisito para o computador do cliente que tenha
instalado o .NET Framework. Este pode ser instalado diretamente do site da Microsoft, ou ser
disponibilizado com sua aplicao no pacote de instalao. Ele tambm disponvel atravs
do Windows Update e futuramente deve vir junto com todos os sistemas operacionais da
Microsoft.
Ento, tendo o .NET Framework instalado na mquina, para sua aplicao funcionar basta
voc copiar o arquivo executvel para a mquina em questo e execut-lo. No entanto essa
prtica no muito recomendada, mais elegante criar um pacote de instalao para instalar
o programa, permitindo assim tambm sua possivel desinstalao atravs do Painel de
Controle, Adicionar/Remover programas.
106
Frameworks de Desenvolvimento
Web Setup Project: usa o Windows Installer e um Servidor Web para disponibilidar a
aplicao.
Merge Module Project: cria um arquivo de instalao do tipo msm que pode ser usado por
outras aplicaes.
Cab Project: usado quando voc precisa de arquivos de instalao com tamanho
especifico. Se por exemplo sua aplicao tem 30MB e voc quer disponibiliza-la na
internet, pode criar 3 arquivos de 10MB para facilitar o download.
Smart Device CAB Project: usado para criao de projeto instalao para dispositivos
mveis.
Setup Wizard: um assistente, atravs dele voc pode criar os tipos citados acima s que
de maneira simplificada.
107
Frameworks de Desenvolvimento
Isso adiciona o projeto a soluo que esta aberta no Visual Studio, se estiver marcado Create
new Solution, o projeto aberto fechado e criado um novo projeto.
Em Name voc pode dar uma nome para seu projeto de instalao. Por hora, mantena o nome
padro e clique em OK. O Assistente ser inicializado.
108
Frameworks de Desenvolvimento
Clique em Next.
109
Frameworks de Desenvolvimento
Nesse passo voc deve informar o tipo de aplicao, se Windows ou Web. Nesse caso,
mantenha a opo Windows application selecionada.
Clique em Next.
110
Frameworks de Desenvolvimento
Selecione as opes Content Files from Calculadora e Primary output Files from
Calculadora. Isso inclui na instalao arquivos EXE e DLL do projeto.
Se tiver arquivos adicionais para serem adicionados ao projeto como o arquivo do banco de
dados do Access ou algum TXT com informaes sobre o projeto clique em Add para
adicionar o arquivo no passo 4 do assistente.
111
Frameworks de Desenvolvimento
112
Frameworks de Desenvolvimento
Clique em Finish.
O Visual Studio adiciona um novo projeto na soluo chamado Setup1, como voc pode ver
no Solution Explorer.
O File System Editor tambm aparece como mostra a figura.
113
Frameworks de Desenvolvimento
Voc usa o File System Editor para adicionar arquivos no seu projeto de instalao e criar os
atalhos do menu Iniciar e Desktop para sua aplicao.
Clique em Setup1 na janela Solution Explorer e veja as propriedades disponveis na janela
Properties.
A propriedade Author e Manufacturer so geralmente preenchidas com o nome da companhia
que desenvolve o software, seus valores tambm so usados para construir o caminho padro
onde ser instalado o programa. Uma vez instalado o programa a propriedade Author
exibida nas informaes de suporte em Adicionar/Remover Programas no Painel de Controle.
A propriedade Title o nome do programa de instalao e a propriedade Version permite
especificar informaes sobre a verso do seu programa de instalao. As propriedades
Product Code contm informaes geradas pelo Visual Studio que permitem identificar
individualmente distribuies do seu programa.
Ateno, estas propriedades dizem respeito ao programa de instalao e no a aplicao
Formularios.
Na janela Solution Explorer, clique com o boto direito do mouse sobre Setup1 e clique e em
Properties.
exibida a caixa de dilogo Setup1 Property Pages. Esta caixa de dilogo permite que voc
altere algumas das opes escolhidas no assistnte (Setup Wizard) caso necessrio e
customize algumas configuraes adicionais que no estavam disponveis no assistente.
114
Frameworks de Desenvolvimento
A caixa Output File Name especifica o nome do arquivo da instalao. Geralmente ele
contm a extenso .msi por ser usado pelo Windows Installer.
A caixa de seleo Package Files contm 3 opes:
115
Frameworks de Desenvolvimento
Quando estamos criando nossa aplicao importante que esta caixa de seleo esteja
marcada com Debug para que possamos usar as ferramentas de depurao de erros do Visual
Studio. Com o Debug marcado o programa compilado com informaes extras para permitir
a depurao dos erros, essas informaes no so necessrias quando estamos
disponibilizando nossa aplicao e tambm ocasionam perda de performance na nossa
aplicao.
Na janela Solution Explorer, clique com o boto direito do mouse em Setup1, selecione View,
clique em Launch Condition.
aberta a pgina Launch Condition.
Na janela Properties a propriedade InstallUrl setada com uma pgina na Internet que
possibilita o download e instalao do .NET Framework, como sabe, necessrio para sua
aplicao funcionar.
116
Frameworks de Desenvolvimento
Por padro sempre que inicializado a instalao verificado se o .NET Framework esta
instalado na mquina em questo ou no. Se no estiver ele usa essa propriedade, a InstallUrl
para fazer o download e instalao do arquivo Dotnetfx.exe, que instala o .NET Framework.
Antes de iniciar o download e instalao da Internet ele emite uma mensagem, o contudo
desta mensagem est na propriedade Message.
Voc pode disponibilizar o .NET Framework junto com sua instalao, para que no seja
necessrio baixar o arquivo da internet. Para isso voc muda a propriedade InstallUrl para o
caminho da sua instalao e se desejar muda a propriedade Message para um mensagem mais
apropriada. Ser necessrio copiar ento o arquivo Dotnetfx.exe para a pasta de instalao do
seu programa ou para a pasta que voc indicar em InstallUrl.
Vamos deixar como est, para fazer o download se necessrio.
Na janela Solution Explorer, clique com o boto direito sobre Setup1, depois clique em
Build.
No Windows Explorer localize a pasta do projeto Setup1, ela foi especificada quando voc
criou o projeto e entre na pasta Release.
Eis os arquivos necessrios para a instalao do seu projeto, voc pode copiados em um CD
para disponibilizar a instalao do seu programa, como citado anteriormente voc pode copiar
para esta pasta tambm o arquivo Dotnetfx.exe para disponibilizar junto a instalao do .NET
Framework.
117
Frameworks de Desenvolvimento
118