quarta-feira, 7 de fevereiro de 2007

ASP.NET na prática: Construindo um pequeno cadastro

Olá a todos. Depois dos posts 10km de informação do Gerson vou colocar algo um pouco menor, seguindo a linha 'faça você mesmo'. Depois de ficar de blá blá blá sobre ASP.NET vamos fazer algo para sacar como a parada funciona. Usaremos o VS2005 e C#. Acredito que possa ser adaptado para a linguagem VB ou qualquer outra do VS, mas com relação à ferramente receio que só possa ser feito no VS mesmo, porque ainda não vi outra ferramenta de .NET dar suporte a .NET 2.0 ou Typed Datasets (Datasets tipados).

Faremos um programa de cadastro de produtos seguindo orientação a objetos, fazendo o máximo isolamento possível e a menor quantidade de código também :)

Vamos conhecer também os componentes ObjectDataSource, GridView e FormView entre outros.

Banco de dados: Usarei o MS SQL Server mas qualquer banco de dados suportado pela tecnologia ADO.NET pode ser usado.

Nossa tabela será chamada Produtos e terá os seguintes campos:

ProdutoID - int - not null - Chave Primária
Descricao - varchar(50) - not null
PrecoCompra - decimal(18, 2) - not null
Saldo - int - not null


O campo ProdutoID não é auto incrementado; para isso usaremos uma tabela chamada Contaores.

Tabela - varchar(50) - not null - Chave Primária
Contador - int - not null

Você até poderia usar um campo to tipo autoinc ou criar trigger, mas o objetivo aqui não é esse.

Teremos um registro nesta tabela onde o campo Tabela será Produtos e ele será incrementado a cada registro que for inserido na tabela.

Então vamos lá. Iniciaremos um novo WebSite no VS2005 em C#

Agora vamos em File > New > File e selecione DataSet. Chame de DataSetProduto.xsd

O VS irá pedir para criar uma pasta chamada App_Code e colocar o recém criado DataSet nesta pasta. Escolha sim.

No assistente do TableAdapter vamos escolher uma conexão com o banco de dados. Se ainda não tiver crie uma. Dê preferência em usar o driver OLEDB em vez do driver direto para SQL Server, porque o driver direto tem diferenças nos parâmetros e você fica acoplado ao banco, e isso não é o que queremos. Assim que criar a conexão o VS vai perguntar se você quer salvar esta string de conexão no arquivo Web.Config. Responda que sim e deixe o nome padrão de ConnectionString.

Agora selecione Use SQL statements e avance; defina o comando SQL para trazer a tabela de produtos:

SELECT ProdutoID, Descricao, PrecoCompra, Saldo
FROM Produtos
WHERE ProdutoID = ?


deixe a próxima tela como está e avance.

Nesta última tela o assistente mostra as operações que foram feitas. Clique Finish.

Com isso temos nosso TableAdapter que representa a tabela Produtos e os métodos Fil, GetData que representam a query que digitamos. No TypedDataSet temos o TableAdapter que é composto do DataTable (Produtos) e as várias queries que terão diferentes parâmetros para trazer os resultados.

Agora vamos criar a query para consultar produtos por descrição. Clique com o botão direito em ProdutosTableAdapter e escolha a opção Add Query. Deixe SQL marcado e avance. Select with return rows (select que retorna várias linhas); avance. Segue o comando:

SELECT ProdutoID, Descricao, PrecoCompra, Saldo
FROM Produtos
WHERE Descricao LIKE ?
ORDER BY Descricao


Avance. Troque os nomes dos métodos de FillBy e GetDataBy para FillByDescricao e GetDataByDescricao e avance. Finalize.

Devido a um pequeno BUG(!) na ferramente este parâmetro string não é mapeado corretamente. Então clique em FillByDescricao,GetDataByDescricao (Descricao) e abra a janela Properties.

Na propriedade Parameters clique nas reticências e procure a propriedade ProviderType do Parâmetro Descricao e troque de Char para VarChar. Dê Ok.

Aaaaarrrrrrggghghghghh BUGGGG!!!!

Sempre que você fizer uma consulta com o operador LIKE faça esta verificação com os parâmetros String que você tiver.

Agora temos nosso DataTable Produtos com duas queries: Fill/GetData e FillByDescricao/GetDataByDescricao.

Tá legal, mas qual é a diferença? Ok, eu explico: os Métodos Fill aceitam como parâmetro um objeto do tipo DataTable e o preenchem com dados; já os GetData retornam o DataTable para serem usados em métodos de objetos de negócio por exemplo. Como usaremos objetos de negócio aqui nós veremos os GetData no nosso código.

Uma vez que criamos a representação da tabela Produtos na nossa aplicação faremos agora a representação da tabela Contadores. Clique em qualquer área livre do DataSet com o botão direito e escolha Add > TableAdapter. O assistente é igual ao da criação do DataTable Produtos. Agora faremos o select na tabela Contadores. O comando SQL é:

SELECT Tabela, Contador
FROM Contadores
WHRE Tabela = ?


Deixe o resto como padrão e prossiga até terminar. Agora nós já definimos toda a nossa representação do banco de dados. Iremos agora criar o objeto de negócio para manipulação destes dados e interação com a aplicação.

É uma ótima prática separar logicamente (fisicamente também é até melhor!) as camadas de dados e apresentação (interface) para manter as partes mais isoladas e independentes e tornar as mudanças nas regras de negócios um processo mais suave.

Salve o DataSet e na janela Solution Explorer clique com o botão direito na pasta App_Code e escolha Add New Item. Selecione o ícone Class e chame o arquivo de Produto.cs.

Esta classe será responsável pela manipulação de dados na interface da aplicação. O objetivo desta classe é prover acesso e manipulação dos dados representados no DataSet, mas mantendo um isolamento e encapsulamento para que a interface tenha que somente fazer o necessário: selecionar a operação e passar os parâmetros para o objeto de negócio para este realizar as ações.

primeiro vamos fazer referência ao namespace que contém os objetos TableAdapter do nosso DataSet para não termos que digitar o seu nome toda hora. logo no começo do documento onde há várias cláusulas using vamos adicionar uma:

using DataSetProdutoTableAdapters;


Entenda namespace como um espaço onde são declarados objetos para serem usados de forma organizada. O namespace acima engloba os nossos objetos TableAdapter que estão no DataSet. É semelhante a cláusula uses do Delphi.

Agora nesta classe vamos implementar os métodos para utilizar na nossa aplicação.

Primeiro os de consulta:

    public DataTable ConsultarPorID(int ProdutoID) {
ProdutosTableAdapter ta = new ProdutosTableAdapter();
return ta.GetData(ProdutoID);
}

public DataTable ConsultarPorDescricao(string Descricao) {
ProdutosTableAdapter ta = new ProdutosTableAdapter();
return ta.GetDataByDescricao(Descricao);
}


Agora os de cadastro:

   public void Incluir(int ProdutoID, string Descricao, decimal PrecoCompra, int Saldo) {
ProdutosTableAdapter ta = new ProdutosTableAdapter();
ta.Insert(ProdutoID, Descricao, PrecoCompra, Saldo);
}

public void Alterar(int ProdutoID, string Descricao, decimal PrecoCompra, int Saldo) {
ProdutosTableAdapter ta = new ProdutosTableAdapter();
ta.Update(ProdutoID, Descricao, PrecoCompra, Saldo, ProdutoID);
}

public void Excluir(int ProdutoID) {
ProdutosTableAdapter ta = new ProdutosTableAdapter();
ta.Delete(ProdutoID);
}


Finalmente o método para gerar o contador:

   public int GerarID() {
int novoID;
string Tabela = "Produtos";
ContadoresTableAdapter ta = new ContadoresTableAdapter();
DataTable dt = ta.GetData(Tabela);
if (dt.Rows.Count > 0) {
novoID = Convert.ToInt32(dt.Rows[0]["Contador"]) + 1;
ta.Update(Tabela, novoID, Tabela);
}
else {
novoID = 1;
ta.Insert(Tabela, novoID);
}
return novoID;
}


Este método GerarID acessa a tabela contadores e incrementa o contador caso já exista algum ou inclui novo registro caso ainda não exista.

Agora nossa classe está pronta; vamos implementar as interfaces. No nosso Default.aspx vamos colocar os links para as páginas que farão o cadastro. Abra o Default.aspx. Dentro do nosso form inclua os links para as operações:

   <h1 style="border-bottom: solid 1px black">Cadastro de Produtos</h1>
