Aprendendo a pensar e programar de forma abstrata

Embora as linguagens OO estimulem o encapsulamento, elas não o garantem. E fácil construir código dependente e frágil. O encapsulamento eficaz vem apenas com um projeto cuidadoso, abstração e experiência. Um dos primeiros passos para o encapsulamento eficaz é aprender como abstrair software e os conceitos subjacentes eficientemente.

O que é abstração?

Abstração é o processo de simplificar um problema difícil. Quando começa a resolver um problema, você não se preocupa com cada detalhe. Em vez disso, você o simplifica, tratando apenas dos detalhes pertinentes a uma solução.

Imagine que você tenha de escrever um simulador de fluxo de tráfego. E possível que você modele classes para sinais de trânsito, veículos, condições da pista, auto-estradas, ruas de mão dupla, ruas de mão única, condições climáticas etc. Cada um desses elementos afetaria o fluxo do tráfego. Entretanto, você não modelaria insetos e pássaros no sistema, mesmo que eles possam aparecer em uma via real. Além disso, você omitiría tipos específicos de carros. Você simplifica o mundo real e inclui apenas as partes que realmente afetam a simulação. Um carro é muito importante para a simulação, mas o fato de ser um Cadillac ou fazer com que o carro controle seu nível de combustível é supérfluo para a simulação de tráfego.

A abstração tem duas vantagens. Primeiro, ela permite que você resolva um problema facilmente. Mais importante, a abstração o ajuda a obter reutilização. Muitas vezes, os componentes de software são demasiadamente especializados. Essa especialização, combinada com uma interdependência desnecessária entre os componentes, toma difícil reutilizar um código existente em outra parte. Quando possível, você deve se esforçar por criar objetos que possam resolver um domínio inteiro de problemas. A abstração permite que você resolva um problema uma vez e depois use essa solução por todo o domínio desse problema.

Embora seja desejável escrever código abstrato e evitar uma especialização demasiada, é duro escrever código abstrato, especialmente quando você começa a praticar a POO.

Existe uma linha tênue entre muita e pouca especialização. A linha pode ser discernida apenas com a experiência. Entretanto, você precisa saber desse poderoso conceito.

Segundo, considere um estabelecimento de sanduíches do tipo fast food. Quando um novo sanduíche fica pronto, ele é colocado atrás do último sanduíche que está no escaninho; veja a Figura 2.3. Desse modo, o primeiro sanduíche retirado também é o mais antigo. FIFO é o esquema do restaurante.

Figura 2.3 Sanduíches ficando prontos.



Embora cada um desses exemplos seja específico, você pode encontrar uma descrição genérica que funcione em cada situação. Em outras palavras, você pode chegar a uma abstração.

Cada domínio é um exemplo de fila do tipo primeiro a entrar, primeiro a sair. Não importa quais tipos de elementos apareçam na fila. O que importa é que os elementos entram no final da fila e saem dela a partir da frente, conforme ilustrado na Figura 2.4.

Figura 2.4 Uma abstração de ambos os domínios.


Abstraindo os domínios, você pode criar uma fila uma vez e reutilizá-la em qualquer problema que modele um domínio onde exista uma ordenação FIFO de elementos.

Abstração eficaz

Neste ponto, você pode formular algumas regras para a abstração eficaz:

    • Trate do caso geral e não do caso específico. 

    • Ao confrontar vários problemas diferentes, procure o que for comum a todos. Tente ver um conceito     e não um caso específico. 

    • Não se esqueça de que você tem um problema a resolver. A abstração é valiosa, mas não descuide         do problema na esperança de escrever código abstrato. 

    • A abstração pode não estar prontamente aparente. A abstração pode não saltar à sua frente na                 primeira, segunda ou terceira vez que você resolver um problema que está sujeito a ser abstraído. 

    • Prepare-se para a falha. É quase impossível escrever uma abstração que funcione em todas as                 situações. Você verá por que, posteriormente ainda hoje.

Não caia na paralisia da abstração. Resolva os problemas que você encontrar primeiro. Veja a abstração como um bônus e não como objetivo final. Cason contrário, você vai se deparar com a possibilidade de prazos finais perdidos e abstração incorreta. Existem ocasiões para abstrair e ocasiões que a abstração não é apropriada.

Uma boa regra geral é abstrair algo que você tiver implementado três vezes de maneira análoga. À medida que você vai ganhar experiência, aprenderá escolher a abstração mais rapidamente.

Nem sempre você pode reconhecer oportunidades para uma abstração. Talves você tenha que resolver um problema várias vezes, antes que uma abstração se torne aparente. Às vezes, diferentes situações ajudam a encontrar uma abstração eficaz e, mesmo então, a abstração pode precisar de alguma conversão. A abstração pode demorar a amadurecer.

A abstração pode tomar um componente encapsulado mais reutilizável, pois ele está personalizado para um domínio de problemas e não para um uso específico. Entretanto, há mais coisas importantes quanto ao encapsulamento do que a simples reutilização de componentes. O encapsulamento também é importante por ocultar os detalhes internos. O tipo abstrato de dados é um bom lugar para ver em seguida, na busca do encapsulamento eficaz. 

ATIVIDADE DE FIXAÇÃO


Comentários

Postagens mais visitadas deste blog

Conceitos de Linguagens de Programação e POO

Comparação entre programação estruturada e a POO

Vantagens e desvantagens da linguagem Java