# Introdução à programação/Orientação a objetos

A Orientação a Objeto é um paradigma de Análise orientada ao objeto, Projeto orientado ao objeto e Linguagem de programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas objetos.
Em alguns contextos, prefere-se usar Modelagem de dados orientada ao objeto, em vez de Projeto orientado ao objeto.
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.
Hoje existem duas vertentes no projeto de sistemas orientados a objetos. O projeto formal, normalmente utilizando técnicas como a notação UML e processos de desenvolvimento como o RUP; e a programação extrema, que utiliza pouca documentação, programação em pares e testes unitários.
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, Modula, Eiffel, Perl, Python, Ruby, PHP, C++, Java, D e Vala são as linguagens de programação mais importantes com suporte a orientação a objetos.

## Conceitos

* Classe 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:
* 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:
Objeto é portanto uma discriminação da classe, sendo a classe uma generalização de um conjunto de objetos idênticos ou com a mesma base.
* Mensagem é uma chamada a um objeto para invocar um de seus métodos, ativando um comportamento descrito por sua classe.
* Herança é o mecanismo pelo qual uma classe (subclasse) pode estender outra classe (superclasse), aproveitando seus comportamentos (métodos) e estados possíveis (atributos). Há herança múltipla quando uma subclasse possui mais de uma superclasse. Essa relação é normalmente chamada de relação "é um". Um exemplo de herança: Mamífero é superclasse 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:
* Abstração é a habilidade de concentrar-se 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 permite que uma referência de um tipo de uma superclasse tenha seu comportamento alterado de acordo com a instância da classe filha a ela associada. O polimorfismo permite a criação de superclasses abstratas, ou seja, com métodos definidos (declarados) e não implementados, onde a implementação ocorre somente nas subclasses não abstratas.

## Ver também

* Livro Programação orientada a objetos
* POO: o que é programação orientada a objetos?, por João Henrique