Desenvolvimento - C#

C# - Desmistificando as Classes

Entenda o conceito de classes através da linguagem C#.

por Caio Azevedo



Desmistificando as Classes A Linguagem C# é totalmente baseada no modelo de programação orientada à objetos, sendo assim, profundos conhecimentos em alguns de seus elementos principais são de fundamental importância para que possamos extrair o máximo do modelo/linguagem, sobretudo aqueles desenvolvedores acostumados com outros modelos tais quais, programação estruturada e orientada à eventos. Dentre esses elementos temos as Classes que podemos classificar como o objeto fundamental da OOP [Object-Oriented Programming], uma vez que é impossível obtermos um programa em C# (ou em qualquer outra linguagem OO) sem que tenhamos pelo menos uma classe.

Como tantos outros conceitos na informática, as classes foram inspiradas no “mundo real” e podemos associá-las ao ato de denominar uma entidade que compartilha alguns comportamentos e que possuem um conjunto de propriedades comuns. Fazendo um paralelo com nossa gramática, seria como os substantivos em seu conceito mais primitivo [a palavra que designa seres em geral], onde, por exemplo, usamos o substantivo COMPUTADOR, quando queremos referenciar um objeto formado por monitor, teclado, processador [propriedades], capaz de ligar, desligar, instalar softwares, compilar programas, acessar a internet, manipular documentos [comportamento], e aqui está a grande sacada dos substantivos, sua capacidade de facilitar a comunicação entres as pessoas, ao resumir numa única palavra um conjunto de características e ações que constituem o ser ou objeto.

Bom, mas parodiando um amigo meu, fã da série MATRIX, “voltando ao mundo virtual”, as linguagens orientadas a objetos baseiam-se no mesmo princípio dos substantivos, utilizando as classes como seu elemento fundamental, afinal, são nelas que estão contidos dados e funcionalidades que compõem qualquer programa de computador, independentes de linguagem, modelo de programação e plataforma. Vale ressaltar que as classes não estão restritas a objetos concretos [computador, carro, pessoa], podemos utilizá-las para implementar conceitos abstratos tais como o Tempo.

Finalmente definiríamos uma classe, como a entidade capaz de encapsular dados, sob a forma de campos, e funcionalidades, os métodos, que manipulam esses dados, disponibilizando sua estrutura para outras entidades que a utilizam para realizar uma ou mais tarefas que um assembly C# se propõe.

A estrutura de uma Classe

Pois bem, e como codificar essa maravilha do mundo da OOP. A figura abaixo apresenta a estrutura de uma classe com os elementos possíveis que a mesma suporta, que quando bem utilizados, tornam suas aplicações seguras, performáticas, estáveis e legíveis, enfim, os adjetivos essenciais para uma solução de boa qualidade, capaz de tornar seu time de desenvolvimento competente. O objetivo, nesse e em próximos artigos é detalhar cada um desses elementos, com dicas e sugestões de utilização dos mesmos.


Pseudocódigo 1 – Estrutura de uma classe.

No pseudocódigo acima iniciamos com uma referencia ao namespace System, bem como a declaração do nosso namespace csharp [maiores detalhes ver artigo, Usando Namespaces Profissionalmente]. Sem dúvida uma instrução que deve chamar atenção aqui, é a ultima linha após o terminador de escopo da classe, onde temos a presença de um ponto e virgula [;], trata-se de uma herança do C++ e é facultativa no C#, particularmente acredito que pouca gente utilize essa sintaxe, salvo os herdeiros do C++, movidos ainda pela força do hábito.

Em nossa “classe” temos um conjunto de elementos que definem seu comportamento, e que são conhecidos como Class Members, e segundo a terminologia oficial da Microsoft teríamos dois grupos principais, os Data Members e os Functions Members.

Classificamos como data members, aqueles que armazenam os dados para a classe, e ai teríamos, os fields, consts e events.

Entendemos por Field [Campo], qualquer variável associada à classe cuja função é armazenar valores utilizados em suas funcionalidades. Os Fields apresentam pequenas mudanças em seu escopo e comportamento, representados em tipos específicos – Local Variables e Read-Only Fields.

