Gerenciando dados em uma aplicação Windows sem usar banco de dados


Quando precisamos armazenar, coletar e retornar informações a primeira coisa que nos vem a mente é a utilização de um banco de dados, e, neste quesito não faltam opções no mercado; isso considerando apenas os banco de dados relacionais.(Existem ainda o modelo hierárquico , em rede, orientado a objetos , etc.) Só a Microsoft possui várias versões para o seu carro chefe o SQL Server , além do Microsoft Access. E o que dizer de FireBird, MySQL,  PostGreSQL , Oracle, etc...

Um Bancos de dados  (ou bases de dados), são conjuntos de registros dispostos em estrutura regular que possibilita a reorganização dos mesmos e produção de informação. Um banco de dados normalmente agrupa registros utilizáveis para um mesmo fim.

Um banco de dados é usualmente mantido e acessado por meio de um software conhecido como Sistema Gerenciador de Banco de dados.(SGBD). (Wikipédia)

Usar um banco de dados vai acrescentar um nível de complexidade ao seu projeto que pode ditar o sucesso ou fracasso do mesmo pois envolve questões como arquitetura, segurança, acesso, etc.

Mas afinal você é mesmo obrigado a sempre usar um banco de dados quando precisa gerenciar informações ?

A resposta a essa pergunta é : Depende.

Se você pretende gerenciar informações complexas usar um banco de dados pode ser a melhor opção mas, dependendo do seu objetivo, tamanho e complexidade do seu projeto outras soluções podem ser adotadas; estou me referindo a XML , serialização , arquivos textos, arquivos binários, etc.

Se você tem um  projeto simples, pretende gerenciar uma quantidade limitada de dados e não precisa compartilhar as informações com outros usuários não precisa necessária usar um banco de dados relacional.

Este artigo procura mostrar como gerenciar informações sem usar um banco de dados e vai usar como exemplo o gerenciamento de uma coleção de figurinhas sobre automóveis (figurinhas de carros.Poderia ser um álbum de fotos, ou qualquer outra coleção de dados) onde iremos usar a serialização de objetos para persistir as informações em um arquivo.

O nosso projeto irá implementar as seguintes funcionalidades para gerenciar a coleção de automóveis:

  1. Criar um arquivo de dados para gerenciar as informações chamado carros.dat;
  2. Incluir automóveis ao arquivo de dados;
  3. Remover automóveis no arquivo de dados;
  4. Procurar por um automóvel específico pelo nome;
  5. Criar e editar detalhes sobre automóveis:
    1. Nome;
    2. Marca;
    3. Modelo;
    4. dataRegistro;
    5. Detalhes;
    6. Foto;
  6. Salvar o arquivo de dados carros.dat;
  7. Reabrir o arquivo de dados carros.dat;
  8. Navegar através de todos os automóveis registrados no arquivo de dados;
  9. Visualizar uma lista de todos os automóveis no arquivo de dados;

A abordagem feita para o desenvolvimento da aplicação não é a única forma de se realizar tal tarefa e você pode adaptar ou usar outras alternativas que a plataforma .NET oferece.

O conceito chave envolvido neste exemplo é a serialização de objetos, portanto você deve ter noções sobre os conceitos básicos que envolvem a serialização de objetos na plataforma .NET. 

Sugiro que você leia os meus artigos sobre o assunto : Serialização de objetos , Serializando objetos e VB.NET - Serializando um DataSet.

O primeiro passo para fazer com que um objeto seja serializável na plataforma .NET é incluir o atributo [Serializable] na declaração da classe que representa esse objeto. No entanto se algum membro dessa classe não precisar se serializado você deve marcá-lo com o atributo [NonSerializable] isso é feito para membros que não representam o estado do objeto. Abaixo temos um exemplo de código usando a serialização da classe:

VB .NET  C#
<Serializable()> _
Public Class Carros
      Public nomeVeiculo As String
      Public Modelo As String
      Private dataCriacao As DateTime

      <NonSerialized()> _
      Public  tempoUso As Integer
End Class
[Serializable]
public class Carro
{
    public string nomeCarro;
    public string Modelo;
    DateTime dataCriacao;

    [NonSerialized]
    public int tempoUso ;
}

Os passos básicos usados no processo de serialização são:

Para realizar tal tarefa podemos usar os seguintes formatadores: BinaryFormatter, SoapFormatter e XmlSerializer.

A primeira tarefa que iremos realizar e criar um projeto no Visual Basic 2008 Express Edition com o nome de colecaoCarros;

Abra o Visual Basic 2008 Express Editon e no menu File selecione a opção New Project ; na janela New Project selecione o template Windows Forms Application e informe o nome colecaoCarros;

Clique com o botão direito do mouse sobre o nome do projeto e selecione a opção Add -> New Item;

A seguir selecione o template Class e informe o nome Carros.vb;

Será criada a classe Carros.vb que será a classe que representará o nosso objeto carro. A classe Carros.vb será o container de todos os dados relacionados aos carros usados na aplicação.

Vamos então definir as propriedades e métodos da classe Carros.vb.

Abra o arquivo Carros.vb e defina os seguintes namespaces que serão usados na classe:

Imports System

Imports System.Drawing

Imports System.Collections.Generic

Imports System.Linq

Imports System.Text

Para organizar melhor o código da classe vamos criar 3 Regions na classe. Para isso digite #Region seguido do nome da região entre Aspas: #Region "Membros" e tecle Enter. A final deveremos ter as regiões conforme mostram as figuras abaixo:

