Novembro 2006 - Posts

Necessidade real Vs. Necessidade efectiva

Depois de ler atentamente o posto do {PRE} sobre Qualidade ou Preço, onde ele aborda a eterna questão entre o Windows VS Linux / Qualidade do OpenSource VS Close Source, lembrei de contar algo que se passou ontem.

Um amigo meu comprou à cerca de 2 semanas um portatil HP que veio com o Windows XP Media Center. Até ontem ele estava super contente com o computador, mas, o Media Center não resolve de todo as necessidades dele. Ele é revendedor de produtos Vodafone e o acesso à aplicação de revendedores, por algum motivo, não é possível com o Windows Media Center.
Eis que ele vem ter com os amigos informáticos e pede uma copia do Windows. Infelizmente a cópia que lhe arranjaram num tinha o SP2 e não foi possivel instalar também. Ele ontem estava desesperado para instalar o portatil, pois, não conseguia trabalhar sem ele.

Perguntei-lhe se as aplicações que ele usa não são exclusivamente WEB, logo ele podia tentar em minha casa se com o Ubuntu não tinha problemas. Ele nem quiz ouvir mais, segundo o suporte para revendedores da Vodafone o único sistema operativo aceite para que as aplicações funcionassem (deixem-me recordar que são aplicações Web) era o Windows XP Profissional.

Disse-lhe então que ele devia ir à uma qualquer loja (FNAC por exemplo) e gastar os ditos trezentos e tal euros para comprar uma cópia legal do Windows. Quase que eu era trocidado: 300 euros pelo Windows? Nem pensar.

Assim é que o pessoal usa o Windows? Quantos daqui tem uma copia legal do windows? Quantos tem a coragem de dizer que tem uma cópia pirata? Quando de vós compraram a copia do Windows que tem em casa, invés de piratiar das empresas onde trabalham?

Eu não. Programo com .NET 2.0 e uso Ubuntu.

Abraços
Paulo Aboim Pinto

Posted por Paulo Aboim Pinto with 15 comment(s)
Filed under:

Como usar uma DAL perfeita....

Depois de definir o que pretendo de um DAL perfeita, vou mostrar como a devo usar.
Relembrando o que disse no post anterior, paraMuitas mim uma DAL (Data Access Layer) vai ser uma camada que me abtrai da base de dados e transforma Tabelas de Views em objectos manipulaveis pela base de dados. Muito software destes existe por ai, mas, em quase todos eles temos que possuir um ficheiro XML que define as colunas, temos que ter a classe de dados que vai ser manipulavel pela aplicação e ainda temos de definir a tabela na base de dados.
São na realidade três passo, que eu penso que são desnecessários. Podemos definir a tabela (ou view), desenhar o objecto de dados e Voilá, temos tudo o que necessitamos.

Voltando à forma de usar a DAL, a definição do objecto de dados no final deverá ficar desta forma:

[Table("tbl_User")]
public class tbl_User : DataPersistency
{
#region Private Fields
private int _userID;
private string _userName;
#endregion

#region Public Properties
[IsIdentity, IsPrimaryKey]
public int UserID
{
get { return _userID; }
set { _userID = value; }
}
public string UserName
{
get { return _userName; }
set { _userName = value; }
}
#endregion
#region Constructor
public tbl_User()
{
this.MyObject = this;
}
#endregion
}

Em relação ao post anterior este pedaço de programação é um pouco diferente. Todos os objectos de dados irão derivar de um objecto do tipo DataPersistency. Este objecto é a camada de abstração que necessitamos. Nele temos todos os métodos que irão Inserir, alterar, apagar e selecionar dados como:
* void InsertObject()
* int InsertObjectWithAutoNumber()
* void UpdateObject()
* void DeleteObject()
* object GetObject(Dictionary lParam)
* List GetObjects(Dictionary lParam)

Estes métodos serão suficientes para efectuar todos as operações que pretendemos sobre um determinado objecto.

Para inserir, alterar ou apagar um objecto, basta escrever o comando:
* myUser.InsertObject();
* myUser.DeleteObject();
* myUser.UpdateObject();