<a href="Incluir.aspx">Incluir</a><br />
<a href="Consular.aspx">Consultar - Alterar e excluir</a>


segue o HTML completo:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1 style="border-bottom: solid 1px black">Cadastro de Produtos</h1>
<a href="Incluir.aspx">Incluir</a><br />
<a href="Consultar.aspx">Consultar - Alterar e excluir</a>
</div>
</form>
</body>
</html>


No Solution Explorer clique com o botão direito no Default.aspx e clique em Set as Start Page. Salve e feche Default.aspx.

Criando a página Incluir.aspx

Agora vamos criar o formulário de inclusão de registro. Clique com o botão direito no WebSite e escolha Add New Item. Escolha WebForm e chame de Incluir.aspx.

Para facilitar um pouco as coisas vamos para a visualização Design. Na parte inferior do editor há dois botões: Design e Code; clique em Design.

O Editor de HTML do VS é muito bom. Eu uso o editor até para colocar componentes ASP.NET, e ainda dá para alterar as propriedades na janela Properties clicando dentro ta tag na visualização HTML.

Na janela Toolbox na seção Data há um componente chamado ObjectDatasource. Dê um duplo clique nele para adicionar ao WebForm.

Na janela Properties mude a propriedade ID de ObjectDataSource1 para ObjDsProduto. No rodapé da janela Properties ainda há um link 'Configure Data Source...'. Clique nele.

No campo Choose your business object temos que escolher a classe Produto que nós codificamos; porém ele não aparece na lista. Devemos desmarcar a caixa ao lado 'Show only data components'. Agora, no meio de várias opções aparecerá Produto. Selecione e dê next.

Nesta página vamos incluir; então só precisamos definir os métodos de SELECT e INSERT. Na aba SELECT escolha o método ConsultarPorID e na aba INSERT escolha Incluir. Dê next.

Na próxima página o objeto nos pergunta sobre o valor padrão do parâmetro ProdutoID do método Select (nós podemos passar valores dinamicamente também). Entre com -1 para o valor. usamos este número para que a consulta não retorne registros, já que nossa operação é de INSERT e para isso não precisamos de dados neste momento. Dê Finish.

Agora que a fonte de dados está configurada vamos colocar o objeto que mostrará os campos para fazer a inserção no banco de dados. Este componente é o FormView. Deixe o cursor abaixo do ObjDsProduto e na Toolbox novamente acesse a seção Data e dê um duplo clique no FormView. Abra a janela Properties e defina as propriedades:

ID: FvwProduto
DatasourceID: ObjDsProduto
DefaultMode: Insert

Este componente nos permite criar formulários com campos diretamente ligados ao nosso DataSource (ObjDsProduto). Então vamos criar um template para o form de Insert. Clique com o botão direito no componente e escolha Edit Template > InsertItem Template. Agora tem uma área editável dentro do FormView para colocarmos os campos. Nós precisamos de 4 caixas de texto para representar os campos da tabela e um botão para confirmar e outro para cancelar. vamos um a um:

Com o cursor dentro do InsertItemTemplate vá na Toolbox e insira um TextBox:

ID: TxtProdutoID
ReadOnly: True

Agora na parte inferior da janela clique em 'Edit Databindings...'

No campo aberto para editar entre com Bind('ProdutoID') (o campo do DataSource que ele representará)

Abaixo insira outra TextBox:

ID: TxtDescricao
No 'Edit Databindings...' selecione Bind('Descricao')

Mais uma linha, mais uma TextBox:

ID: TxtPrecoCompra
'Edit Databinddings...' - Bind('PrecoCompra')

Último campo:

ID: TxtSaldo
'Edit DataBindings...' - Bind('Saldo')

Na linha de baixo insira dois botões, um ao lado do outro:

Botão 1:
ID: BtnConfirmar
Text: Confirmar
CommandName: Insert

Botão 2:
ID: BtnCancelar
Text: Cancelar

A propriedade CommandName do objeto Button serve para enviar um comando para o objeto que o está armazenando, no nosso caso o FormView. O FormView possui vários comandos para manipulação de registro, como Edit, New, Insert, Update, etc. O comando Insert chama o método de Insert do DataSource associado ao FormView (ObjDsProduto, que por sua vez chama o método Incluir definido na nossa classe Produto.

Agora digite os textos referentes a cada campo no lado esquerdo de cada um. Se você quiser pode ir até a visualização HTML e editar o html para colocar table. Meu exemplo ficou assim:


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Incluir.aspx.cs" Inherits="Incluir" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ObjectDataSource ID="ObjDsProduto" runat="server" InsertMethod="Incluir" SelectMethod="ConsultarPorID"
TypeName="Produto">
<SelectParameters>
<asp:Parameter DefaultValue="-1" Name="ProdutoID" Type="Int32" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="ProdutoID" Type="Int32" />
<asp:Parameter Name="Descricao" Type="String" />
<asp:Parameter Name="PrecoCompra" Type="Decimal" />
<asp:Parameter Name="Saldo" Type="Int32" />
</InsertParameters>
</asp:ObjectDataSource>

</div>
<asp:FormView ID="FvwProduto" runat="server" DataSourceID="ObjDsProduto" DefaultMode="Insert">
<InsertItemTemplate>
<table border="0" cellpadding="0" celllspacing="0">
<tr>
<td>ID:</td>
<td><asp:TextBox ID="TxtProdutoID" runat="server" Text="<%# Bind('ProdutoiD') %>"></asp:TextBox></td>
</tr>
<tr>
<td>Descrição:</td>
<td><asp:TextBox ID="TxtDescricao" runat="server" Text="<%# Bind('Descricao') %>"></asp:TextBox></td>
</tr>
<tr>
<td>Preço:</td>
<td><asp:TextBox ID="TxtPrecoCompra" runat="server" Text="<%# Bind('PrecoCompra') %>"></asp:TextBox></td>
</tr>
<tr>
<td>Saldo:</td>
<td><asp:TextBox ID="TxtSaldo" runat="server" Text="<%# Bind('Saldo') %>"></asp:TextBox></td>
</tr>
<tr>
<td colspan="2" align="center"><asp:Button ID="BtnConfirmar" runat="server" CommandName="Insert" Text="Confirmar" /> <asp:Button
ID="BtnCancelar" runat="server" Text="Cancelar" /></td>
</tr>
</table>
</InsertItemTemplate>
</asp:FormView>
</form>
</body>
</html>


Agora vamos codificar. Lembra como era em ASP para fazer um formulário de Inclusão? Lembra como é em JAVA? VB? Delphi? Blá? Blá???? Muito bem, aqui o modo é bem fácil. Se você rodar o programa para testar ele já funciona. Funciona? Sim, funciona!

A partir de agora vamos fazer um pequeno polimento nele. Do jeito que ele está nós temos que passar o valor do campo ProdutoID na mão; e já que ele é ReadOnly nós não conseguimos inserir. E, assim que a inclusão é realizada ele volta o formulário em branco para outra inserção. A idéia aqui é gerar um novo ID através do método GerarID da classe Produto e assim que terminar a inclusão retornar à página Default.aspx. Vamos nessa.

Vamos cuidar do mais fácil primeiro: dê um duplo clique no botão Cancelar para fazer logo o redirecionamento para a página inicial (certifique-se de que está no modo de EditTemplate):

protected void BtnCancelar_Click(object sender, EventArgs e) {
Response.Redirect("Default.aspx");
}


Ainda na página de código vamos codificar o evento Page_Load, que dispara sempre que a página carrega:

   protected void Page_Load(object sender, EventArgs e)
{
TextBox txt = (TextBox)FvwProduto.FindControl("TxtProdutoID");
if (txt.Text == "") {
Produto p = new Produto();
txt.Text = p.GerarID().ToString();
}
}


Aqui recuperamos o objeto TextBox TxtProdutoID dentro do FormView e geramos um novo ID para ele caso ainda não tenha sido definido.

Agora faremos o código para redirecionar para a página inicial quando a operação for finalizada:

Volte para o design da interface - Botão direito na página de código - View Designer e selecione o ObjDsProduto. Na janela de propriedades
há um botão que é um raio: este lista os eventos do componente. Vamos codificar o evento Inserted, que dispara depois que um item é inserido. Dê um duplo clique na área do valor:

  protected void ObjDsProduto_Inserted(object sender, ObjectDataSourceStatusEventArgs e) {
Response.Redirect("Default.aspx");
}


Por incrível que pareça, está pronto. Agora para a etapa final da nossa pequena aplicação: Tela para consultar, alterar e excluir.

Mas tudo na mesma página? Meu amigo haja código hein... Nem sempre. Temos no ASP.NET um componente muito legal: GridView. Ele em conjunto com o ObjectDataSource faz todas as operações totalmente sem código. Sem código? Sem código. :)

