|
Por ANTONIO MENDES DA SILVA FILHO
Professor
do DIN/UEM. Doutor em Ciência da Computação
|
|
Introdução
à Programação Orientada a Objetos
Uma
das principais características do ser humano quando deparado com um
problema é buscar uma solução baseada nas soluções existentes
de problemas similares. Entretanto, quando as soluções existentes
não são suficientes, busca-se estender essas soluções a fim de
solucionar um novo problema. Adicionalmente, o ser humano tem
utilizado a abstração como forma de lidar com situações ou
problemas de natureza complexa. Note que pode haver diferentes
abstrações da mesma realidade, onde cada uma delas oferece uma visão
da realidade e serve a propósitos específicos.
Dentro
deste contexto, à medida que sistemas crescem, também cresce a
complexidade e torna-se mais difícil satisfazer a um número cada
vez maior de requisitos desses sistemas, muitas vezes conflitantes.
Atualmente, observa-se que a abordagem orientada a objetos tem se
mostrado mais adequada, comparativamente às demais, para ser
empregada no desenvolvimento de sistemas de software complexos e de
grande porte. Neste sentido, a programação orientada a objetos (POO)
tem papel fundamental. A programação orientada a objetos foi
desenvolvida devido às limitações encontradas nas abordagens
anteriores de programação. Para entender o que POO faz, é preciso
entender quais são estas limitações e como elas surgiram nas
linguagens de programação tradicionais.
Pascal,
C, Basic e Fortran são linguagens de programação procedimentais.
Isto é, cada declaração na linguagem informa que o computador
deve realizar alguma tarefa como, por exemplo, ler um dado de
entrada, adicionar uma constante, dividir por algum número e exibir
o resultado. Um programa em uma linguagem procedimental é visto
como uma lista de instruções.
Vale
ressaltar que para programas pequenos, nenhum princípio
organizacional (ou paradigma) é necessário. O programador,
simplesmente, cria uma lista de instruções e o computador as
executa. Entretanto, à medida que os programas se tornam maiores,
entender e tratar uma única lista de instruções fica mais difícil.
Poucos programadores podem compreender um programa que possua mais
de poucas centenas de instruções, a menos que o programa seja quebrado
ou dividido em unidades menores, denominadas de funções. Por esta
razão, a função foi adotada com uma forma de tornar os programas
mais compreensíveis a seus criadores, i.e. os seres humanos. Vale
salientar que o termo função
é usado tanto na linguagem de programação C++ quanto C. Em outras
linguagens, o mesmo conceito pode ser referido como uma subrotina,
um subprograma ou um procedimento. Sabe-se que um programa é
dividido em funções, e (idealmente, no mínimo) cada função tem
uma proposta claramente definida, bem como uma interface bem
definida com as outras funções do programa.
A
idéia de dividir um programa em funções pode ser adicionalmente
estendida através do agrupamento de várias funções em uma
entidade maior, denominada módulo.
Porém, o princípio é similar, ou seja, um grupo de componentes
que executa tarefas específicas. Neste sentido, tem-se que dividir
um programa em funções e módulos é um dos fundamentos da programação
estruturada. Trata-se de uma disciplina de programação que tem
sido utilizada na organização de programas. No entanto, à medida
que os programas se tornam maiores e mais complexos, até mesmo a
abordagem de programação estruturada começa a mostrar limitações.
Por exemplo, considere a situação em que muitas funções têm
acesso a um conjunto de dados. Assim, a forma em que os dados são
armazenados torna-se crítica. A organização dos dados não pode
ser modificada sem que todas as funções que têm acesso
a eles também seja modificadas. Se novos dados são
adicionados, então será necessário modificar todas as funções
que têm acesso a esses dados para que elas também possam ter
acesso aos novos dados. Tornar-se-á difícil achar tais funções e
até mesmo mais difícil modificá-las corretamente.
Tais
circunstâncias exigem uma forma de restringir o acesso ao dado,
esconder ele de todas exceto algumas poucas funções críticas.
Isto dará proteção aos dados, simplificará a manutenção bem
como implicará em outros benefícios. Neste sentido, considera-se
importante a introdução de programação orientada a objetos (POO).
A idéia por trás das linguagens de programação orientadas a
objetos, ou linguagens OO, é combinar em uma única entidade tanto
os dados quanto as funções que operam sobre estes dados. Tal
entidade é denominada objeto.
As funções de um objeto, chamadas funções membro em C++,
tipicamente, oferecem uma única forma de acesso a seus dados.
Assim,
caso torne-se necessário ler dados em um objeto, então basta
chamar a função membro desse objeto. Ela lerá os dados e retornará
o valor a quem invocou a função. Perceba que os dados não podem
ser acessados diretamente. Os dados são ocultados. Assim, os dados
estão seguros quanto a alteração acidental. Dados e funções são
ditos ser encapsulados em
uma única entidade, denominada objeto.
A encapsulação de dados e ocultação de dados são aspectos
importantes na descrição de linguagens orientada a objetos. Além
disso, se o programador precisar modificar o(s) dado(s) de um
objeto, ele terá de saber exatamente quais funções interage com
aquele objeto (i.e., funções membro). Outras funções não podem
ter acesso ao(s) dado(s). Como resultado, obtém-se simplificação
na escrita, bem como na depuração e manutenção do programa.
Neste contexto, um programa C++, tipicamente, consiste de muitos
objetos, os quais se comunicam entre si através da chamada de funções
membro do(s) outro(s) objeto(s). Aqui, chamar a função membro de
um objeto é referido como enviar
uma mensagem para o objeto.
Diante
do exposto acima, é fácil perceber que a programação orientada a
objetos é uma abordagem de programação que serve de elo entre os
problemas existentes e as soluções computacionais apresentadas no
campo da programação. Cabe, entretanto, ressaltar que antes da POO
havia um obstáculo conceitual para os programadores quando eles
tentavam adaptar as entidades reais às restrições impostas pelas
linguagens e técnicas de programação tradicionais. Numa situação
real, o ser humano tende a raciocinar em termos dos objetos ou
entidades reais.
Todavia,
é importante lembrar que antes da POO, os programadores eram
ensinados a raciocinar os problemas em termos de blocos de código
ou procedimentos e da forma que esses atuavam sobre os dados.
Observe que essas duas abordagens são distintas e constituem um
problema se há necessidade de desenvolver um sistema complexo e/ou
de grande porte.
Ainda,
ao longo das últimas décadas, tem-se verificado um crescimento
tanto na complexidade quanto no tamanho dos sistemas computacionais.
Neste contexto, a POO apresenta-se como uma abordagem de programação
que permite os programadores raciocinar e solucionar problemas em
termos de objetos, os quais estão diretamente associados às
entidades ou ‘coisas’ reais. Como resultado desse mapeamento
natural, utilizando a POO, um programador pode concentrar-se nos
objetos que compõem o sistema, ao invés de tentar vislumbrar o
sistema como um conjunto de procedimentos e dados. Vale salientar
que a POO é uma forma natural e lógica pela qual os seres humanos
e, especificamente, os programadores raciocinam. Os benefícios
resultantes de empregar a POO como abordagem de programação não
se restringe a raciocinar e resolver problemas em termos de objetos
ou entidades reais, mas também a reutilização de código. Além
disso, conceitos adicionais como classes, encapsulamento,
polimorfismo e herança são introduzidos.
Além
da identificação de uma abordagem de desenvolvimento adequada à
implementação de sistemas de software, há ainda a necessidade de
selecionar uma linguagem de programação. Uma sugestão é utilizar
a linguagem C++ desenvolvida nos Laboratórios da Bell por Bjarne
Stroustrup. Outra alternativa seria a linguagem Java. Todavia, esse
artigo teve o objetivo apenas de discutir apenas questões
pertinentes ao paradigma de orientação a objetos.
|
|

|