Sendo myUser um variável do tipo tbl_User.

Para efectar operações de selecção é um pouco mais complicado. Se quisermos selecionar uma lista, basta termos uma lista de objectos do tipo:
* List myListOfUsers = myUser.GetObjects(null);
Este comando irá retornar uma lista com todos os objectos. Se pretedermos fitrar, definimos um diccionário onde a chave é a coluna e o valor é o valor que pretendemos para o filtro.

Para seleccionar um e só um objecto fazemos o seguinte:

Dictionary lParam = new Dictionary();
lParam.Add("UserID", "1");
myUser = (olimpo.Data.tbl_User) myUser.GetObject(lParam);

Com este exemplo iremos obter o registo onde o UserID=1. Infelizmente ainda não entendi como se usa o Proxy Pattern e por isso não tenho o comando: myUser.GetObject(lParam); sem necessitar mais nada. Será algo implementado mais tarde.

Infelizmente este tipo de DAL nunca encontrei. Todos são complicados e cheio de promenores. Penso que esta abordagem é simples de entender e de implementar.

Aceito sugestões.


Abraços
Paulo Aboim Pinto.

O que é uma DAL perfeita?

Ainda ando às voltas a tentar encontrar a minha persistência perfeita. Ou pelo menos tento.

Já tentei muitas formas como: NHibernate ou ActionPack, mas, nenhuma delas funciona da melhor forma. Há sempre algo que não gostaria que fizesse dessa forma.

Com o Nhibernate temos que criar os ficherios XML com a informação sobre os campos e relação entre as entidades. Há algumas coisa a dizer? Para que quero eu fazer isso?
Os mais puristas dizem logo, como crias a relação entre o objecto e uma tabela (nome da tabela e colunas)? É verdade, mas, tem que haver uma forma melhor para fazer isto.

Com o ActionPack (antigo .NET on Rails), parecia que era o Santo Gral da persistência. Com base em parametrizações no Web.Config tinhamos acesso a objectos criados dinamicamente com a base de dados toda... UAUUUU.
Toda a princesa tem sempre joanetes e esta tem os seus. Só funciona com o template de projecto WebSite, pois, usa um mecanismo dinâmico (que não sei bem explicar) associado ao App_Code, isto é, usando o template WebApplication ou outro qualquer template (Windows Application, Console Application ou Class Library) não vai funcionar. Temos que criar novamente ficheiros XML com a definição da base de dados.. AAAAAAARRRRRRRGGGGGGGGGGG.

Qual a minha alergia aos ficheiros XML de parametrização? Tudo tem haver essencialmente com actualização / criação da informação. É inevitável o trabalho a criar tabela ou view na base de dados. Podemos considerar o trabalho de criar o objecto na aplicação inevitável, mas, ainda termos que criar um ficheiro XML? Já imaginaram o trabalho de manutenção sempre que temos que alterar/adicionar/apagar um(ns) campo(s)?
Isto sem falar em termos que dominar 3 formas de declarar o nosso objecto (na base de dados, no objecto e no ficheiro XML).

Por isso resolvi colocar a mão na massa e perguntar à comunidade o que acham sobre e resolvem este problema.
Qual a minha proposta?

Para resolver este problema e para abdicar definitavamente do ficheiro XML com a definição dos vários campos da base de dados resolvi adicionar ao objecto definido na aplicação as diversas propriedades como exemplo:

[Table("tbl_User")]
public class tbl_User
{
#region Private Fields
private int _userID;
private string _userName;
#endregion

#region Public Properties
[IsIdentity, PrimaryKey]
public int UserID
{
get { return _userID; }
set { _userID = value; }
}
public string UserName
{
get { return _userName; }
set { _userName = value; }
}
#endregion
}