Na região Membros vamos definir os membros da classe conforme abaixo:

Private _id As System.Guid

Private _nome As String

Private _marca As String

Private _modelo As String

Private _detalhes As String

Private _dataFabricacao As DateTime

Private _imagem As Byte()

Private _nomeImagem As String

Na região Construtor vamos definir dois construtores para a classe:

Public Sub New()

    _id = Guid.NewGuid()

End Sub
 

Public Sub New(ByVal nomeCarro)

     _id = Guid.NewGuid()

    _nome = nomeCarro

End Sub

 

O primeiro construtor gera um número único e o atribui ao membro _id , e, o segundo além de gerar o número de identificação atribui um nome ao carro.

Se olharmos para classe Carros.vb no Solution Explorer deveremos ter até o momento o seguinte código:

Finalmente na região Propriedades vamos definir as propriedades da classe conforme abaixo:

Public ReadOnly Property ID() As Guid

Get

     Return _id

End Get

End Property

 

Public Property NomeCarro() As String

Get

Return _nomeCarro

End Get

Set(ByVal value As String)

_nomeCarro = value

End Set

End Property

Public Property Marca() As String

Get

Return _marca

End Get

Set(ByVal value As String)

_marca = value

End Set

End Property
 

Public Property Modelo() As String

Get

Return _modelo

End Get

Set(ByVal value As String)

_modelo = value

End Set

End Property

 

Public Property Detalhes() As String

Get

Return _detalhes

End Get

Set(ByVal value As String)

_detalhes = value

End Set

End Property

 

Public Property DataFabricacao() As Date

Get

Return _dataFabricacao

End Get

Set(ByVal value As Date)

_dataFabricacao = value

End Set

End Property

 

Public Property Imagem() As Byte()

Get

Return _imagem

End Get

Set(ByVal value As Byte())

_imagem = value

End Set

End Property

 

Public Property NomeImagem() As String

Get

Return _nomeImagem

End Get

Set(ByVal value As String)

_nomeImagem = value

End Set

End Property

 

Nota: A nomenclatura usada para dar nome as propriedades , métodos e membros em uma linguagem orientada a objetos não tem um padrão definido

Na versão anterior do Visual Studio a Microsoft sugeria a utilização da Notação Húngara.

Notação Húngara (Hungarian Notation) é uma das convenções para nomenclatura. Exemplo:

String sPrimeiroNome; => s é o prefixo para o tipo String
char cLetra; => c é o prefixo para o tipo Char, i para Integer, s para String, etc.
Button butOk; => but é o prefixo para o tipo Button

Atualmente existem também os seguintes padrões que são usados:

PascalCasing
A primeira letra de cada palavra é caixa alta e as restantes caixa baixa:
Ex: Nomeusuario;

CamelCasing
Primeira palavra caixa baixa as próximas são em Pascal case.
Ex: nomeUsuario;

Uppercase
Caixa alta para as letras de palavras que foram abreviadas: Ex:
System.IO, System.Web.UI, IDisposable

Atente que a plataforma .NET faz distinção entre caixa alta e caixa baixa.
Ex: Soma() e soma();

A sugestão atual da Microsoft é que  propriedades e métodos deve começar com uma letra em caixa alta e o restante do nome deve ser pertinente com o propósito da variável:Exemplos:

Variável  Nome .NET Notação Húngara Descrição
String  NomeFuncionario sNome Nome do funcionário.
int  ContadorAtendimento nContador Contador do tipo Long.
long  NumeroDeBytes lBytes  Uma variável Long para armazenar bytes

Você não é obrigado a seguir nenhuma destas orientações apenas seja coerente com os nomes que vai usar de forma que seja o mais claro e inteligível possível.

A seguir mais algumas recomendações da Microsoft:

  • Não usar  a notação Húngara (exceto para variáveis membros privadas);
  • Usar o underline ( _ )  para variáveis membros privadas a nível de classe;
  • Usar  o padrão CamelCasing para variáveis membro;
  • Usar  o padrão CamelCasing para parâmetros.
  • Usar  o padrão CamelCasing para variáveis locais.
  • Usar  o padrão PascalCasing para funções, propriedades, eventos e nomes de classes;
  • Usar o prefixo "I" para interfaces;
  • Não usar usar nenhuma letra como prefixo para classes, enumerações ou delegates;
  • Não usar uma única letra para nomear variáveis;

Fica a seu critério...

O código acima define as seguintes propriedades:

Observe que a propriedade ID é somente leitura não podendo ser alterada.(Só temos o Get na propriedade)

Com isso já temos a classe que irá definir e tratar o nosso objeto carro e através dela iremos gerenciar toda informação relacionada com a nossa coleção de figurinhas de carros.

Veja a continuação do artigo em : Gerenciando dados sem usar banco de dados - II

Eu sei , é apenas VB .NET , mas eu gosto..

Mat 6:9 Portanto, orai vós deste modo: Pai nosso que estás nos céus, santificado seja o teu nome;

Mat 6:10 venha o teu reino, seja feita a tua vontade, assim na terra como no céu;

Mat 6:11 o pão nosso de cada dia nos dá hoje;

Mat 6:12 e perdoa-nos as nossas dívidas, assim como nós também temos perdoado aos nossos devedores;

Mat 6:13 e não nos deixes entrar em tentação; mas livra-nos do mal. Porque teu é o reino e o poder, e a glória, para sempre, Amém.

        Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

referências:


José Carlos Macoratti