Salve o Incluir.aspx e feche. Agora com o botão direito no site Add New Item; WebForm e chame de Consultar.aspx.

Vamos direto para o Design e assim como na anterior insira um ObjectDataSource e defina as prorpriedades:

ID: ObjDsProduto
Clique 'Configure Data Source...' na parte inferior.
Desmarque 'Show only data components' e no campo anterior selecione Produto

Avançar

Na aba SELECT escolha ConsultarPorDescricao
Na aba UPDATE escolha Alterar
Na aba DELETE escolha Excluir

Avançar

Deixe o parâmetro em branco e Finish.

Primeiro insira um link para retornar abaixo do ObjDsProduto:

<a href="Default.aspx">Voltar</a>


Agora vamos inserir e configurar nosso GridView: Na Toolbox na parte Data duplo clique em GridView. Selecione ele e abra a janela Properties:

ID: GvwProduto
CellPadding: 4
CellSpacing: 0
DataSourceID: ObjDsProduto
DataKeyNames: ProdutoID (tem que digitar)
Columns: Clique nas reticências

Agora vamos configurar as colunas:

Selecione BoundField e clique Add

HeaderText: ID
DataField: ProdutoID
ReadOnly: True

Selecione novamente BoundField e clique Add

HeaderText: Descrição
DataField: Descricao

Outro BoundField:

HeaderText: Preço
DataField: PrecoCompra

Último BoundField:

HeaderText: Saldo
DataField: Saldo

Agora expanda CommandField e selecione Edit, Update, Cancel. Clique Add

CancelText: Cancelar
EditText: Editar
UpdateText: Atualizar

Por fim, dentro de CommandField selecione Delete e clique Add

DeleteText: Excluir.

Na parte inferior da janela desmarque a caixa 'Auto-generate fields' e dê Ok.

Rode a aplicação com Ctrl+F5. Parabéns!

Não sei vocês, mas se eu tentar fazer este grid "boladão" em PHP acho que vai ser uma boa diversão de fim de semana. Imagina em JAVA! Hehe.

É isso aí. Boa diversão para todos.

Artigo completo (View Full Post)

Artigo interessante sobre o futuro da televisão

Olá nossos assíduos visitantes (se não mencionar eles enchem minha caixa de e-mail reclamando! ahuhauhaau). O post de hoje é sobre um link muito interessante que eu achei na net hoje.

Vindo pela rua, passando em frente a uma banca de jornal, eu vi um banner da revista Super Interessante que era assim: Lost e o fim da TV. Advinhem: fiquei curioso e corri para a net para ver do que se trata.

O google me levou para um post no fórum do site LostBrasil - Hoje em dia é o maior site sobre Lost do Brasil (acho que de toda a América Latina também).

O texto é longo, mas vale absolutamente a pena ler. Meus olhos brilharam quando li sobre as novidades que podem chegar à maneira que vemos TV hoje em dia.

Sem mais demoras, segue o link. Boa leitura e boa diversão. Abraços.

Artigo completo (View Full Post)

sábado, 3 de fevereiro de 2007

Webservice: O que é isso? Pra que serve?

Contextualizando


Cada um dos três últimos séculos foi dominado por uma única tecnologia. (..)

As principais conquistas tecnológicas do séc XX se deram no campo da informação. Entre outros desenvolvimentos, vimos a intalação das redes de telefonia em escala mundial(..) o nascimento e o crescimento sem presedentes da industria de computadores e o lançamento de satélites de comunicação.(..)

A medida que cresce a nossa capacidade de colher, processar e distribuir informações, torna-se ainda maior a necessidade de formas de processamento da informação ainda mais sofisticadas "1


Embora o surgimento dos protocolos de chamda remota (RPCs) não tenha nenhuma dependência com a Internet. É impotante considerar que seu aparecimento foi um combustível poderoso para o cenário de conectividade e interoperabilidade que vivenciamos. Antes da Internet, o discurso sobre a possibilidade de sistemas construídos com linguagens diferentes, rodando em plataformas diferentes, interagirem, era algo bem tímido, digamos assim. É bem provável que uma idéia como essa, antes da Internet, só poderia ser cogitada na cabeça de dois tipo extremos: um leigo ou de um Cyber-visionário.

Naquela época, da imaginação até a realização desta idéia, havia um abismo tecnológico a ser atravessado. Como fazer para que uma aplicação possa reconhecer os métodos da minha, e vice-versa? Qual o tipo de dado que uma determinada função da aplicação “X” retorna? Conhecendo, então, o tipo de dado que retorna, será que meu sistema suporta? E os parâmetros de entrada? Quantos seriam, quais seriam e de que tipo? O visionário diria: “...Eu só preciso de uma interface!!!...”. Todavia, a diversificação de arquiteturas, plataformas e linguagens é tamanha que a construção dessa interface seria demasiadamente dispendiosa, tanto no aspecto do trabalho de codificação, quanto no custo financeiro e mesmo assim, esta interface dificilmente poderia ser re-aproveitada em mais de uma circunstância.

O advento da Internet, de fato, fez com que vislumbrássemos mais de perto essa realização. Agora os computadores já podem interagir, evidentemente com algumas restrições. Na verdade, é o usuário que, através de um computador, interage com um outro computador. Podemos dizer que fisicamente está tudo consolidado. Não existem mais barreiras de arquitetura ou plataformas, desde que todos utilizem o mesmo protocolo. O TCP/IP (Transmission Control Protocol/Internet Protocol) é a língua comum dos computadores que integram a Internet.

Considerando que todos os avanços tecnológicos respondem a estímulos, a informática não foge a essa regra. É muito importante analisarmos algumas afirmações que foram propostas como leis a partir da consolidação da Internet, suas implicações para o ramo de desenvolvimento de software ante a demanda do mercado hoje, são elas:

Lei de Moore:

O número de transistores por centímetro quadrado em um chip dobraria a cada 18 meses.

Lei de Guilder:

A largura de banda da rede triplicaria a cada ano.

Lei de Metcalfe:

A utilidade da rede é equivalente ao quadrado do número de nós.

Embora muitos analistas e programadores ainda não tenham se dado conta, essas leis identificaram o espaço de evolução de nossos sistemas e têm sido um paradigma importante para o mercado de desenvolvimento de software.

Considerando a lei de Moore

Apesar das tecnologias convencionais tirarem proveito do aumento de nós nas redes (Lei de Metcalfe) e também do aumento da largura de banda da Internet (Lei de Guilder), o desenvolvimento de sistemas centralizados ou distribuídos, a partir de tecnologias proprietárias, ignora ou pelo menos tira muito pouco proveito da lei de Moore.

Ao levarmos em conta o aumento do poder de processamento e a miniaturização dos computadores (Moore), está cada vez mais próxima a realidade de que nossos equipamentos domésticos estejam capazes de prover serviços. Seu micro, seu Palm, seu celular já são capazes de fornecer diversos serviços, mas talvez você não saiba que isso já está se tornando uma realidade para sua geladeira, televisão e etc. Em breve, esses equipamentos, hoje coadjuvantes no mundo dos grandes servidores, passarão a exigir uma participação mais ativa no mundo dos objetos distribuídos. E como é que nós desenvolvedores iremos criar sistemas, não mais centralizados, que não seguem mais as regras às quais estamos acostumados? Ou como fazer para integrar sistemas de plataformas heterogenias e até mesmo sistemas legados?

Estamos caminhando para um mundo cada vez mais conectado, onde um número crescente de equipamentos, sistemas, aparelhos e pessoas precisarão se comunicar e trocar informações. Conectividade, integração, fusão, tornaram-se termos corriqueiros e são as aplicações construídas com uma arquitetura distribuída que farão desta visão a realidade, a qual somos nós os responsáveis por construir.

