Classes

Dando continuidade ao paradigma oriatado a objetos vamos aprofundar um pouco e ver o que vem a ser uma classe, seus filhos e que relação é mantida entre eles, vamo la.

Em orientação a objeto, uma classe abstrai um conjunto de objetos com características similares. Uma classe define o comportamento de seus objetos através de métodos e os estados possíveis destes objetos através de atributos. Em outros termos, uma classe descreve os serviços providos por seus objetos e quais informações eles podem armazenar.

Estrutura da classe

Uma classe define estado e comportamento de um Objeto geralmente implementando métodos e atributos, os atributos, também chamados de campos, indicam as possíveis informações armazenadas por um objeto de uma classe, representando o estado de cada objeto. Os métodos são procedimentos que formam os comportamentos e serviços oferecidos por objetos de uma classe.

Outros possíveis membros de uma classe são:

  • Construtores – definem o comportamento no momento da criação de um objeto de uma classe.
  • Destrutor – define o comportamento no momento da destruição do objeto de uma classe. Normalmente, como em C++, é utilizado para liberar recursos do sistema (como memória).
  • Propriedades – define o acesso a um estado do objeto.
  • Eventos – define um ponto em que o objeto pode chamar outros procedimentos de acordo com seu comportamento e estado interno.

Encapsulamento

Em linguagens orientadas a objetos, é possível encapsular o estado de um objeto. Em termos práticos, isso se realiza limitando o acesso a atributos de uma classe exclusivamente através de seus métodos. Para isso, as linguagens orientadas a objeto oferecem limitadores de acesso para cada membro de uma classe.

Tipicamente os limitadores de acesso são:

  • público (public) – o membro pode ser acessado por qualquer classe.
  • protegido (protected) – o membro pode ser acessado apenas pela própria classe e suas sub-classes (também chamadas de classes filhos ou filhas).
  • privado (private) – o membro pode ser acessado apenas pela própria classe.

Cada linguagem de programação pode possuir limitadores de acesso próprios. Por exemplo, em Java, o nível de acesso padrão de um membro permite que qualquer classe de seu pacote (package) possa ser acessado. Em C#, o limitador de acesso interno (internal) permite que o membro seja acessado por qualquer classe do Assembly (isto é, da biblioteca ou executável).

No exemplo abaixo,  a classe Pessoa permite o acesso ao atributo _nome somente através do propriedade Nome.

 public class Pessoa {
     public String Nome
     {
         get { return _nome; }
         set { _nome = value; }
     }

     private String _nome;
 }

Herança

A herança é um relacionamento pelo qual uma classe, chamada de sub-classe, herda todos comportamentos e estados possíveis de outra classe, chamada de super-classe ou classe base. É permitido que a sub-classe estenda os comportamentos e estados possíveis da super-classe (por isso este relacionamento também é chamado de extensão). Essa extensão ocorre adicionando novos membros a sub-classe, como novos métodos e atributos.

É também possível que a sub-classe altere os comportamentos e estados possíveis da super-classe. Neste caso, a sub-classe sobrescreve membros da super-classe, tipicamente métodos.

Quando uma classe herda de mais de uma super-classe, ocorre uma herança múltipla. Esta técnica é possível em C++ e em Python, mas não é possível em Java e C#, no entanto estas linguagens permitem múltipla tipagem através do uso de interfaces.

Polimorfismo

Na programação orientada a objetos, o polimorfismo permite que referências de tipos de classes mais abstratas representem o comportamento das classes concretas que referenciam. Assim, um mesmo método pode apresentar várias formas, de acordo com seu contexto. O polimorfismo é importante pois permite que a semântica de uma interface seja efetivamente separada da implementação que a representa. O termo polimorfismo é originário do grego e significa “muitas formas” (poli = muitas, morphos = formas).

Associação

Uma associação é um vínculo que permite que objetos de uma ou mais classes se relacionem. Através destes vínculos é possível que um objeto convoque comportamentos e estados de outros objetos.

As associações podem ser:

  • unárias - quando a associação ocorre entre objetos de uma mesma classe.
  • binárias - quando a associação ocorre entre dois objetos de classes distintas.
  • múltiplas - quando a associação ocorre entre mais de dois objetos.

Cada associação possui características de:

  • cardinalidade ou multiplicidade – determina quantos objetos no sistema são possíveis em cada vértice da associação.
  • navegação - se é possível para cada objeto acessar outro objeto da mesma associação.

No exemplo de associação unária acima, cada pessoa tem um único pai (cardinalidade 1) e qualquer número de filhos (cardinalidade *). De acordo com a seta de navegação, só é possível navegar para o pai de cada pessoa. Desta forma cada objeto da classe Pessoa consegue acessar seu objeto pai, mas não consegue acessar seus objetos filhos.