Associado à classe temos a tabela ou view e a todas as propriedades podemos ter:
* IsIdentify - Caso o campo seja do tipo Identify ou AutoNumber
* PrimaryKey - Caso o campo esteja definido na base de dados como Chave Primária.
* ColumnName - Caso o nome da propriedade seja diferente do campo da base de dados, este campo deve ser atribuido. Se não for atribuido o sistema de persistência vai usar o nome da propriedade. * IsNullable - se na base de dados o campo pode conter NULL como
valores. Atribuir o MinValue a um campo Data ou Int32 irá corresponder a NULL na base de dados.
* NotSerializable - A propriedade não será sarializada
* CrossReference - (ainda não implementado) Irá ser responsável por criar uma relação do tipo 1-1.
* MasterDetail - (ainda não implementado) Irá Conter uma lista de objectos de detalhe relacionados com a tabela principal.

Claro que poderei ter mecanismos para gerar estes objectos, mas, a manutenção deste objecto será efectuada a quando se efectua qualquer alteração na base de dados.
Desta forma ultrapassamos a necessidade de um ficheiro XML com estas definições.

No próximo post irei mostrar como interagimos com este objecto para efectuar acções sobre a base de dados. Alguém lembra-se de mais alguma propriedade que deva ser considerada?

Abraços
Paulo Aboim Pinto
Posted por Paulo Aboim Pinto with 2 comment(s)
Filed under:

Mono 1.2 is out

A versão Open Source da Framework .NET tem uma nova versão e podem ver aqui.

De todas as novidades gostaria de destacar:

  • The Windows.Forms 1.1 API is now available
  • System.Drawing is now complete.
  • We now have a basic implementation of System.Transactions. The implementation uses a Lightweight Transaction Manager (LTM) allowing multiple volatile and/or a single durable resource manager.

  • Tests: 121,600 lines of new tests:
    • NUnit test suite for about 50% of the controls.
    • Extensive standalone tests.
    • JSUnit (see section later).

Hoje mesmo vou fazer download desta versão e compilar no meu Ubuntu e continuar o desenvolvimento do Olimpo.

Abraços
Paulo Aboim Pinto

Posted por Paulo Aboim Pinto with no comments
Filed under:

Microsoft & Linux

Muito tem-se falado do acordo entre a Microsoft e a Novell, empresa que gere a distribuição Suse e empresa que desenvolve e mantêm a versão Open Source do .NET, o Mono.

A princípio pareceu-me que seria um passo no sentido de uma melhor interligação entre os sistemas heterogéneos que são o Windows e o Linux. Essa interligação a princípio parece ser a nível dos sistemas de Office, isto é, iremos deixar de ter problemas em abrir um documento escrito em MSOffice Word e em OpenOffice Writer. À partida isto parece ser aquilo que todos queríamos; poder escolher o sistema operativo e/ou o sistema de Office.

Sem querer ser o “Velho do Restelo” nesta matéria, não podemos esquecer que o objectivo da Microsoft é ganhar dinheiro e isso passa por vender os seus produtos. Qual o objectivo de abrir o formato da sua solução de Office? Não será isto uma forma para que os utilizadores passem definitivamente a usar o OpenOffice, já que posso obter na Internet invés de ir a uma qualquer loja da especialidade e comprar por 300,00€ (ou mais).

Outro ponto que gostaria que fosse mais bem esclarecido é em relação ao Mono. Já foi muito dito e escrito que o Mono não viola nenhuma patente da Microsoft, pois, implementa a interface pública .NET.
Penso que a Microsoft terá todo o interesse em que o .NET seja Cross-Platform (assim como pretende ser o Java). Seguinte esta linha de pensamento, é possível termos uma aplicação desenvolvida num sistema operativo Windows e correr no Linux e vice-versa. Quem não vai dizer que isto não é excelente? Eu não, mas, não podemos simplesmente olhar para o dia de amanhã, mas, sim para onde é que o mercado pode estar dentro de 5 ou 10 anos.
A Microsoft já tentou de diversas formas como exemplo: cartas de FUD (Fear, Uncertainty, and Doubt) e ainda palavras do seu CEO, Steve Ballmer, GNU is a “viral license”, que se sente incomodada com o Open Souce, se sim, qual a verdadeira razão desta viragem?
Será que como não consegui acabar com o OpenSource / Linux, está a tentar controlar de outra forma?

Estranho… muito estranho

Abraços
Paulo Aboim Pinto

 

?>

Posted por Paulo Aboim Pinto with 1 comment(s)
Filed under: