Artigo original: What is Abstraction in Programming – And Why is it Useful?

Você sabia que a abstração é um dos conceitos mais importantes para qualquer engenheiro de software saber?

Isso mesmo!

Sem o uso de abstração ao desenvolver novas tecnologias e conceitos, nunca teríamos sido capazes de inventar a maioria dos softwares ou mesmo a maioria das coisas.

Por isso, entender esse conceito é realmente importante para o desenvolvimento de software.

O que é abstração na programação?

Você já usou a abstração de muitas formas, mas talvez não a conhecesse por esse termo.

O pensamento abstrato é uma das coisas que os humanos fazem em muitas áreas, como:

  • Filosofia
  • Arte
  • Matemática
  • Ciência da Computação
  • e muitas outras…

Mas o que ela é realmente? Você vai aprender tudo sobre ela neste artigo.

O que vamos abordar:

  1. Analogia da abstração
  2. Exemplo de abstração em Python
  3. Exemplo de abstração em Eletrônica Geral
  4. Exemplo de abstração em Sistemas Embarcados
  5. Por que é útil entender sobre abstração?

Analogia de abstração

pexels-torsten-dettlaff-70912
Foto criada por Torsten Dettlaff, extraída de Pexels: https://www.pexels.com/photo/black-coupes-70912/

Digamos que você esteja em uma autoescola para obter sua carteira de motorista.

Na autoescola, você aprende como os principais componentes do carro funcionam:

  • Freios
  • Transmissão
  • Sistema de suspensão
  • Bateria

Não é necessário entender cada componente em um nível técnico para aprender a dirigir.

Você precisa apenas de uma imagem mental do que os freios fazem quando você pressiona o pedal do freio, ou do que acontece na transmissão quando você muda de marcha... e assim por diante.

Você só precisa de uma representação básica do componente que está usando.

Em outras palavras, você só precisa de uma abstração daquele componente.

Nosso uso de abstrações para aprender e usar as coisas está em toda parte:

  • Você não precisa conhecer completamente as partes de um carro para dirigi-lo. Saber como um carro funciona, porém, pode tornar você um motorista melhor.
  • Você não precisa conhecer a engenharia das partes de uma bicicleta para saber como passear com ela. Saber como elas funcionam, porém, pode tornar você um ciclista melhor.
  • Você não precisa conhecer os processos executados por uma função ou um framework para usá-los. Saber como essas coisas funcionam, porém, pode tornar você um programador melhor.

Exemplo de abstração em Python

code

Este é um código escrito em Python. Estamos apenas usando a função print para exibir o texto “Hello world” na tela.

Para fazer isso, você precisa apenas saber como usar a função print.

Você não precisa entender como ela funciona internamente.

Às vezes, contudo, é muito bom entender como uma determinada função trabalha internamente para usá-la de modo mais eficaz, ou até escolher qual função utilizar dentre funções similares.

Ao saber como ela funciona:

  • Você se torna um programador melhor e entende o código de outras pessoas mais facilmente
  • Você entenderá com mais facilidade os bugs de qualquer biblioteca que usar
  • Ao invés de importar uma biblioteca inteira, você pode simplesmente copiar o código que precisar de outro projeto. Um projeto com menos dependências é sempre mais fácil de gerenciar

Por exemplo, vamos dizer que você queira usar o módulo de estatísticas do Python, que é um módulo integrado do Python. Isso significa que o Python já vem com esse módulo na sua biblioteca.

Você não precisará importá-lo com o comando PIP (texto em inglês).

Vamos supor que eu queira usar somente a função de média (mean):

from statistics import mean 

randomList = [-1.0, 2.5, 3.25, 5.75]

print(mean(randomList))
main.py
python-example

Se não houver dados na função, será retornado o erro Statistics.error.

O código acima exibirá o valor de 2.625.

Como ele fez esse trabalho internamente?

Se você ver o código desse módulo, que está em https://github.com/python/cpython/blob/main/Lib/statistics.py, você encontrará na linha 414 o código para a função de média (mean):

def mean(data):
    """
    Return the sample arithmetic mean of data.
    >>> mean([1, 2, 3, 4, 4])
    2.8
    >>> from fractions import Fraction as F
    >>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])
    Fraction(13, 21)
    >>> from decimal import Decimal as D
    >>> mean([D("0.5"), D("0.75"), D("0.625"), D("0.375")])
    Decimal('0.5625')
    If ``data`` is empty, StatisticsError will be raised.
    """
    T, total, n = _sum(data)
    if n < 1:
        raise StatisticsError('mean requires at least one data point')
    return _convert(total / n, T)
    
    
 
https-__github.com_python_cpython_blob_main_Lib_statistics.py

Esse é o código interno que é executado quando você usa o módulo de estatísticas integrado fornecido pelo Python.