Cada vez mais, nos dia de hoje, cresce a demanda nos departamentos de informática dos mais diversos setores, corporativos ou não, por soluções que venham viabilizar e otimizar os serviços, a troca de informação, a interação e a integração de sistemas de informação. Precisamos, então, desenvolver interfaces capazes de atender essas necessidade de maneira eficiente e eficaz.

"...A fusão dos computadores e das comunicações teve uma profunda influência na forma como os sistemas computacionais eram organizados. Está totalmente ultrapassado o conceito de um "centro de computadores", (...) o velho modelo de um computador atendendo a todas as necessidades computacionais da organização foi substituido pelas chamdas redes de computadores, nais quais os trabalhos são realizados por uma série de computadores interconectados..."2

Os WebServices podem conectar os sistemas da empresa com serviços de parceiros, cadeias de fornecimento altamente otimizadas ou canais de entrega mais amplos, provendo um serviço em tempo real ao consumidor de um modo melhorado.

Os WebServices podem ser utilizados ainda, para agregar conteúdo interno e externo a aplicações, provendo portais mais dinâmicos e colaborativos. Eles são um modelo de aplicação que combina aspectos de desenvolvimentos baseados em componentes reutilizáveis. Este modelo está tendo grande aceitação no mercado e apoio de grandes indústrias de software, como Microsoft, IBM e Sun.

Assuntos Relacionados:

http://www.sei.cmu.edu/architecture/
http://pt.wikipedia.org/wiki/Arquitetura_de_software
http://en.wikipedia.org/wiki/Three-tier_%28computing%29
http://en.wikipedia.org/wiki/Distributed_computing

[2]Tanenbaun S. Andrew, Redes de computadores página 2





[1]Tanenbaun S. Andrew, Redes de computadores página 1

Artigo completo (View Full Post)

Construindo um WebService - Delphi

Esse exemplo foi desenvolvido em Delphi 7

Iniciando a implementação do nosso WebService, voltaremos na barra de menu do principal do Delphi: File New Other WebService SOAP Server Application.

Em segida prossiga com o passo-a-apsso Abaixo:


Click no ícone SOAP Server Application. Na próxima caixa de diálogo você terá de escolher que tipo de tecnologia de script do lado servidor seu Webservice irá utilizar. Para este exemplo marque a opção “CGI Satand-alone executable”.


Em seguida o Delphi irá perguntar se desejamos que ele crie uma interface para a aplicação. Clicke em “Yes”. Sim, queremos criar a interface. Se você deseja que seu serviço seja utilizado por outro sistema, será necessário para isso criar uma interface desse serviço. No protocolo de Webservice esse interface estará definida dentro de um padrão chamado WSDL. A grande vantagem de vc desenvolver webservices em Delphi é que ele te abstrai de todos esses detalhes. Por isso, poderemos prossegui nosso exmplo sem a obrigatoriedade de lermos um catatal de especicifações de protocolos. HAUHAUHHA ..... graças a Deus. Foi mal, mas .... isso é muito bom.

Em “service name” digite “Servicos”, fazendo isto estamos criando uma interface para o nosso serviço com o nome de “servicos”.



Para a seleção de Service activation model definiremos Per Request, escolhendo essa opção estaremos definido como as requisições ao nosso serviço serão atendidas. Você pode desmarcar a checkedbox (generate comments) como o nome já diz, desta forma o Delphi, quando acabarmos de definir todos os parâmetros dessa aplicação, não gerará comentários sobre as Units criadas. Veja o exemplo abaixo, para um melhor acompanhamento siga estritamente a nomenclatura aqui utilizada.





Note que foram criadas Quatro unidades: Projetc1, ServicosImpl, ServicosIntf, Unit1. No teclado aperte Ctrl+F12 (View Unit), e compare com a figura ao lado.

ServicosImpl: unidade de implementação, correspondente ao arquivo ServicosImpl.pas

ServicosIntf: Unidade onde estarão as declarações referentes à interface. Correspondente ao arquivo ServicosIntf.pás.

Já é hora de salvar o que foi feito até agora pressione "CTRL + Shift + S".

Junto com o WebModule criado é automaticamente adicionado os componentes fundamentais para a implementação do servidor. Para visualizar o WebModulo, no teclado aperte Ctrl+F12 (View Unit), e selecione Unit1.

HTTPSoapDispatcher: Recebe e envia mensagens (Web) para o objeto especificado em sua propriedade

“Dispatcher”, para que sejam decodificadas. Registra-se automaticamente junto ao

WebModule, fazendo com que não seja necessário a criação de actions que direcionam

as requisições para o HTTPSoapDispatcher. Desta forma ele pode receber todas as

requisições automaticamente.

HTTPSoapPascalInvoker: Recebe as mensagens enviadas pelo HTTPSoapDispatcher e a interpreta, fazendo com

que sejam executados os métodos correspondentes à solicitação. E também faz o

caminho contrário codificando o retorno do método para o padrão SOAP.

WSDLHTMLPublish: Publica todas as informações registradas pelo Web Service, usando WSDL.


Criando o primeiro serviço

Nosso primeiro exemplo consiste em criar um serviço que informe a data e a hora local do servidor. Para isso implementaremos uma função que retorne esta a data, dia da semana e hora.

Em ServicosIntf , vamos declarar o cabeçalho da função “DataHoraDiaLOcal”. seguida codificaremos o corpo desta função em ServicosImpl. Veja no exemplo abaixo, declaramos a função na sessão “Type”, logo abaixo do GUID:




Aqui declaramos somente a assinatura, note que o nome dessa Unit sugere uma área de delaração como a seção Interface numa unit .pas comun, ServicosIntf. Logo, para codificarmos o corpo desta função termos de fazê-lo na unit correspondente a seção de implementation, podemos fazer um “Ctrl+C” do cabeçalho(function DataHoraDiaLOcal: string: stdcall;) e colarmos em ServicosImpl.

Feito o “Ctrl+V” na sessão Public de ServicosImpl. Com o cursor ainda na mesma linha, pressione “Ctrl+Shift+C” para que o Delphi escreva o corpo da função, observe o exemplo abaixo:

function TServicos.DataHoraDiaLocal: String;
begin

Result := FormatDateTime( 'dd mmmm, dddd, yyyy. HH:nn:ss ' , Now)

end;

Pronto, no que diz respeito a codificação nosso primeiro exemplo termina aqui, basta que Compilemos a aplicação (no Menu: Project Compile Project, ou pelo atalho "Ctrl + F9") , sempre lembrado de salvar o exemplo com SaveAll (Ctrl+Shift+S). Contudo, antes de executar a aplicação é preciso fazer o deploy dessa aplicação. Utilizaremos o IIS para isso. Portanto, crie uma pasta virtual no IIS apontado para o diretório onde está o executável compilado pelo exemplo que estamos criando. Defina como documento principal o .exe. Pronto, acabou!!

Com a aplicação devidamente compilada, salva e feito o deploy. Podemos testá-la no browser, digitando na barra de endereços:

http://LocalHost/ nome_da_pasta_virtual


Repare que a nossa função está publicada. Clicke no browser em Iservicos [WSDL] para visualizar a implementação. É preciso salvarmos este arquivo XML para que possamos importar esta interface para a aplicação cliente que construiremos num outro post.

Veja o próximo no exemplo a página onde Delphi gerou todo o código XML correspondente a nossa implementação. Podemos também gerar um arquivo XML com a definição do nosso serviço.

No próximo post exemplificaremos um aplicativo cliente para consumir esse serviço que acabamos de criar.

Mais artigos no Estação Zn sobre Ws


Preciso saber mais sobre Webservices ...

Artigo completo (View Full Post)

sexta-feira, 2 de fevereiro de 2007

Aplicações Web mais ricas com AJAX

Olá a todos. Depois dos posts micro do Gerson eu vou postar algo realmente grande para dar contraste :)

Durante o desenvolvimento de aplicações web às vezes nós precisamos fazer certas interações com o usuário que apenas com o script cliente fica difícil; ao mesmo tempo que ir ao servidor e fazer o processamento e refazer o render da página é problemático também. Ah.... como era legal programar estilo janelinha.... ah... bons tempos...

Caaaaalmaaa....... podemos juntar estas duas tecnologias de forma muito eficiente (e divertida também) usando AJAX.

