sábado, 24 de agosto de 2013

Lógica Orientada a Objetos e POO

Introdução

Saudações companheiros do mundo da tecnologia.  Como comentado no post anterior, irei falar hoje um pouco sobre lógica orientada a objetos. O tema refere-se à técnica de programação mais difundida atualmente nos modernos processos de desenvolvimento de software pois oferece inúmeras vantagens nos quesitos tempo e reutilização de código ao passo que possibilita aos desenvolvedores construir seus módulos de aplicação de uma forma genérica para reutilização em tantos projetos quanto possíveis. As principais vantagens de aplicar orientação a objetos são:

  • Reaproveitamento de código: Classes criadas para uma aplicação podem ser reaproveitadas.
  • Escalabilidade dos Sistemas: Devido os objetos possuírem certa independência é possível aplicar melhorias e novas funcionalidades no sistema sem impactar a aplicação na sua totalidade.
  • Mantenabilidade: A manutenção também fica mais eficiente uma vez que quaisquer mudanças são efetuadas em qualquer módulo do sistema mas de forma isolada evitando assim alterações indevidas em outros módulos.
Classes de Objetos

Em OO (Orientação a Objetos) tudo no universo do sistema é objeto e como tal possui suas características particulares. A forma de fazer distinção entre objetos para alcançar funcionalidades diferentes, de acordo com a especificidade de cada qual, é através das “Classes”. Com elas criamos objetos novos, pois todas as classes são definições de objetos com diferentes características. A estas características particulares, que tornam os objetos distintos entre si, chamamos de “atributos e métodos” da classe.

Por tanto podemos explicar uma Classe como: “Uma definição conceitual de um objeto do mundo real cujo estado e particularidades do objeto são representados por seus atributos e métodos.”

Atributos e Métodos

Os atributos de uma classe são as características que lhes confere especificidade diante do contexto da aplicação. Como por exemplo as características de um animal tais como: quantidade de patas, tipo de movimentação (bípede ou quadrúpede), gênero, tipo de habitat e etc.

Métodos são todas as ações que um objeto pode realizar. A única forma de solicitar uma ação de um objeto é através de chamadas aos métodos desse objeto. É através dessas chamadas que os objetos “conversam” e trocam mensagens entre si dentro da aplicação. A título de exemplo imagine um objeto da classe Cachorro, exemplos de métodos seriam “Latir”, “Correr”, “Morder”, “Pular”. Da mesma forma podemos imaginar métodos para uma classe do tipo Conta Corrente que teria ações como “Depositar”,”Sacar” e “Transferir”.

Veja abaixo a representação do que seria uma classe do tipo ContaCorrente no padrão UML:




Prometo futuramente escrever um post sobre UML, clique aqui para acessar a definição para o tema na Wikipédia.

Composição e Agregação

Existem tipos de relações que podem ser estabelecidas entre classes de objetos de forma que estas mesmas cooperem e trabalhem juntas para que representem corretamente aquilo que se propõe. Estes relacionamentos são basicamente de dois tipos: Agregação e Composição.

No relacionamento do tipo agregação as duas classes envolvidas, apesar de estabelecerem uma relação, ambas podem existir independentemente do relacionamento uma vez que não foram criadas em função disto, como por exemplo, imagine uma classe “Pessoa” e uma classe “Endereço”, existe uma relação de agregação pois a classe Pessoa com certeza agrega um objeto da classe Endereço, tal qual a realidade onde toda pessoa possui um endereço residencial. Assim a classe Endereço não deixará de existir se a classe Pessoa deixar de existir e vice versa, pois endereço também diz respeito a classes do tipo “PessoaJuridica” e assim também a toda classe que necessite da representação de uma localidade.

Para demonstrar a relação do tipo composição podemos utilizar o exemplo citado acima criando uma classe do tipo “Rua” e esta mesma possui os atributos nome, bairro, e cidade. Neste exemplo podemos perceber que a classe Rua foi criada em função da classe Endereço e que a mesma ajuda a compor uma localidade juntamente com os atributos de numero e estado. A este tipo de relacionamento onde uma classe existe em função da outra chamamos de Composição.

Subclasses e Superclasses

Uma das características mais interessantes do paradigma da orientação a objetos é trabalhar com herança de objetos. Mas o que exatamente seria herança de objetos, e o que tem a ver com subclasses e superclasses? Calma, eu explico... Já mencionamos anteriormente que em OO tudo é objeto, pois bem,  uma das formas que os objetos se relacionam é através de herança. Neste tipo de relacionamento temos uma classe de objeto genérica que incorpora todas as característica de um grupo mais amplo onde cada um estende as características da classe genérica. Estes objetos são subclasses e a classe mais genérica é a superclasse em uma relação de pai e filho. Cada subclasse pode se especializar e oferecer, além dos recursos disponíveis pela superclasse, também métodos e atributos exclusivos. A principal vantagem de se trabalhar dessa forma é a manutenção do código da aplicação pois se eventualmente precisarmos implementar uma nova funcionalidade para determinado grupo de classes, o mesmo pode ser feito na classe mais genérica e através da herança a nova função é estendida para todas a subclasses. Abaixo um diagrama para ilustrar melhor o que seria a relação de herança através de um exemplo simples:





