quarta-feira, 5 de janeiro de 2011

Um Falso Amigo



Você tem um "amigo" que conheceu quando não sabia programar. Ele fazia você se sentir mais maduro e parecia ajudá-lo a ser aceito pelos programadores. Quando você ficava estressado, sempre podia encontrar certa medida de "alívio" com ele. De fato, você passou a depender dele em muitas situações.

Mas, com o tempo, você descobriu o lado sombrio desse amigo. Ele exige sua companhia o tempo todo e, por causa dele, você não é bem vindo em alguns lugares. E, embora ele talvez tenha feito você se sentir mais maduro, isso se deu à custa de sua falta de experiência. Para completar, ele rouba parte do seu salário.

Ultimamente, você tentou várias vezes acabar com essa amizade, mas ele não deixou. De certa forma, você se tornou escravo dele. Você gostaria de nunca tê-lo conhecido. 

Esse amigo se chama Gambiarra.

Fluxograma para testar a Gambiarra.


Definição de Gambiarra

No sentido de improviso ou improvisação, gambiarra é o próprio ato de constituir uma solução improvisada. 


A Questão Etimológica

Segundo o dicionário Aurélio, gambiarra quer dizer “Lâmpada instalada na extremidade dum comprido cabo elétrico para poder ser utilizada numa área relativamente grande”. Entretanto, no mundo da programação de computadores, gambiarra quer dizer algo feito de improviso que quase sempre dá errado! 

Segundo o dicionário Hoauiss (2001), o termo gambiarra tem etimologia de origem "contraditória e duvidosa". Nos principais dicionários brasileiros, a primeira acepção para o termo gambiarra é "uma ramificação ou extensão de luzes". Apesar do evidente e difundido uso informal do termo no Brasil, visto como uma forma de "improvisação", nenhum destes dicionários inclui qualquer acepção que se refira precisamente a este significado.


Gambiarra em Outros Segmentos


O termo é utilizado em diversas áreas profissionais como informática, programação, eletrônica, engenharia civil, cinema, teatro, artes plásticas, arquitetura, design, geralmente se referindo a soluções improvisadas, adaptações, ajustes, muitas vezes como uma solução que não se utiliza de métodos, plano ou projeto. A gambiarra é muitas vezes entendida de forma pejorativa como algo em condições precárias, provisório, transitório, mal-acabado ou rústico.

Apesar de todas as situações que tendem a forçar o uso de uma gambiarra para a solução rápida de um problema, é preciso que nos esforcemos  ao máximo para não utilizar este expediente. Estude, pesquise e utilize as ferramentas certas ... com certeza as soluções encontradas sem gambiarras permanecem. 

  






quinta-feira, 16 de dezembro de 2010

Introdução ao C# (CSharp)




Com esse artigo inicio uma série sobre esta linguagem de programação.
C# (pronuncia-se "cê chárp" em português ou "cí charp" em inglês), é uma linguagem de programação orientada a objetos, fortemente tipada, desenvolvida pela Microsoft como parte da plataforma .NET. A sua sintaxe orientada a objetos foi baseada no C++ mas inclui muitas influências de outras linguagens de programação, como Object Pascal e Java.

A criação da linguagem, embora tenha sido feita por vários programadores, é atribuída principalmente a Anders Hejlsberg, hoje um Distinguished Engineer na Microsoft. Ele fora o arquiteto de alguns compiladores da Borland, e entre suas criações mais conhecidas estão o Turbo Pascal e o Delphi.


Características

O C# é, de certa forma, a linguagem de programação que mais diretamente reflete a plataforma .NET sobre a qual todos os programas .NET executam. C# está de tal forma ligado a esta plataforma que não existe o conceito de código não-gerenciado (unmanaged code) em C#. Suas estruturas de dados primitivas são objetos que correspondem a tipos em .NET. A desalocação automática de memória por garbage colletor além de várias de suas abstrações tais como classes, interfaces, delegados e exceções são nada mais que a exposição explicita recursos do ambiente .NET.

Quando comparada com C e C++, a linguagem é restrita e melhorada de várias formas incluindo:

* Ponteiros e aritmética sem checagem só podem ser utilizados em uma modalidade especial chamada modo inseguro (unsafe mode). Normalmente os acessos a objetos são realizados através de referências seguras, as quais não podem ser invalidadas e normalmente as operações aritméticas são checadas contra sobrecarga (overflow).

* Objetos não são liberados explicitamente, mas através de um processo de coleta de lixo (garbage collector) quando não há referências aos mesmos, previnindo assim referências inválidas.

* Destrutores não existem. O equivalente mais próximo é a interface Disposable, que juntamente com a construção using block permitem que recursos alocados por um objeto sejam liberados prontamente. Também existem finalizadores, mas como em Java sua execução não é imediata.

* Como no Java, não é permitida herança múltipla, mas uma classe pode implementar várias interfaces abstratas. O objetivo principal é simplificar a implementação do ambiente de execução.

* C# é mais seguro com tipos que C++. As únicas conversões implícitas por default são conversões seguras, tais como ampliação de inteiros e conversões de um tipo derivado para um tipo base. Não existem conversões implícitas entre inteiros e variáveis lógicas ou enumerações. Não existem ponteiros nulos (void pointers) (apesar de referências para Object serem parecidas). E qualquer conversão implícita definida pelo usuário deve ser marcada explicitamente, diferentemente dos construtores de cópia de C++.

* A sintaxe para a declaração de vetores é diferente ("int[] a = new int[5]" ao invés de "int a[5]").

* Membros de enumeração são colocados em seu próprio espaço de nomes (namespace)

* C# não possui modelos (templates), mas C# 2.0 possui genéricos (generics).

* Propriedades estão disponíveis, as quais permitem que métodos sejam chamados com a mesma sintaxe de acesso a membros de dados.

* Recursos de reflexão completos estão disponíveis

C# Versus Java 

Apesar de C# ser freqüentemente tido como similar a Java, existem uma série de diferenças importantes, tais como:

* Java não implementa propriedades nem sobrecarga de operadores.

* Java não implementa um modo inseguro que permita a manipulação de ponteiros e aritmética sem checagem.

* Java possui exceções checadas, enquanto exceções em C# são não checadas como em C++.

* Java não implementa o goto como estrutura de controle, mas C# sim.

* Java utiliza-se de comentários Javadoc para gerar documentação automática a partir de arquivos fonte. C# utiliza comentários baseados em XML para este propósito.

* C# suporta indexadores e delegados.

Bibliotecas de códigos

Ao contrário das outras linguagens de programação, nenhuma implementação de C# atualmente inclui qualquer conjunto de bibliotecas de classes ou funções. Ao invés disso, C# está muito vinculada ao framework .Net, do qual C# obtém suas classes ou funções de execução. O código é organizado em um conjunto de namespaces que agrupam as classes com funções similares. Por exemplo: System.Drawing para gráficos, System.Collections para estrutura de dados e System.Windows.Forms para o sistema Windows Form.

Um nível de organização superior é fornecido pelo conceito de montador (assembly). Um montador pode ser um simples arquivo ou multiplos arquivos ligados juntos (como em al.exe) que podem conter muitos namespaces ou objetos. Programas que precisam de classes para realizar uma função em particular podem se referenciar a montadores como System.Drawing.dll e System.Windows.Forms.dll assim como a biblioteca core (conhecida como mscorlib.dll na implementação da Microsoft).


Para quem desejar saber mais sobre o assunto seguem alguns links que entre outros serviram de base para este post