AJAX? Sem piadinhas toscas por favor :P Direto da wikipedia:
AJAX (acrônimo em língua inglesa de Asynchronous Javascript And XML) é o uso sistemático de Javascript e XML (e derivados) para tornar o navegador mais interativo com o usuário, utilizando-se de solicitações assíncronas de informações. AJAX não é somente um novo modelo, é também uma iniciativa na construção de aplicações web mais dinâmicas e criativas. AJAX não é uma tecnologia, são realmente várias tecnologias trabalhando juntas, cada uma fazendo sua parte, oferecendo novas funcionalidades.

Não vou explicar cada coisa dessa definição ( :\ preguiçoso... ). Em vez disso vou mostrar um exemplo dele em ação.

Página Web, elemento select (combo). Ao selecionar um item do select usamos este valor como parâmetro para preencher outro select. No modo tradicional quando trocar o valor do select a página será recarregada com a diferença do novo parâmetro.

Com AJAX não é necessário. O coração do AJAX é um objeto que faz chamadas ao servidor e recupera o resultado nele mesmo, sem precisar recarregar a página. Antigamente nós usávamos IFRAME pra isso, mas isso são outros quinhentos hehe.

Vamos ao funcionamento: Entendam AJAX por um objeto javascript chamado XMLHttpRequest (simplificando é claro).

Este objeto tem métodos para chamar um script server-side (duh) no servidor (é claro!) e armazenar nele o resultado do processamento, que normalmente seria carregado na página. Suas páginas que usam AJAX não devem (preferencialmente) retornar uma página HTML completa. Apenas o resultado que será usado deve ser retornado. Este resultado pode vir de duas maneiras: em texto plano ou XML. Para XML devemos usar as funções javascript para XML e em texto plano pode ser um script javascript ou código HTML para ser substituído dentro de um DIV.

Eu ainda não comecei a usar XML; meus script usados em AJAX sempre retornam texto plano em forma de comandos javascript, que eu executo usando a função eval(), que entende o conteúdo de uma string como código e o executa.

Eu podia ficar mais 10 páginas de blá blá blá, mas como a maioria não vai ler mesmo vou direto mostrar como eu faço no site em que estou trabalhando atualmente.

No arquivo de include funcoes.js

var xmlhttp;
if (typeof XMLHttpRequest != 'undefined') {
xmlhttp = new XMLHttpRequest();
}
else {
xmlhtttp = new ActiveXObject("Microsoft.XMLHttp");
if (!xmlhttp) {
xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
}
}


function respostaAjax(url) {
xmlhttp.open("GET", url, false);
xmlhttp.send(null);
return xmlhttp.responseText;
}


Explicando. A variável da página xmlhttp é o objeto que faz as chamadas assíncronas dos scripts. este código grande para instanciar é porque... advinha??? advinha??? claro! há diferenças entre os navegadores e o IE6 usa um controle Activex para isso. O Mozilla Firefox e o IE7 já possuem este componente na sua arquitetura.

na função respostaAjax passamos como parâmetro a url do script ajax com parâmetros via GET (pagina.php?parametro=valor)

Este método faz a requisição desta url para o servidor e recupera o resultado na propriedade responseText. Caso use XML a propriedade será responseXML.

vamos a um exemplo:

Interface:

<script language="javascript" type="text/javascrpt" src="funcoes.js">
</script>

<script language="javascript" type="text/javascript" for="combo1" event="onchange">
var resultado = respostaAjax("resultado.php?valor=" + this.value);
eval(resultado);
</script>


<select name="combo1" id="combo1">
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>


Arquivo resultado.php, que espera um parâmetro da url (GET)

<?

header("Content-Type: text/html; charset=iso-8859-1");
$valor = $_GET["valor"];

$quadrado = $valor * $valor;

echo "alert('O quardado de $valor é $quadrado');";
?>


Se testarmos a aplicação veremos que assim que o valor do select muda o objeto AJAX chama a página do servidor, recupera o resultado e executa como um script. O resultado do nosso exemplo será um alert informando o quadrado do número informado.

Este exemplo é meio bobo; até poderia ser resolvido com script cliente. Mas imagine uma situação em que a interface precisa acessar o banco de dados e usar este resultado para montar outro select. Neste caso este sistema é legal.

Eu usei o PHP aqui para exemplificar mas vale ressaltar que qualquer linguagem server-side (não necessariamente script) pode ser usada. Basta suportar request/response.

Então é isso. Aproveitem e divirtam-se bastante enriquecendo suas aplicações web.

Artigo completo (View Full Post)

quinta-feira, 1 de fevereiro de 2007

3. CONSTANTES, VARIÁVEIS E TIPOS DE DADOS

Antes de prosseguir faremos uma breve revisão sobre tudo que falamos até agora sobre Introdução a Programação. Vimos a importância da lógica. Vimos também qual a relação entre a lógica e programação de computadores. Como nossos pensamentos seguem uma forma lógica. Através desse processo tomamos todas as decisões em nossa vida. Desde as mais simples e de pouca conseqüência (como numa tarde de sol, descontraído na praia, olhar para o céu sem nenhuma razão específica), as decisões super complexas, com conseqüências catastróficas (como responder para sua amada se a roupa que ela escolheu para sair, numa sexta a noite, está boa .... hehehhehe).

Em seguida, com o conhecimento sobre lógica fundamentado, aplicamos nos algoritmos o conceito de lógica computacional. Aprendemos a construir algoritmos simples e fomos além, vimos também a relação desses algoritmos com um programa propriamente dito. Fizemos um pequeno programa em Pascal que calcula a média final. Através dos algoritmos e do programa experimentamos um conceito fundamental no que se refere a processamento sistematizado:

  Entrada ---> Processamento ---> Saída

Recordando

ENTRADA: O que entra?

Resposta – DADOS, elementos que você precisa para, através deles, chegar a um objetivo específico.

PROCESSAMENTO: o Que é processamento?
Resposta - São os passos que devem ser seguidos onde os dados que entraram são manipulados, transformados
para chegar ao resultado final. Um objetivo final.

SAÍDA:
O que é a saída?
Resposta
– Um novo elemento gerado a partir dos dados já processados.

Pense num liquidificador, qual é o objetivo de uma pessoa quando usa um eletrodoméstico desse tipo? Fazer um suco, ou tornar em forma liquida, ou pastosa, algum outro produto. Logo, seguindo nossa analogia de fazer um suco:

Primeira Pergunta – O que entra?

Resposta - Frutas, Maça e Acerola, suco de laranja e açúcar. Ah!! Não posso me esquecer do gelo.

Segunda Pergunta – Como é o processamento?

Resposta - Ligar o liquidificador, com as frutas e o suco dentro. Os produtos são misturados.

Terceira Pergunta – O que é a saída?

Resposta – Um maravilhoso suco geladinho.


3.1 Mas, o que isso tem a ver com variáveis, constantes e tipos de dados?

Bem, imagina que vc fosse fazer esse suco num lugar aonde não houvesse nenhuma espécie de móvel. Para ser mais preciso nenhum objeto sequer, de nenhuma espécie. Além disso, neste lugar imaginário, vc está cego, portanto, não há como identificar visualmente os elementos que vc precisa, nem consegue ver onde pegá-los. Você está cheio de limitações:


     -  Onde sustentar/apoiar o liquidificador?

- Aonde depositar o suco de laranja, se não existe nenhum objeto?

- Quando lhe forem passados os produtos para fazer o suco, terá dificuldade para identificá-los, inclusive.


Copo, tigela, jarra, vasilha, todos esses são objetos, não são? Então vc não os terá, entendeu? Vc Não tem objetos, ok? Então, recapitulando, vc está cego, encontra-se num lugar onde não existe nada, nenhum objeto sequer. De uma forma misteriosa qualquer alguém lhe passa os dados de entrada para fazer o suco. Primeiro a maça, depois a acerola,
em seguida o gelo e o suco. Espera ae ...Mas, aonde vc está depositando essas coisas? Se aonde vc está não existe nada? As frutas e o gelo, neste caso, vc pode segurar, mas o suco? O que vc vai fazer com ele? Assim vai ser difícil não é? Impossível, posso considerar assim? O que vc acha?