Agregação

Tipo de relacionamento com características todo-parte, onde existe um grau de coesão entre o todo e as partes menos intenso, podendo haver certo grau de independência entre eles.

Composição

Tipo de relacionamento com características todo-parte, onde existe um alto grau de coesão entre o todo e as partes, com total grau de dependência entre eles (todo e as partes). Desta forma, se o todo não existir, as partes também não existirão.

Um exemplo de composição é a mão:

Uma mão é composta por dedos. Os dedos compõem a mão.

Não há lógica em existir um dedo sem mão, porém pode-se ter uma mão sem um ou mais dedos

Classes abstratas e concretas

Uma classe abstrata é desenvolvida para representar entidades e conceitos abstratos. A classe abstrata é sempre uma superclasse que não possui instâncias. Ela define um modelo (template) para uma funcionalidade e fornece uma implementação incompleta – a parte genérica dessa funcionalidade – que é compartilhada por um grupo de classes derivadas. Cada uma das classes derivadas completa a funcionalidade da classe abstrata adicionando um comportamento específico.

Uma classe abstrata normalmente possui métodos abstratos. Esses métodos são implementados nas suas classes derivadas concretas com o objetivo de definir o comportamento específico. O método abstrato define apenas a assinatura do método e, portanto, não contém código.

Por outro lado, as classes concretas implementam todos os seus métodos e permitem a criação de instâncias. Uma classe concreta não possui métodos abstratos e, geralmente, quando utilizadas neste contexto, são classes derivadas de uma classe abstrata.

Paradigma Orientado a Objetos (POO)

A orientação a objetos, também conhecida como Programação Orientada a Objetos (POO) ou ainda em inglês Object-Oriented Programming (OOP) é um paradigma de análise, projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos.

Em alguns contextos, prefere-se usar modelagem orientada ao objeto, em vez de programação.

A análise e projeto orientados a objetos têm como meta identificar o melhor conjunto de objetos para descrever um sistema de software. O funcionamento deste sistema se dá através do relacionamento e troca de mensagens entre estes objetos.

