Porque Programação Orientada a Objetos?

A forma de escrever código vem evoluindo há décadas para resolver muitos dos problemas apresentados no capítulo anterior. Vários paradigmas de programação têm sido desenvolvidos para melhorar a forma como escrevemos código, visando principalmente tornar o código mais claro, organizado, fácil de manter e menos suscetível a erros (bugs).

Até a década de 60 era muito comum o desenvolvimento de programas utilizando o paradigma de Programação não Estruturada, que resultava em código difícil de entender e manter. Por estes motivos, um código escrito usando tal paradigma é chamado pejorativamente de código espaguete, por ser confuso e não ter uma sequência clara. Muitos dos códigos escrito seguindo este paradigma utilizavam linguagens como Assembly que, apesar de serem legíveis para humanos, não são tão legíveis quanto as linguagens atuais.

chaos of cables.jpg
Figure 1. Como é organizado um código espaguete 😳. (Fonte: 123rf.com)
assembly.gif
Figure 2. Exemplo de código em linguagem Assembly

Outras formas de desenvolver programas foram então surgindo. Uma evolução natural da Programação não Estruturada foi a Programação Estruturada. Este foi provavelmente o primeiro paradigma de programação que você aprendeu em lógica de programação. Um código estruturado permite visualizar mais facilmente o fluxo lógico de execução de um programa. Com isto, é possível facilmente criar algoritmos visualmente por meio de fluxogramas ou blocos.

fluxograma.png
Figure 3. Como um algoritmo estruturado pode ser representado em um fluxograma.
O paradigma estruturado é também definido como "a atitude de escrever código com a intenção de se comunicar com humanos e não com máquinas" [Structured]. Ou seja, um dos grandes objetivos de um código é que ele seja legível para outros programadores.

Apesar do paradigma estruturado ter tornado a programação de computadores bem mais simples e o código mais claro, ela ainda peca em muitos pontos como:

  • shapes.jpg divisão do problema: um problema muitas vezes pode ser dividido em várias partes para tornar mais fácil sua resolução. A divisão de tais partes de modo que elas trabalhem em conjunto posteriormente deve ser feita de forma adequada.

  • problem solution.jpg representação da solução de um problema: uma dos grandes desafios em programação é entender o que um determinado código faz, principalmente se ele foi escrito por outra pessoa. A representação de um código de uma forma que seja próxima do problema que ele resolve torna mais fácil identificar se ele faz o que é esperado; reinventing wheel.jpg

  • reutilização de código, para:

    • evitar ter que ficar reinventando a roda;

    • evitar re-escrever código que você já fez (princípio DRY: Don’t Repeat Yourself = Não Repita Você mesmo) e avitando a famigerada "Programação Copia-e-Cola" 😩 copy paste keyboard.jpg.

  • permitir proteger tanto dados quanto determinadas partes do código de serem usados de maneira indevida, o que poderia gerar bugs;

  • etc.

Um dos problemas da alteração indevida de dados surge quando são utilizadas variáveis globais, como no caso do pseudo código apresentado abaixo. O objetivo do algoritmo é solicitar números ao usuário até que ele digite zero para terminar. A cada número digitado o programa deve exibir a soma de todos os números digitados até então. Tente identificar o que está errado com este código.

Algoritmo incorreto para somar números.
total = 0

funcao soma_numeros(){
    faça {
        imprime("Digite um número: ");
        leia(numero);
        total = total + numero;
        mostra_subtotal();
    } enquanto (numero != 0);
}

funcao mostra_subtotal() {
    imprime("O total calculado até agora é de ", total);
    total = 0;
}

A Programação Procedural permite resolver alguns destes problemas (como o apresentado no algoritmo acima), mas nem sempre é simples, efetivo e adaptável a diferentes necessidades.

Programação Copia e Cola e POG

A Programação Copia e Cola apresentada anteriormente é um dos artifícios que programadores usam para resolver muitos problemas. Mas a mundialmente conhecida Programação Orientada a Gambiarras (POG) trouxe avançaos significativos na área.

oop to the rescue.png Assim, surgiu a Programação Orientada a Objetos (POO). Mas antes de explicar como a POO funciona e como ela resolve muitos dos problemas apresentados, vamos olhar o mundo ao nosso redor. Nós estamos cercados de objetos para todos os lados, como prédios, carros, celulares, TVs e livros. Todos estes objetos têm suas características e funcionalidades, como exemplificado na tabela a seguir:

Table 1. Características e funcionalidades de objetos comuns
Objeto Características Funcionalidades

Carro

Cor: Azul, Ano Fabricação: 2012, Revestimento dos Bancos: couro

Acelerar, Frenar, Limpar parabrisas, Acender faróis

TV

Tamanho: 42", Tela: LCD, Classificação Energética: A

Ligar/Desligar, Trocar canais, Acionar Timer, Exibir guia de programação

As características de um objeto são qualidades (adjetivos) e as funcionalidades são ações (verbos), assim é fácil distinguí-las.

Como atualmente é possível criar programas para controlar objetos como carros, TVs, relógios, balanças, porteiros eletrônicos, lâmpadas, portas e muito mais, a POO aproxima a representação de tais objetos em um programa com os mesmo objetos no mundo real.

shopping cart.jpg Mas não se assuste, POO não pode ser usada apenas para tarefas complexas como programação de carros inteligentes. Vamos usar um exemplo mais comum: as lojas virtuais na Internet. Tais lojas possuem sites, que nada mais são do que aplicações (programas) para a Internet. As páginas que permitem busca e exibição de produtos nestes sites são programas normalmente desenvolvidos utilizando-se o pagadigma de orientação a objetos. Para produtos serem exibidos no site, eles precisam ser representados no código escrito pelo programador. Tais produtos são objetos que possuem suas características e funcionalidades reais que devem ser representadas ao desenvolver uma loja virtual.

Na POO, objetos podem ser pessoas, animais e qualquer coisa que precise ser representada para resolver um problema. Por exemplo, na loja virtual, para realização de uma compra, é preciso identificar o cliente. Este é uma pessoa que precisa ter algumas características registradas como nome, sexo, data de nascimento, email e endereço. As funcionalidades desta pessoa podem ser alterar senha e adicionar endereço.

Referências

  • [Spaguetti] Conway, Richard (1978). A primer on disciplined programming using PL/I, PL/CS, and PL/CT. Winthrop Publishers. ISBN 0-87626-712-6

  • [Structured] Cobb, Gary W. (1978). "A measurement of structure for unstructured programming languages". ACM SIGSOFT Software Engineering Notes. 3 (5): 140–147. ISSN 0163-5948. doi:10.1145/953579.811114.

  • [PP] Hunt, Andrew, and David Thomas. O Programador Pragmático: de aprendiz a mestre. Bookman Editora, 2009.

results matching ""

    No results matching ""