Ok, chega de sofrimento. Vamos alterar um pouco as regras desse jogo, observe como o cenário vai mudar. Vou lhe conceder o poder de criar os objetos necessários para depositar cada um dos ingredientes. Antes de receber os ingredientes você poderá criar uma mesa, para servir de repositório de todos os demais objetos. Agora vc pode criar uma jarra (para servir de repositório do suco), prato para depositar a maça, outro prato para a acerola, uma vasilha para o gelo, um pote para o açúcar, e tudo que vc precisa, sem esquecer do liquidificador. Depois de dispô-los na mesa que vc criou, seguindo uma lógica para essa disposição, é claro, agora mesmo cego, como foi vc que pegou esses objetos, e os dispôs da maneira que lhe foi mais conveniente, já não é tão difícil acessá-los e identificá-los para fazer o suco. Vc já memorizou onde está o prato com a maça, bem como a vasilha com gelo, acerola, a jarra com o suco e o pote para o açúcar. Todos esses elementos, vc os dispôs na mesa. Agora, basta, cuidadosamente, pegar a quantidade desejada de cada um e depositar dentro do liquidificador, ligar e pronto. Pronto? Ainda não. Falta colocar o suco em algum lugar. Será que a jarra poderia ser usada par isso? Claro que sim, reutilizaremos a jarra, para economizar, podemos utilizar a mesma usada Anteriormente . Falta alguma coisa ainda? Acho que sim: O copo, para que se possa beber o suco. Você criou o copo? Ueh!?!? Deu mole no algoritmo? Hehehehheheheh ...

Então, voltando a anlogia: A memória do computador é esse lugar, as variáveis são usadas para a mesma função que os objetos que usamos para armazenar os dados de entrada. É você que tem a responsabilidade de criar e determinar de que tipo serão, de acordo com a necessidade do que vai processar.

no exemplo acima, “processamento do suco gelado”. Por exemplo, o prato e a jarra: São servem de depositório para uma variedade de outros objetos. Cada um mais apropriado para um tipo diferente de objeto. O prato para frutas variadas, queijos, pães, frios, ao passo que a jarra seria mais apropriada para líquidos. Observe o termo que usei: “variedade” de objetos, de um determinado “tipo” pode ser armazenado. Isso está lhe dizendo alguma coisa? Então, chamamos de variável em programação o que utilizamos para armazenar uma gama de dados diferentes, só que de um determinado tipo. Por isso a importância do que chamamos de “tipos de dados”.

Quanto as constantes, elas não possuem nenhuma relação com o que entra (dados de entrada, no caso, as frutas e os demais ingredientes para o suco), nem com o que sai (Ou pelo menos não deveria ter), mas ela é um elemento que tem participação fundamental no processamento. A principal e fundamental diferença entre a variável e a constante é que a constante, como o nome já diz armazena um valor só, único, constante durante todo o processo. Exemplo: preciso desenvolver um processo para calcular a área de circunferências. A fórmula para isso é:

( Pi * raio ao quadrado). O dado de entrada é o raio, sendo o valor de "Pi" constante (3,1415926536....) posso, por isso, definí-lo como tal. Para isso serve as constantes.


Vejamos mais detalhadamente:

Variáveis e constantes são os elementos básicos que um programa manipula. Uma variável é um espaço reservado na memória do computador para armazenar um tipo de dado determinado.
Variáveis devem receber nomes para poderem ser referenciadas e os valores armazenados por elas podem ser modificados quando necessário. Ao passo que, embora, uma constante, também seja um espaço reservado na memória, o valor armazenado por ela não pode ser modificado jamais.

Um programa deve conter declarações que especificam de que tipo são as variáveis que ele utilizará e as vezes um valor inicial. Tipos como o nome já diz definem que tipo de dado pode ser armazenado na variável. Pq, ao exemplo da Jarra e do copo, eles possuem pré-definições a respeito da quantidade de espaço de memória será alocado (da mesma maneira que geralmente uma Jarra tem capacidade para suportar maior volume de líquido que o copo), bem como que operações poderão ser feitas com o dado dependendo do tipo (exemplo: Operações aritméticas,
concatenações ou expressões lógicas). Os tipo de dados são subdivididos em dois grupos:
Tipo primitivos da linguagem e tipos definidos pelo programador. Os tipo primitivos podem ser por exemplo:
Numéricos inteiros, Numéricos reais, caracteres, Booleanos(Lógicos, verdadeiro e falso). As expressões combinam variáveis e constantes para calcular novos valores.


3.2. CONSTANTES

Constante é um determinado valor fixo que não se modifica ao longo do tempo, durante a execução de um programa. Conforme o seu tipo, a constante é classificada como sendo numérica, lógica e literal.


3.3. VARIÁVEIS

Variável é a representação simbólica dos elementos de um certo conjunto. Cada variável corresponde a uma posição de memória, cujo conteúdo pode se alterado ao longo do tempo durante a execução de um programa. Embora uma variável possa assumir diferentes valores, ela só pode armazenar um valor a cada instante.

3.4. TIPOS DE VARIÁVEIS

As variáveis pode ser basicamente de quatro tipos: Numéricas, Caracteres, Alfanuméricas ou lógicas.


   Numéricas: Específicas para armazenamento de números, que posteriormente
poderão ser utilizados para cálculos.Podem ser ainda classificadas como
Inteiras ou Reais. As variáveis do tipo inteiro são para armazenamento de números
inteiros e as Reais são para o armazenamento de números que possuam casas decimais.

Caracteres:
Específicas para armazenamento de conjunto de caracteres que não contenham números (literais).
Ex:
nomes.

Alfanuméricas: Específicas para dados que contenham letras e/ou números. Pode em determinados momentos conter
somente dados numéricos ou somente literais. Se usado somente para armazenamento de números,
não poderá ser utilizada para operações matemáticas.

Lógicas:
Armazenam somente dados lógicos que podem ser Verdadeiro ou Falso.
Também são chamadas de booleanas por causa de George Boole (pesquisa em português), quem sistematizou o conceito de lógica.


3.5. DECLARAÇÃO DE VARIÁVEIS

As variáveis só podem armazenar valores de um mesmo tipo, de maneira que também são classificadas como sendo numéricas, lógicas e literais.

3.6. IDENTIFICADORES

São os nomes dados a variáveis, constantes e programas. Existem regras para se fazer isso. Veja em seguida:


3.6.1 Regras Para Construção de Identificadores:

-Não podem ter nomes de palavras reservadas(comandos da linguagem);

-Devem possuir como 1º caractere uma letra ou Underscore ( _ );

-Ter como demais caracteres letras, números ou Underscore;

-Ter no máximo 127 caracteres;

-Não possuir espaços em branco;

-A escolha de letras maiúsculas ou minúsculas é indiferente.

Exemplos: NOME, TELEFONE, IDADE_FILHO, PI

3.7. ATRIBUIÇÃO

Uma Variável nunca é eternamente igual a um valor, seu conteúdo pode ser alterado a qualquer momento. Portanto, para atribuir valores a variáveis devemos usar o sinal para isso. Infelizmente esse sinal não é o mesmo para todas as linguagens, vejamos: O símbolo usada para representar uma atribuição de valor em Pascal é “:=” (dois pontos seguido do igual). Em C usamos, e em muitas outras linguagens como Java, Javascript, C#, ASP, Visual Basic é usado o sinal de "=" (Igual), em decorrência disso a igualdade em C, pó exemplo é representado por "= =".

Exemplos:

Atribuição em Pascal


  • A := 2;

  • B := 3;

  • C := A + B;

Igualdade em Pascal


  • A = 2;

  • B = 3;

  • C = D;


Atribuição em C ou Java.


  • I = 2;

  • Aux = ‘Nome do Aluno';

  • C = (J + I)/ 5;

Igualdade em C ou Javascript


  • A = = 2;

  • B = =3;

  • C = = D;


3.8. EXERCÍCIOS

1) O que é uma constante? Dê dois exemplos.

2) O que é uma variável? Dê dois exemplos.

Artigo completo (View Full Post)

2 - DESENVOLVENDO ALGORITMOS

Mais um da série ...


2.1. PSEUDOCÓDIGO

Os algoritmos são descritos em uma linguagem chamada pseudocódigo. Este nome é uma alusão à posterior implementação em uma linguagem de programação, ou seja, quando formos programar em uma linguagem, por exemplo Visual Basic, estaremos gerando código em Visual Basic. Por isso os algoritmos são independentes das linguagens de programação. Ao contrário de uma linguagem de programação não existe um formalismo rígido de como deve ser escrito o algoritmo.

O algoritmo deve ser fácil de se interpretar e fácil de codificar. Ou seja, ele deve ser o intermediário entre a linguagem falada e a linguagem de programação.