Na programação orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software. Cada classe determina o comportamento (definidos nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos.

Smalltalk, Python, Ruby, C++, Object Pascal, Java e C# são exemplos de linguagens de programação orientadas a objetos.

Perl (a partir do 5), PHP (a partir do 4.0), ColdFusion, Javascript, ActionScript e VB.NET são exemplos de linguagens de programação com suporte a orientação a objetos.

 

Conceitos fundamentais

  • Classe É uma fábrica de objetos. Representa um conjunto de objetos com características afins. Uma classe define o comportamento dos objetos, através de métodos, e quais estados ele é capaz de manter, através de atributos. Exemplo de classe: Ventilador.
  • Objeto é uma instância de uma classe. Um objeto é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. Exemplo de objetos da classe Humanos: João, José, Maria.
  • Atributos são características de um objeto. Basicamente a estrutura de dados que vai representar a classe. Exemplos: Funcionário: nome, endereço,telefone, CPF, ….; Carro: nome, marca, ano, cor, …; Livro: autor, editora, ano.
  • Estado São os valores que cada atributo recebe. Exemplo: o estado do atributo cor é azul.
  • Métodos definem as habilidades dos objetos. Bidu é uma instância da classe Cachorro, portanto tem habilidade para latir, implementada através do método deUmLatido(). Um método em uma classe é apenas uma definição. A ação só ocorre quando o método é invocado através do objeto, no caso Bidu. Dentro do programa, a utilização de um método deve afetar apenas um objeto em particular; Todos os cachorros podem latir, mas você quer que apenas Bidu dê o latido. Normalmente, uma classe possui diversos métodos, que no caso da classe Cachorro poderiam ser sente(), coma() e morda().
  • Mensagem é uma chamada a um objeto para invocar um de seus métodos, ativando um comportamento descrito por sua classe. Também pode ser direcionada diretamente a uma classe (através de uma invocação a um método estático).
  • Sobrecarga é a utilização do mesmo nome para símbolos ou métodos com operações ou funcionalidades distintas. Geralmente diferencia-se os métodos pela sua assinatura. Exemplo: Um método Carro que recebe como parâmetro dois atributos (cor, placa), e outro método Carro que recebe como parâmetro (cor, placa, modelo).
  • Herança (ou generalização) é o mecanismo pelo qual uma classe (sub-classe) pode estender outra classe (super-classe), aproveitando seus comportamentos (métodos) e variáveis possíveis (atributos). Há Herança múltipla quando uma sub-classe possui mais de uma super-classe. Essa relação é normalmente chamada de relação “é um”. Um exemplo de herança: Mamífero é super-classe de Humano. Ou seja, um Humano é um mamífero.
  • Associação é o mecanismo pelo qual um objeto utiliza os recursos de outro. Pode tratar-se de uma associação simples “usa um” ou de um acoplamento “parte de”. Por exemplo: Um humano usa um telefone. A tecla “1″ é parte de um telefone.
  • Encapsulamento consiste na separação de aspectos internos e externos de um objeto. Este mecanismo é utilizado amplamente para impedir o acesso direto ao estado de um objeto (seus atributos), disponibilizando externamente apenas os métodos que alteram estes estados. Exemplo: você não precisa conhecer os detalhes dos circuitos de um telefone para utilizá-lo. A carcaça do telefone encapsula esses detalhes, provendo a você uma interface mais amigável (os botões, o monofone e os sinais de tom).
  • Abstração é a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando características menos importantes ou acidentais. Em modelagem orientada a objetos, uma classe é uma abstração de entidades existentes no domínio do sistema de software.
  • Polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma assinatura (lista de parâmetros e retorno) mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse. A decisão sobre qual o método que deve ser selecionado, de acordo com o tipo da classe derivada, é tomada em tempo de execução, através do mecanismo de ligação tardia. No caso de polimorfismo, é necessário que os métodos tenham exatamente a mesma identificação, sendo utilizado o mecanismo de redefinição de métodos. Esse mecanismo de redefinição não deve ser confundido com o mecanismo de sobrecarga de métodos.
  • Interface é um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela está comprometida a fornecer o comportamento publicado pela interface.

 

No próximo post veremos mais detalhadamente sobre classes, o que são e como são utilizadas no processo de desenvolvimento orientado a objetos.

A Linguagem C# (Parte 1)

Introdução

A linguagem C# (c sharp) foi apresentada pela primeira vez em 2000 pela microsoft durante a Developers Conference. Foi concebida e criada principalmente por Anders Hejlsberg antigo Engenheiro da Borland que trabalhou na criação do Turbo Pascal e Delphi.
C# é uma linguagem criada quase do zero, baseada no C++ e Java, contudo o C# NÃO é uma cópia do Java como muitos dizem por aí. A linguagem C# juntou todas as melhorias em termos de produtividade e grau de programação e fora concebida para ser a melhor linguagem de programação da atualidade. C# possui características únicas ausentes em linguagens como Java, podemos citar a introdução de propriedades como elementos de linguagem e métodos get e set específicos para trabalhar com propriedades.

Algumas das características da Linguagem:

  • Fortemente tipada;
  • Orientada a Objetos;
  • Sintaxe similar ao C++ e Java;
  • Independente de plataforma;
  • Possui gerenciamento automático de memória;
  • Linguagem padrão para desenvolvimento de aplicações .NET.

Atualmente a linguagem C# se encontra na versão 3.0 na qual introduziu muitos recursos novos. Vejamos algumas das características inseridas nas versões da linguagem:

C# 2.0 (2005)

  • Generics (Genéricos)
  • Anonymous Methods (Métodos Anônimos)
  • Nullable Types (Tipos Nulos)
  • Partial Class (Classe parcial)
  • Iterators

C# 3.0 (2007)

  • Lambda Expressions
  • Anonymous Types
  • Type Inference
  • Object Serialization
  • Extension Methods

O C# 3.0 diferente da versão 2.0, trouxe recursos inovadores e revolucionários que não estão presentes em nenhuma outra linguagem de programação da atualidade. Muitos destes recursos foram criticados mas o que se sabe é que quem já adorava a versão 2.0 da linguagem agora não consegue mais ficar sem usar os recursos presentes na versão 3.0, e eles são mesmo ótimos.

A anatomia de um programa básico em C#

Vejamos um exemplo de um programa em C#:

Um programa em C#

Variáveis

Variáveis em C# são declaradas da seguinte forma: <tipo> <identificador>

Onde:
<tipo> pode ser int, string, char e etc;
<identificador> é o nome que você deseja dar a variável;

Exemplo:
int contador;
string palavras;

Recomenda-se sempre inicializar as variáveis que sejam de tipos primitivos:
Exemplo:
int contador = 0;
string palavras = “”;

Obs: (“” pode ser substituido por string.empty, uma forma mais elegante de string vazia)

Escopo de Variáveis

Quando falamos de escopo nos referimos a área de atuação de um determinado objeto. No mundo da programação a coisa não é diferente e o mesmo vale para as variáveis em C#.

Em C# o escopo de um objeto é definido quando o mesmo é criado dentro de um “bloco”. Um bloco é delimitado pelos caracteres “{” e “}”. Os elementos que forem declarados dentro desse bloco farão parte desse escopo.

Em C#, as variáveis só podem ser acessadas no escopo em que foram declaradas. Isso significa que se declararmos uma variável dentro de uma função/método, esta variável será visível somente dentro da própria função. A tentativa de referenciar uma variável fora do seu escopo resultará em um erro de compilação.

Escopos podem conter outros escopos. Em outras palavras uma variável declarada num bloco A que contem um Bloco B pode ser referênciada dentro do Bloco B, porem variáveis declaradas no Bloco B não podem ser referênciadas pelo bloco A conforme mostrado abaixo:

Operadores

O C# possui diversos operadores usados para vários fins. Abaixo segue uma lista dos mais conhecidos:

Relacionais:

  • == (igualdade)
  • != (diferente)
  • > (Maior)
  • < (Menor)
  • >= (Maior ou igual)
  • <= (Menor ou igual)

Atribuição:

  • = (Atribuição)
  • += (Atribuição e Adição)
  • -= (Atribuição e Subtração)
  • ++ (Incremento)
  • – (Decremento)

Lógico

  • && (and lógico)
  • || (or lógico)

Estruturas Condicionais e de Repetição

If e Else: São estruturas usadas para testar condições e tomar decisões que afetam o fluxo da aplicação em tempo de execução. Exmeplo:
if(condicao)
{
escreva(“é verdadeiro”);
}
else
{
escreva(“é falso”);
}

Operador Ternário: Similar a esturura If/Else porem é mais resumido e mais confuso. exemplo:
variavel == 10 ? escreva(“é igual a 10″) : escreva(“não é igual a 10″)

for: estrutura condicional que permite definir uma condicao de controle e incremento. Exemplo
for(int i = 0; i < 10; i++)
{
// faça alguma coisa
}

while: estrutura condicional onde o controle de iterações deve ser feito no corpo da estrutura. Exemplo:
while(condicao)
{
// faca alguma coisa
}
foreach: permite definir uma variável que receberá uma referência a um elemento de um array. Exemplo:
int[] numeros = {1,2,3,4,5};
foreach(int numero in numeros)
{
escreva(numero);
}

Até o próximo artigo :)

