orientação a objetos - O que é abstração e como ela influencia na criação de funções? - Stack Overflow em Português
Estava lendo uma resposta sobre Python do usuário @Maneiro no qual ele menciona o termo abstração em relação complexidade, funções e orientação a objeto, veja:
O que dá para fazer se não pode mudar a função é criar abstração, o que eu sempre falo, você chama a função que deseja do jeito que deseja dentro de uma função, e aí sempre chama esta função mais simples. Abstração é uma arte perdida que programadores antigos sempre usaram facilmente para esconder complexidade. Aí veio a orientação a objeto e as pessoas pararam de pensar nisso, só sabem agora criar soluções complexas.
Isto me chamou bastante a atenção.
O que de fato seria esta abstração e como posso aplicá-la?
Como a abstração influencia no processo de criação de funções?
Quais são os principais benefícios dela?
A Orientação a Objetos atrapalha esta abstração?
Se possível, poderia fornecer exemplos de códigos para facilitar na ilustração.
perguntada 5/02/19 às 17:18
Relacionada O que é abstração? e O que é abstração de um framework? e O que é Leaky abstraction (Vazamento de abstração)? – Barbetta 5/02/19 às 17:58
Primeiro vamos dar uma olhada na resposta que define O que é abstração?. Boa parte da pergunta já está respondida lá.
O resumo é isolar algo do todo. Em geral aplica-se como uma forma de generalização, parametrizada ou não. Então algo que você teria que usar de forma complexa uma ou mais vezes você coloca em um local e aí expõe apenas uma forma simples de uso.
A função é uma abstração. E não estou falando de computação apenas, na matemática é assim. Tudo o que você faz com funções (e fazemos pouco na escola porque só aprendemos resolver problemas fáceis e estanques para exercitar o básico) você faz sem funções, mas com funções se torna mais fácil entender, pode isolar certas partes do problema, encapsular a complexidade em um local fixo e é bastante DRY. Você resolve uma vez um problema e não tem mais que se preocupar como ele deve ser resolvido, apenas sabe como consumir a função, e embora não deveria ser o motivo, pode diminuir a digitação.
Mesmo que vá usar apenas uma vez pode ser útil para dar mais semântica de nomear melhor algo que está fazendo ou para só esconder os detalhes de como foi dada a solução. O motivo primário de usarmos uma função é sempre esconder a complexidade do que estamos fazendo. O secundário é que seria evitar erros por ter que fazer de novo ou ter a mesma implementação em dois lugares, o que complica a manutenção.
Outro motivo para usar a abstração é deixar flexível, então um dia você pode facilmente mudar uma implementação sem os consumidores saberem que isso aconteceu, portanto dá flexibilidade para trocar a maneira de fazer ou até a tecnologia usada por baixo dos panos.
É comum, mas perigoso, criar uma abstração para se prevenir de uma alteração possível. Então a pessoa usa, por exemplo, PDO porque um dia ela pode querer mudar o banco de dados. Mas o PDO tá cheio de vazamento de abstração, então acaba não funcionando tão bem. Quando a solução é complexa é comum ter vazamentos e isso é um sinal de alerta para pensar se deveria usar essa abstração. E você nunca troca de banco de dados :) E o PDO não é tão bem implementado assim e você paga esse preço.
Já você controlar os centavos de valores em um objeto abstrato pode ser melhor que lidar com isso manualmente porque a quantidade de centavos pode mudar ou até a forma de lidar com isso pode ser diferente. Fora que existem algumas fórmulas para lidar com isso que não são simples e serão muito usadas, sem a abstração corre o risco de cometer algum erro, ter que digitar mais, não compor tão bem com outras coisas (mas se fizer errado pode acontecer o contrário). Criar um tipo de dado para dinheiro é uma boa abstração.
x > y ? y : x
Não é simples? Você leu isso, percebeu o que ocorre de cara? E se ler assim:
Você sabe o que faz? Parece bem mais fácil, essa função só encapsulou a expressão acima. Vai mudar um dia? Duvido. É muito difícil saber e escrever aquilo? Nem tanto, mas pode ser que acabe errando o sinal ou cometendo outro erro. Principalmente pode usar em algum lugar que misturado pode parecer outra coisa se esquecer de parênteses, e dar outro resultado. Já deveria pensar na expressão assim:
(x > y ? y : x)
E dependo do que estivesse aí dentro poderia gerar algum efeito colateral indesejado.
Abstração de função é só isso, perceber que um problema deva ser encapsulado em uma função em vez de ser usado de forma direta.
Quer um exemplo de exagero? forEach(), ela faz basicamente isto (pseudocódigo):
forEach(objeto, acao) {
for (var i in objeto) acao(i);
forEach(objeto, (x) => print(x)); //chamando
Sem abstração seria:
for (var i in objeto) print(i);
Não sei se consigo acrescentar nada aqui que já não disse no item anterior. Me parece que diminuir a complexidade aparente e evitar duplicações são vantagens bastante óbvias.
OOP é uma forma de abstração, e usar abstração faz parte dos preceitos de OO. O que eu quis dizer ali é que OOP é a modinha, o pessoal está muito preocupado com isso e não se importa mais com o básico que é criar boas funções. Alguns dirão que OOP é também criar boas funções, mas leia material sobre o assunto e veja se algum fala em detalhes sobre isso. Em geral estão só preocupados com a estrutura geral e dão exemplos bobos.
Não é que OOP atrapalhe, mas ela mal usada atrapalha, como qualquer outra técnica, afinal tudo em exagero é ruim, o remédio vira veneno. Como as pessoas ficaram cegas para uma forma de fazer as coisas se esquecem de aprender as outras formas e não lembram que existem soluções simples e úteis sem ser OOP.
Aliás, abstração e encapsulamento são termos confusos, mas isso dá muita estória... :)
Abstração não é e não pode tornar a aplicação mais complexa, mas muitas pessoas estão fazendo isso.
Quantas vezes não vemos perguntas aqui que a pessoa não consegue fazer essa organização básica?
As pessoas estão tão acostumadas a dar ^C ^V, seguir fórmulas, reproduzir padrões, usar o que outro já fez, que nem pensa que aquilo tudo poderia ser mais abstrato. A quantidade de linhas que as pessoas escrevem hoje é muito maior do que deveria. E quanto mais linhas em código mais complicado a base de código é.
editada 26/08/20 às 12:12
respondida 5/02/19 às 17:55
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag orientação-a-objetos funções abstração ou faça sua própria pergunta.