2.2. REGRAS PARA A CONSTRUÇÃO DO ALGORÍTMO

Para escrever um algoritmo precisamos descrever a seqüência de instruções, de maneira simples e objetiva. Para isso utilizaremos algumas técnicas:

-Usar somente um verbo por frase
-Imaginar que você está desenvolvendo um algoritmo para pessoas que não trabalham com informática
-Usar frases curtas e simples
-Ser objetivo
-Procurar usar palavras que não tenham sentido dúbio

2.3. FASES

Ok, no parágrafo anterior vimos que ALGORITMO é uma seqüência lógica de instruções que podem ser executadas.

É importante ressaltar que qualquer tarefa que siga determinado padrão pode ser descrita por um algoritmo, como por exemplo:

COMO FAZER PARA ESTACIONAR O CARRO

ou então

CALCULAR A MÉDIA PARA APROVAÇÃO DOS ALUNOS NO CURSO DE INFORMÁTICA

Entretanto, ao montar um algoritmo, precisamos primeiro dividir o problema apresentado em três fases fundamentais.

ENTRADA ----> PROCESSAMENTO ---> SAÍDA

ENTRADA: São os dados de entrada do algoritmo.
PROCESSAMENTO: São os procedimentos usados para chegar ao resultado final.
SAÍDA: São os dados já processados.

2.4. EXEMPLO DE ALGORÍTMO

Imagine o seguinte problema: Calcular a média final dos alunos da 3 Série. Os alunos realizarão quatro provas: P1, P2, P3 e P4.

Onde:

Média Final = (P1 + P2 + P3 + P4) / 4

Para montar o algoritmo proposto, faremos três perguntas:

a) Quais são os dados de entrada?

R: Os dados de entrada são P1, P2, P3 e P4

b) Qual será o processamento a ser utilizado?

R: O procedimento será somar todos os dados de entrada e dividi-los por 4 (quatro)

(P1 + P2 + P3 + P4) / 4

c) Quais serão os dados de saída?

R: O dado de saída será a média final


Algoritmo


Receba a nota da prova1
Receba a nota de prova2
Receba a nota de prova3
Receba a nota da prova4
Some todas as notas e divida o resultado por 4
Mostre o resultado da divisão



Exemplo em Pseudocódigo:

PROGRAMA MEDIA_FINAL;

VAR NOTA1, NOTA2, NOTA3, NOTA4, MEDIA: INTEIRO;
NOME : CARACTERE [35];

INICIO

LER (NOME);
LER (NOTA1, NOTA2, NOTA3, NOTA4);
MEDIA := (NOTA1 + NOTA2 + NOTA3 + NOTA4) / 4;
ESCREVER (NOME, MEDIA);

FIM.

Exemplo em Pascal

Program media_final;

uses wincrt; {faz uso da biblioteca wincrt, que executa o programa em janela no windows}

{Declaração de variáveis}
var

nota1, nota2, nota3, nota4, media:real; {variaveis do tipo real, admitem casas decimais}
nome: string[30]; {cadeia de caracteres}

Begin {Principal}

write('Entre com o nome do aluno: '); {escreve na tela}
readln(nome); {le a sequencia de caracteres e pula pra linha de baixo}

write('Entre com as 4 notas do aluno: '); {escreve na tela}
readln(nota1, nota2, nota3, nota4); {le as 4 notas, separadas por espaços e pula linha}

media:= (nota1 + nota2 + nota3 + nota4) / 4; {calcula a media e atribui valor à variavel media}

writeln('O aluno ',nome,' obteve media ',media:2:2); {escreve na tela}
{o valor de media tera 2 casa antes e 2 casa após o ponto}

writeln('');
write('Aperte qualquer tecla para sair.');

readkey; {espera qualquer tecla ser apertada}
donewincrt; {fecha janela}


End. {Principal}


Artigo completo (View Full Post)

Uma forma diferente de acessar dados em PHP

Quem desenvolve em PHP provavelmente já sacou que no quesito acesso a dados a linguagem é um tanto acoplada. Cada banco de dados tem seus próprios métodos (functions) para manipulação de dados.

Um exemplo de uma página que faz um select no banco de dados:

<?
$conn = mssql_connect("ip_servidor", "usuario", "senha");
mssql_select_db("banco", $conn);

$sql = "select * from tabela";
$qry = mssql_query($sql, $conn);

while ($linha = mssql_fetch_array($qry)) {
//trata o registro na variavel array $linha
}

...


mssql_close($conn);
?>

Neste caso estou usando o MS SQL Server (depois eu posto como acessar o MS SQL Server no Linux). Para outros bancos, como o MySQL, trocamos tudo que tem mssql por mysql (ex: mysql_connect, mysql_query, ...).

Perceba agora. Cada página PHP que acessar dados precisará desta estrutura. A parte da conexão até pode ser separada com um script de include, mas e o resto do código? Felipe, não estou entendendo... Ok eu explico: imagina se você trocar de banco de dados no meio do desenvolvimento? Tipo: o MySQL não tá legal e vamos usar o MS SQL Server agora. Ótimo! Genial! Tudo o que tenho que fazer é alterar 123 script no meu site. Obrigado!

Agora a proposta: encapsular estes métodos dentro de uma biblioteca para manter o sistema organizado e não acoplado. Na hora de trocar o banco é só trocar nos métodos da biblioteca. Inteligente, não... Modularização, meu caro... POO, meu caro...

observe o arquivo db.php

<?

class DB {
$conexao;

function DB() {
// construtor da classe abre conexão com o banco de dados
$this->conexao = mssql_connect("servidor", "usuario", "senha");
mssql_select_db("banco", $this->conexao);
}

function executarConsultaSelecao($sql) {
$i = 0;
$id = mssql_query($sql, $this->conexao);
if ($id == 1) {
$resultado = array();
}
else {
while ($linha = mssql_fetch_array($id)) {
$resultado[$i] = $linha;
$i++;
}
mssql_free_result($id);
}
return $resultado;
}

function executarComandoSQL($sql) {
$retorno = true;
mssql_query($sql, $conexao) or $retorno = false;
return $retorno;

}

function fecharConexao() {
mssql_close($this->conexao);
}

}

?>


Pronto esse é o básico. Vamos explicar os métodos.

No construtor da classe abrimos conexão com banco de dados. Sempre que criamos uma nova instância da classe isso acontece.

No método executarConsultaSelecao enviamos um comando SQL e a função retorna um array multidimensional com os registros retornados.

No método executarComandoSQL enviamos um comando SQL que não retorna dados (como insert, update, delete e SP que não retorna nada).

Agora aplicando no nosso script:

<?
include("db.php");
$db = new DB();

$resultado = $db->executarConsultaSelecao("select * from tabela");

foreach ($resultado as $linha) {
// $linha é cada registro retornado dentro do loop
}


$db->executarComandoSQL("insert into tabela(...) values (...)");

$db->fecharConexao();
?>


Na minha humilde opinião ficou muito mais bonito hehe. E a qualidade também é muito boa. E, quando trocar o banco de dados é só alterar os métodos da classe DB no arquivo db.php.

Este é o primeiro passo para uma série de boas práticas de desenvolvimento. Sempre que der tempo eu vou postando a forma que eu desenvolvo aqui. Abraços a todos e até mais!

Artigo completo (View Full Post)

1 - INTRODUÇÃO À LÓGICA DE PROGRAMAÇÃO

Mais um da série ...


1.1. LÓGICA

A lógica de programação é necessária para pessoas que desejam trabalhar com desenvolvimento de sistemas e programas, ela permite definir a seqüência lógica para o desenvolvimento das rotinas que serão codificadas.

1.1.1 Cabe antes de qualquer coisa, verificar o que é lógica:

