Java - 1º e 2º aulasPostada em: 03/03/2005
Por: David Ramires Nº de Visualizações: 3361.
Terminologia – Classes e Objetos.
POO permite que os dados dentro dos programas sejam organizados do mesmo modo que, por exemplo, um botânico organiza as plantas em espécies e subespécies. No palavreado de POO as plantas, carros, funcionários, produtos, livros etc, são conhecidos como classes.
Uma “classe” é um padrão descritivo tanto de estruturas de dados quanto de operações válidas com essas estruturas. Quando um dado é declarado como membro de uma classe, é chamado de “objeto” daquela classe. Apenas as rotinas que implementam as operações descritas numa classe é que podem ser executadas sobre as estruturas de dados dos objetos daquela classe.
A união explícita entre os dados e as operações válidas sobre eles tem o nome de “encapsulamento”, e é um dos princípios sobre os quais se baseia a POO. Se uma linguagem de programação não oferece completamente este recurso não podemos dizer que se presta completamente à POO.
Cada objeto tem sua própria cópia das estruturas de dados descritas em sua classe, chamadas de “atributos”. As rotinas da classe, chamadas “métodos”, são as únicas que podem ser acionadas para manipular os atributos dos objetos da classe. Quando acionamos um método de um objeto dizemos que estamos enviando uma “mensagem” ao objeto, do tipo “faça isso…” ou “faça aquilo…” etc.
Objetos são independentes entre si, mudanças em atributos de um objeto de uma classe não afetam os outros objetos desta mesma classe. Mensagens enviadas a um objeto não afetam outros objetos.
Os tipos de dados comuns nas linguagens, como inteiros, reais ou strings podem ser vistos como classes, com as operações válidas para cada um, mas a POO permite que o programador crie seus próprios tipos de dados, sua próprias classes, com total controle e oferecendo alto grau de abstração para quem for utilizá-los.
Ao contrário de tipos pré existentes, as classes podem ser usadas na definição de componentes (ou atributos) de outras classes.
Novas classes podem ser criadas a partir de classes pré existentes, sendo que uma classe assim derivada de outra, automaticamente contém tudo o que a classe original já tinha. Este mecanismo tem o nome de “herança”, outro princípio fundamental da POO.
A herança de atributos e métodos permite a reutilização de classes já prontas para a criação de novas classes em que apenas os atributos e métodos específicos precisam ser definidos. Dizemos que estamos “estendendo” uma classe quando criamos uma classe derivada dela.
Cria-se assim uma estrutura do tipo familiar, em que classes derivadas de outra são chamadas classes filhas desta, e esta é uma classe pai de suas derivadas. Classes filhas podem ser por sua vez pais de outras classes e assim por diante.
Por exemplo, num sistema de uma editora uma classe “Publicação” pode ter atributos como “qtde-pags”, “cod-barras” etc, e métodos como “Retirar”, “Devolver” e “Armazenar”. Sua classe filha “Revista” pode ter como atributos “nome”, “volume”, “número”, uma lista de “artigos”. Pode ter um só método “Assinar”. Sua outra classe derivada “Livro” pode ter os atributos “título”, “tipo-capa”, lista de “autores”, “ISBN” etc.
Como vemos, ambas as classes filhas herdam o método “Armazenar”, mas a maneira como isso é feito difere de uma para outra. Enquanto livros são apenas colocados numa estante, revistas são colocadas numa pasta por volume, por exemplo. Isso nos mostra de um mesmo método na essência pode requerer formas diferentes em classes que o herdam. Pode ser necessário que uma classe filha dê nova forma a um método herdado.
POO nos oferece a possibilidade de nos referirmos a objetos de classes filhas com referências à classe pai, por exemplo, a um livro ou revista como sendo uma publicação. Sendo assim, apenas no momento da execução do programa o sistema saberá qual versão do método “Armazenar” ele deve usar, uma vez o que o objeto, que é um livro ou revista, está sendo referenciado como publicação, de modo mais geral.
Este processo de determinação da versão (ou forma) do método a ser acionado ser feita apenas na execução do programa tem o nome de “polimorfismo”, outro princípio fundamental da POO.
A ligação entre rotina na versão correta do método e a chamada da rotina para um objeto é feita durante a execução (late-binding), e isto caracteriza o polimorfismo. Quando a versão certa do método já é conhecida a ligação é feita na compilação (early-binding) e não na execução.
POO pode mesmo gerar programas mais rapidamente e de modo mais confiável? A resposta é sim! Programas orientados a objetos são feitos à partir de componentes já prontos, classes já prontas. Quando uma classe é compilada e testada, ela está pronta para utilização, e reutilização, como blocos que formarão os programas. Se novos atributos ou métodos são necessários, uma classe derivada é criada, sem a necessidade de verificação da parte herdada e que já estava pronta. Os erros são maios fáceis de localizar e resolver.
Quando um conjunto de classes é formado por um grupo de programadores, podem ser agrupadas em “pacotes” que são importados em novos programas que assim precisam que apenas sua parte específica seja codificada.
Outro ponto importante é a abstração conseguida, o programador que fará uso de classes já prontas não precisa saber como elas foram implementadas, apenas como usá-las em seus programas.