Ele executa a função _sum (soma), que retorna o tipo, o total da soma e a quantidade de itens somados. Se o número de itens for menor que 1, ele retorna o erro. Caso seja igual ou maior, ele utiliza a função de conversão (_convert) para dividir o total pela quantidade de itens, formatados no tipo identificado.

É bom entender como as coisas funcionam, certo? Agora, vamos para um exemplo mais "físico".

Exemplo de abstração em Eletrônica Geral

Qualquer dispositivo eletrônico é feito de circuitos.

Os circuitos são feitos por muitos fios e componentes. São os engenheiros eletrônicos que projetam esses dispositivos.

Na faculdade de engenharia elétrica (ou similares), o estudante não apenas aprende como projetar circuitos, mas também aprende a física por trás de cada componente que compõe um circuito.

Depois da faculdade, muitos engenheiros elétricos trabalham desenvolvendo pequenos circuitos eletrônicos para calculadoras, micro-ondas, impressoras e outros dispositivos.

Porém, enquanto os engenheiros elétricos trabalham para fazer os circuitos, compostos por componentes e fios, quem trabalha para fazer os componentes?

Bem, geralmente alguns engenheiros elétricos, de materiais, físicos aplicados e outros.

No nosso exemplo, usaremos os físicos aplicados – que são cientistas que aplicam a física para resolver problemas técnicos difíceis.

Alguns deles focam no estudo e criação desses componentes usados ​​nos circuitos.

Outros se preocupam em desenvolver coisas que se tornam os blocos de construção dos circuitos como:

  • LEDs
  • Visores LCD
  • Capacitores
  • Resistores

Os engenheiros elétricos, então, desenvolvem os circuitos e aplicações eletrônicas com esses componentes feitos pelos físicos.

Eles não se preocupam com o mesmo nível de detalhe que os físicos têm sobre a composição desses componentes.

O que eles se preocupam é usar esses materiais para resolver problemas em nível eletrônico.

Isso é a abstração!

O físico aplicado foca no nível de abstração, onde os componentes são criados, com quais materiais, qual o tempo necessário para criá-los e assim por diante.

O engenheiro elétrico se concentra no nível de abstração, de onde os componentes são usados ​​para criar os circuitos e dispositivos.

abstraction.drawio
No que trabalha cada profissional?

Ficou mais claro agora? Então vamos agora para os sistemas embarcados.

Exemplo de abstração em sistemas embarcados

Um engenheiro de sistemas embarcados (engenheiros que criam pequenos sistemas de computador, que são completos e independentes, encarregados de executar apenas uma função pré-determinada, como uma torradeira, calculadora científica, mouse, teclado e assim por diante) precisa saber como programar próximo ao hardware.

Para fazer isso, esses engenheiros precisam ter um bom entendimento das linguagens C e Assembly, uma vez que estão intimamente relacionadas entre si.

Temos como exemplo sistemas embarcados críticos (aplicações em tempo real que processam dados e eventos que possuem restrições de tempo definidas criticamente) como:

  • Dispositivos médicos
  • Sistemas de controle de aviões
  • Sistemas de orientação de mísseis

Um engenheiro precisa entender C e Assembly. O Assembly normalmente é usado em funções muito específicas, quando o Assembly puro executa melhor o trabalho que um código C compilado.

image-6
Exemplo de diferentes níveis de abstração

Cada caixa é um nível diferente de abstração.

Esses componentes elétricos são feitos e estudados por físicos aplicados, engenheiros de materiais e alguns engenheiros elétricos.

Já os componentes de software (funções, classes) são usados ​​e criados pelos programadores de sistemas embarcados.

Por que é útil entender sobre abstração?

Compreender a abstração permite que você entenda quando precisa saber algo mais técnico sobre algo ou quando é suficiente saber apenas como usá-lo.

Outra razão para entender bem a abstração é quando você começa a aprender um framework fora da sua área de trabalho.

Quando você aprende um framework pela primeira vez, você aprende como usá-lo. À medida que você aprende como ele funciona internamente, você começa a entender seus limites.

Como resultado, você aprende como as classes e funções são realmente escritas.

Ao compreender bibliotecas, frameworks e outros aspectos da programação, em um nível avançado, você será capaz de criar suas próprias bibliotecas e frameworks.

Desse modo, você poderá progredir na carreira e pode até ser capaz de resolver problemas difíceis.

Reduzir dependências em um projeto é outro motivo para entender a abstração.

Ao usar algumas funções de uma biblioteca externa, você pode ver como o código é escrito e simplesmente substituir a utilização dela por uma função ou classe sua.

Desse modo, seu projeto fica com menos dependências, facilitando que as pessoas executem seu código sem precisar instalar outras dependências.

Conclusão

Obrigado pela leitura! Agora você sabe:

  • O que é abstração
  • Três exemplos de abstração: em Python, em eletrônica geral e em sistemas embarcados
  • Por que é útil entender sobre abstração