Lógica é o estudo sistemático do pensamento dedutivo, que permite construir argumentos corretos nas ciências naturais nas ciências humanas e nas ciências formais, e que possibilita distinguir os argumentos corretos dos incorretos. Dessa forma, a questão central da Lógica é: o que significa filosófica e simbolicamente, que um argumento decorra (ou seja conseqüência) das premissas adotadas?
A Lógica moderna e contemporânea usa os mesmos métodos que são usados em Matemática, e por isso é também chamada de Lógica Simbólica. Por outro lado, a própria Matemática faz uso intenso da Lógica em suas demon
strações e em seus fundamentos. (tirado de: http://www.cle.unicamp.br/FAQs.htm)

1.1.2 Um pouco de história faz bem pra alma:

Do ponto de vista histórico, a Lógica percorre um longa trajetória desde Aristóteles, estando já relacionada ao método axiomático da Geometria de Euclides, com intensa atividade na Idade Média, até confluir modernamente nas idéias de Gottlob Frege em 1879 sobre a primeira linguagem formal para a Lógica. Personagens subseqüentes no cenário da Lógica incluem Georg Cantor, Kurt Gödell, Alonzo Church, Alan Turing e Alfred Tarski. A partir do início do Século XX as Lógicas Não-Clássicas tiveram início, dando origem às Lógicas Multivalentes, historicamente ligadas a Jean Lukasiewicz, às Lógicas Intuicionistas historicamente ligadas a Alois Brower e Arendt Heyting, às Lógicas Paraconsistentes historicamente ligadas a Stanislaw Jaskowski e a Newton C. A da Costa e a diversas outras. (tirado de: http://www.cle.unicamp.br/FAQs.htm)

1.1.3 Como isso se relaciona com programação?

A própria noção de “máquina de computar”é um conceito lógico, expresso através da máquinas de Turing devidas a Alan Turing, boa parte da Informática e das Ciências da Computação utilizam a Lógica, e em particular as Lógicas Não-Clássicas. O desenvolvimento técnico não diminuiu a necessidade de reflexão filosófica a respeito dos métodos e da natureza da Lógica,e a transformou em paradigma para certas áreas da Filosofia como a Filosofia Analítica. A Lógica contemporânea converteu-se numa disciplina independente e múltipla que se desenvolve em conexão com a Filosofia, a Lingüística, a Matemática e as Ciências da Computação. (tirado de:http://www.cle.unicamp.br/FAQs.htm)
Lógica de programação é a técnica de encadear pensamentos para atingir determinado objetivo.

1.2. SEQUÊNCIA LÓGICA

Nossos pensamentos podem ser descritos como uma seqüência de instruções, que devem ser seguidas para se cumprir uma determinada tarefa.

Seqüência Lógica são passos executados até atingir um objetivo ou solução de um problema.

1.3. INSTRUÇÕES

Na linguagem comum, entende-se por instruções “um conjunto de regras ou normas definidas para a realização ou emprego de algo”.

Em informática, porém, instrução é a informação que indica a um computador uma ação elementar a executar.

Convém ressaltar que uma ordem isolada não permite realizar o processo completo, para isso é necessário um conjunto de instruções colocadas em ordem seqüencial lógica.

Por exemplo, se quisermos fazer uma omelete de batatas, precisaremos colocar em prática uma série de instruções: descascar as batatas, bater os ovos, fritar as batatas, etc...

É evidente que essas instruções tem que ser executadas em uma ordem adequada – não se pode descascar as batatas depois de fritá-las.

Dessa maneira, uma instrução tomada em separado não tem muito sentido; para obtermos o resultado, precisamos colocar em prática o conjunto de todas as instruções, na ordem correta.

Instruções são um conjunto de regras ou normas definidas para a realização ou emprego de algo. Em informática, é o que indica a um computador uma ação elementar a executar.

1.4. ALGORÍTMO

Um algoritmo é formalmente uma seqüência finita de passos que levam a execução de uma tarefa. Podemos pensar em algoritmo como uma receita, uma seqüência de instruções que dão cabo de uma meta específica. Estas tarefas não podem ser redundantes nem subjetivas na sua definição, devem ser claras e precisas.

Como exemplos de algoritmos podemos citar os algoritmos das operações básicas (adição, multiplicação, divisão e subtração) de números reais decimais. Outros exemplos seriam os manuais de aparelhos eletrônicos, como um videocassete, que explicam passo-a-passo como, por exemplo, gravar um evento.

Até mesmo as coisas mais simples, podem ser descritas por seqüências lógicas. Por exemplo:

Jogar Cartas:

-Pegar a caixa do baralho
-Retirar baralho de dentro da caixa
-Embaralhar as Cartas
-Distribuir as Cartas
... etc.

Somar dois números quaisquer:

-Escreva o primeiro número no retângulo A.
-Escreva o segundo número no retângulo B.
-Some o número do retângulo A com o número do retângulo B e coloque o resultado no retângulo C.




















A
+
B
=
Resultado






Os programas de computadores nada mais são do que algoritmos escritos numa linguagem em liguagem de programação tais como: Pascal, C, Cobol, Fortran, Java, PHP, Ryby, C# e etc ... executados por uma máquina, no caso um computador.



1.6. Propondo Exercícios:

Acho que cabe dedicar um tempo pra por empratica o que vimos até agora. Saia de sua zona de conforto e ponha as mão à obra:

1) Crie uma seqüência lógica para tomar banho.

2) Faça um algoritmo para somar dois números e multiplicar o resultado pelo primeiro número.

3) Descreva com detalhes a seqüência lógica para Trocar um pneu de um carro.

Artigo completo (View Full Post)

O Ruby da Luz em cima, O Delphi da Luz em baixo ... e o Java (Vol II) - pesquisa da Borland.

Recentemente o Daniel postou o resultado uma pesquisa sobre linguagens de programação onde ele destacou o fato do Delphi (Delphi language) vir perdendo popularidade. Embora ele não tenha, de forma explicita, comentado as implicações que esse resultado indica para o desenvolvimento de sistemas, não é difícil concluirmos que: A ferramenta perdendo popularidade representa diretamente, é óbvio, perda de espaço no mercado, migração de profissionais para outras tecnologias, queda do valor da hora de trabalho do profissional, o número de novos projetos, por sua vez, também cai, acrescenta-se a esse cenário o fato de que cada um desses elementos retro-alimenta o outro. Pronto, a cama ta feita. Aliais, a cama ta feia ... a coisa ta feia ... e o meu “nome”, minha vida, meu trabalho esta no meio dessa bagunça.

O Delphi é a melhor ferramenta para desenvolvimento de sistemas for Windows, ou pelo menos até o D7 foi. Faço eco a pergunta que o Daniel deixou escapar: “Por que será?” O Delphi 7 teve um crescimento muito forte em 2003, continuou crescendo em 2004, mesmo com o lançamento do fracassado D8 e do emergente .Net. Todavia, surpreendente, a versão 9 (Delphi 2005) foi um fiasco. Ouvi rumores que seria do interesse da própria Borland matar o Delphi. O Visual Studio, falando de .Net, veio dando poeira nele ... “Poeira, aa.... poeira ... aaa! Poeira, levantou poeira ....”. Houston we have a problems, no ano seguinte o D 2006 ainda não suporta a .net 2.0 (conforme postado pelo Felipe). Pelo que parece o VS 2005 da MS continua dando “Poeira, aa.... poeira ... aaa! Poeira, levantou poeira ....”.

Mas, como o Daniel aponta em seu post, existe uma luz. É verdade ela está em baixo, mas ainda, pelo que parece, não é o fim. A Borland está fazendo uma pesquisa pesquisa on-line para coletar informações sobre os hábitos e preferências dos usuários de Delphi. Confesso que um determinado trecho da pesquisa me pareceu que ela (Borland) está demasiadamente interessada numa nova forma de cobrar licenças de seu produto. Contudo, apesar disso, acho que vale apostar numa expectativa otimista. Estou preferindo olhar para essa pesquisa como uma forma da Borland trazer o Delphi novamente para uma posição mais competitiva no mercado. Portanto, convoco todos os desenvolvedores a se engajarem nessa iniciativa. Participando poderemos dar a oportunidade da Borland / DevCo desenvolver as novas versões do Delphi de acordo com os seus desejos, podendo até quem sabe, ajustar seu cronograma com os interesses do público.

Outros Bogers Delpheros também postaram sobre essa pesquisa, no blog do Malta ele menciona que é um formulário longo, mas bem feito. Segundo ele, e concordo plenamente, vale a pena investir uns 20 minutos em responder a pesquisa. Ah!! Por favor, espalhe a notícia. Peça a todos os desenvolvedores que vc conhece, da sua empresa, curso, faculdade, orkut, lista de discussão, no seu blog, mande carts, telefone ... e etc (heheh), para participar! O endereço é http://infopoll.net/live/surveys/s30110.htm

Artigo completo (View Full Post)

 
BlogBlogs.Com.Br