No exemplo acima podemos observar a classe mais genérica “Animal”, ela é a superclasse, todas as classes estendem a classe animal porque de fato todo mamífero ou réptil é um animal, e como tal, possuem os métodos Comer() e Domir(). Na mesma linha de raciocínio, tanto o gato como o cão é um mamífero, no entanto são classes especialistas onde o gato possui o método exclusivo Miar() e o cão possui o método exclusivo Latir() e mesmo assim ambos possuem o método amamentar pois herdam da classe Mamífero.

Encapsulamento

Trata-se da característica das classes de proteger seus atributos e métodos de alterações indevidas, o método de encapsular diz respeito a tornar alguns atributos e métodos acessíveis apenas à própria classe ocultando da aplicação geral os detalhes da implementação de alguns métodos. Nesse contexto encontramos o conceito de interface do objeto, que é exatamente os atributos e métodos visíveis externamente e que oferecem suas funcionalidades de forma transparente, ou seja, sem demonstrar como é feito cada ação mas tão somente entregando o método que realiza a ação.

Polimorfismo

É a característica que atribuímos a alguns métodos para que possam se comportar de acordo com a chamada realizada. O próprio nome traduzido ao pé da letra significa “várias formas”. E é isso o que implementamos ao aplicar polimorfismo. Todas as classes podem possuir métodos de nomes iguais mas com parâmetros diferentes. E o que irá definir qual método será executa no momento da chamada? Será executado o método que recebe os parâmetros fornecidos. A título de exemplo podemos criar uma classe de nome “Produto” que possui dois métodos descritos da seguinte forma: aplicarDesconto() e aplicarDesconto(float valor). O primeiro método aplica o desconto com um valor padrão que digamos que seja de 10%, já o segundo método aplica o desconto que é fornecido nos parâmetros da chamada ao método. Assim se quisermos aplicar o desconto padrão basta chamar o método sem passar nenhum parâmetro, da mesma forma para específica um valor para o desconto, o mesmo deve ser passado no parâmetro no formato: aplicarDesconto(13).

Outro exemplo de polimorfismo está ligado à herança pois é possível implementar uma lógica diferente para métodos herdados, realizando assim o que chamamos de sobrescrita de método. Para exemplificar podemos continuar a partir do ultimo exemplo da classe Produto, podemos criar uma classe que estende a classe Produto e que possui uma implementação diferente para o método aplicarDesconto(), na linguagem de programação Java para sobrescrever um método é necessário que o método que sobrescreve possua exatamente a mesma assinatura do método que está sendo sobreescrito, ou seja, mesmos parâmetros,mesmo retorno, lógica diferente. Caso os parâmetros do método sejam alterados teremos a sobre carga do método, o próprio ato de criar dois métodos de nomes iguais mas parâmetros diferentes, chama-se de sobrecarga de método.

Segue abaixo um exemplo onde implemento o conceito em Java:

public class SuperClasse {
        public int somar(){
                return 1+2;
        }
        public int somar(int x, int y){
                return x+y;
        }
}

public class SubClasse extends SuperClasse{
        public int somar(){
                return 2+2;
        }
}
public class App {
      public static void main(String[] args){
            SubClasse a = new SubClasse();
            System.out.println(a.somar());
            System.out.println(a.somar(2,3));
      }
}

No exemplo acima, em SuperClasse, realizamos a sobrecarga do método somar(), exemplo de polimorfismo na própria classe. Em seguinda em SubClasse o método somar() é sobreescrito, o que o faz comportar-se diferente na classe especializada, e como a classe estende da SuperClasse, possui ainda o método somar(int x, int y) que recebe dois parâmetros.

Interfaces

Interfaces são modelos de classes que existem apenas para definir métodos e atributos obrigatórios a determinadas classes, estes atributos não possuem corpo, apenas o nome e o tipo de retorno. Interfaces nunca jamais serão instanciadas por objetos.Quando se cria uma interface para uma classe, a classe que implementa aquela interface obrigatoriamente deve implementar os métodos definidos na interface.

Classes Abstratas

São classes que existem apenas para criar herança. A principal diferença das classes abstratas para interfaces está no fato de que as primeiras podem implementar alguns ou todos os métodos da classe. Podem ter também apenas o que chamamos de métodos abstratos, que são métodos definidos apenas para que as classes que herdam dela implementem o método.

As classes abstratas jamais serão instanciadas porque simplesmente não faz o menor sentido instanciar uma classe dessa natureza. Como no exemplo do diagrama no item Composição e Agregação, não faz sentido instanciar um objeto do tipo Animal, pois ele existe apenas para que, no nível hierárquico transfira atributos e métodos para as demais classes através da herança.

Finalizando

Bem, neste post vimos os principais conceitos que permeam o paradigma de OO, expliquei de forma superficial a idéia básica dos conceitos inerentes, espero que este artigo possa contribuir como ponto de partida para mais estudos e aprofundamentos. São exemplos de linguagens orientadas a objetos: Java, C#, PHP e C++. São quatro das linguagens mais conhecidas do mercado, e vale a pena se aprofundar em qualquer uma delas.

O meu muito obrigado e gostaria de deixar minha indicação de um curso muito bom de orientação a objetos disponibilizado pelo site treinaweb, não um curso gratuito mas possui um ótimo material, suporte a dúvidas e um belo certificado ao final do curso. Muito Obrigado fiquem com Deus e até a próxima.

Nenhum comentário:

Postar um comentário