As Consts [Constantes], não deixam de ser um Field, mas pela particularidade de manter seu valor invariável, merece essa denominação.

Events [Eventos], sinceramente, não entendi esse elemento classificado como data member, mas enfim, eles são responsáveis por notificar uma entidade na ocorrência de alguma ação, como por exemplo a alteração do valor de um field ou propriedade da classe – esses elementos são parecidos, mas implementados diferentemente dos eventos do Visual Basic 6.0.

Por outro lado, os function members são aqueles que provem as funcionalidades da classe, e manipulação dos dados que a constituem, para tal temos os métodos, propriedades, construtores, indexers, etc.

Os métodos são como as funções/sub do velho VB, estando no corpo de sua implementação boa parte da inteligência de nossa classe, em C# não temos construções do tipo Function e Sub, temos sim, métodos que retornam ou não valores para os clientes. Quanto à utilização podemos ter métodos instanciáveis ou estáticos.

Propriedades, aqui temos uma construção interessante, acredito que muita gente ache que as propriedades deveriam ser tratadas como Data Members, no entanto apesar de na utilização serem bem parecidas com os Fields Públicos, as properties, são uma evolução dos mesmos, inclusive sendo conhecidos como Smart Fields, e sua implementação é feita com pelo menos um dos métodos GET/SET, que como qualquer método suporta alguma inteligência no código.

Construtores e Destrutores, também são métodos, só que com uma particularidade, eles são inacessíveis [diretamente] aos clientes da classe, e são executados no momento de sua inicialização e destruição, são muito úteis e recomendados para inicializar valores de campos, bem como liberar recursos alocados [um arquivo texto, uma conexão com BD, etc], importante ressaltar que os destrutores tem sua execução associada ao Garbage Collection o que torna sua execução não deterministica.

Agora temos os Indexers, que juntamente com as properties, não fazem parte da essência da OOP, no entanto sua implementação permite que um objeto seja acessado como se fosse um Array, assim, se as propriedades são consideradas Fields inteligentes, os Indexers seriam as classes inteligentes.

Finalmente, gostaria de esclarecer o conceito daquilo que geralmente é confundido com uma classe, que são os objetos. Na verdade trata-se de elementos totalmente distintos, e ainda que relacionados, a classe é a estrutura, um esqueleto, um modelo, enquanto que um objeto representa uma classe em um dado momento de sua utilização, ou seja, o objeto é uma instancia da classe, como uma variável qualquer, aliás, costumamos dizer que em C# tudo é objeto, seja uma simples variável do tipo Int, seja um objeto mais complexo utilizado na manipulação de sockets. Por exemplo, quando nos referimos a classe programador, estamos denominando um elemento genérico [um substantivo], mas quando tratamos do objeto programador, estamos direcionando nosso foco para um elemento especifico [o substantivo precedido de um artigo o ou a], que possui três características fundamentais, Identidade [ Que distingue um objeto de todos os demais, ID = 2516484], Comportamento [ O que torna um objeto realmente útil, Codifica C#] e Estado [ Representa a situação instantânea de suas características, Está de Férias].

É isso ai pessoal, não restam dúvidas que esse assunto é muito amplo, tentarei ser o mais claro e objetivo possível, com artigos curtos e focados, onde, com exemplos e comparações tentaremos esclarecer os principais conceitos e funcionalidades de Programação Orientada à Objetos e sua implementação com o C#, que tem, é claro, suas particularidades.

Aparentemente esses conceitos podem parecer enfadonhos, mas garanto que seu entendimento representa ganhos significativos quando na implementação de seus programas tornando-o um desenvolvedor diferenciado. Como sempre estou aberto à críticas e sugestões para que a cada coluna possamos apresentar um conteúdo interessante e acima de tudo funcional para nossos leitores.

Até a próxima !!

Caio Azevêdo

Caio Azevedo

Caio Azevedo - Arquiteto de softwares, especialista em soluções corporativas nos ambientes intranet/internet. Graduado em Ciência da Computação e certificado em ferramentas de desenvolvimento microsoft para plataformas Windows e Web, e Banco de Dados - Certificações Microsoft [MCP, MCAD e MCSD .NET].