Introdução a plataforma .NET

Mas afinal o que é a plataforma .NET?

Microsoft .NET é uma iniciativa da Microsoft que visa uma plataforma única para desenvolvimento e execução de sistemas e aplicações. Todo e qualquer código gerado para .NET, pode ser executado em qualquer dispositivo ou plataforma que possua um framework: a “Plataforma .NET” (.NET Framework). O programador deixa de escrever código para um sistema ou dispositivo específico, e passa a escrever para a plataforma .NET.

A plataforma .NET é executada sobre uma CLR (Common Language Runtime — Ambiente de Execução Independente de Linguagem) interagindo com uma Colecção de Bibliotecas Unificadas, que juntas são o próprio framework. Esta CLR é capaz de executar, atualmente, mais de vinte diferentes linguagens de programação, interagindo entre si como se fossem uma única linguagem.

Abaixo podemos ver alguns exemplos de linguagens suportadas pela CLR:

  • C++
  • C#
  • Visual Basic
  • Lua
  • Smalltalk
  • Phyton
  • Pearl
  • Cobol
  • Eiffel
  • Fortran
  • Java
  • Object Pascal

A plataforma .NET se baseia no conceito JIT (Just-in-Time), os programas desenvolvidos para ela são duplo-compilados, ou seja são compilados duas vezes, uma na distribuição e outra na execução.

Um programa é escrito em qualquer uma das mais de vinte linguagens de programação disponível para a plataforma, o código fonte gerado pelo programador é então compilado pela linguagem escolhida gerando um código intermediário em uma linguagem chamada MSIL (Microsoft Intermediate Language).
( fonte:wikipédia )

Por que usar a plataforma .NET?

A plataforma .NET oferece um ambiente completo para o desenvolvimento de aplicações para os mais variados tipos de dispositivos ou fins. Eis algumas das vantagens de se trabalhar com a plataforma .NET:

  • Solução única para desenvolvimento de aplicativos;
  • Suporte a várias linguagens;
  • Desenvolvimento rápido de aplicativos;
  • Independênte de Sistema Operacional;

Enfim, vimos que a plataforma .NET é um ambiente completo para desenvolvimento de aplicações coorporativas de alta performance e que tem crescido muito.

É isso ai, por enquanto é só. Assim que eu tiver mais tempo eu termino de completar o artigo com links e outras informações.

Até a próxima.