Taverna /dev/All

Orientação a objetos - será realmente tão boa assim?

image

Muito tempo atrás (seis anos) me peguei questionando se a orientação a objetos realmente era o caminho a ser seguido, visto que raramente pensamos em não adota-la em nossos projetos (eles dizem que toda unanimidade é burra, né?). Isto rendeu inclusive um post na época que deu uma bela discussão: https://www.itexto.com.br/devkico/?p=1324

Algum tempo depois tive algumas experiências muito bem sucedidas com Node.js e, neste momento, percebi que na realidade estava usando muito pouca orientação a objetos. Na realidade, estava usando programação funcional. E aí a pulga voltou pra trás da minha orelha.

E hoje, pela manhã, me lembrei deste post bem antigo (2006!) chamado Execution in the Kingdom of Nouns que é uma crítica bem pesada à orientação a objetos (especialmente ao Java) cujo link compartilho aqui: http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html (o post é fenomenal, vale à pena ler)

Não só isto, mas buscando críticas à orientação a objetos os argumentos são bem interessantes também. Seguem alguns links:

Why OO sucks - Joe Armstrong (infelizmente morreu recentemente) - http://harmful.cat-v.org/software/OO_programming/why_oo_sucks

Whats wrong with Object Orient Programming - Este link trás diversas citações de peso contra OO que vale à pena ler também - https://www.yegor256.com/2016/08/15/what-is-wrong-object-oriented-programming.html

Sendo assim, solto aqui a pergunta: vocês já se pegaram questionando o uso do OO? Não se sentem um pouco mal pelo fato de a usarem sempre sem sequer se questionar? Já toparam com as limitações do paradigma? Como foi a experiência fora dele?

Pessoalmente, vejo como, do ponto de vista histórico, um tiro no pé. Realmente acredito (inclusive menciono isto no post acima) que acabamos complicando mais as coisas do que deveríamos. Talvez com o avanço dos micro serviços, que nos fornecem maior liberdade técnica OO retroceda um pouco em detrimento de outros paradigmas, como o funcional (ou mesmo procedural) por exemplo.

Que inicie a discussão portanto!

1 Curtida

Quem me conhece sabe que sou um proponente de programação funcional. Mas não porque eu odeio OO. Ter estudado um pouco de Haskell e programação funcional abriu minha mente para problemas que eu antes achava serem coisas normais do dia a dia.

Na minha humilde opinião, os problemas basicamente se resumem em mutabilidade e composição de comportamentos. Programação funcional prega imutabilidade por padrão, e faz bastante uso de high order functions. A combinação dessas duas características são primordiais para reuso e previsibilidade. Podemos ter isso em linguagens OO também, entretanto, o que não é ditado pela linguagem vai acabar dependendo de seguir convenções, e isso nem sempre funciona.

Felizmente, novas linguagens multi paradigmas como Kotlin, Swift e Rust vem fazendo bom proveito das coisas boas de linguagens já datadas como Ocaml, Haskell, Erlang, Racket, etc. E temos linguagens funcionais mais modernas também como F#, Elixir, Clojure, Bucklescript, Purescript, etc.

Scala está no mercado há um bom tempo como alternativa OO + Funcional. Eu particularmente gostei quando experimentei. Fui meio cético antes mas depois de colocar a mão na massa tudo fez sentido. Sim, a compilação demorada é um problema em projetos grandes, e a variedade de sintaxes possíveis também complica as coisas. A equipe de desenvolvimento tem trabalhado em um novo compilador o que pode levar a um ganho de performance na compilação. Quanto a sintaxe acho que foi uma infeliz decisão que é difícil reverter a esse ponto.

OO foi o último dos paradigmas tradicionais que aprendi, comecei na programação com Assembly, Pascal, Haskell e C nessa ordem. Meu primeiro contato com OO foi no Java na universidade, curiosamente, junto com Prolog. Achei bem chat na época e continuo ainda mais agora que vejo as discussões constantes sobre OO e patterns.

Gostei muito de FP quando aprendi Haskell, como cheguei na computação com um passado forte em matemática td fazia sentido mais fácil p/ mim. OO achei confuso e imperativa achei simples.

Acho que o @hlmerscher disse bem sobre as vantagens do FP e como as novas linguagens estão sabendo aproveitas as boas partes disso.

eu lido com imperativa e OO no meu trabalho pq é o q faz sentido pq não adianta sair fazendo FP pq acho melhor se o time não sabe e nem demostra interesse no assunto.

1 Curtida

O maior problema é querer usar “OO pra tudo”, “funcional pra tudo”, “procedural pra tudo”. Prefiro o lado multiparadigma, resolver o problema da forma mais adequada, não aumentando a complexidade só pra seguir o que pregam. Além das citadas, C# é muito forte nesse aspecto.

Eu sou um patinho feio então, o meu default é procedural.

Só quando as repetições e abstrações começam a surgir que (talvez) crio classes. Algumas coisas realmente ficam melhores em OO, como template methods ou quando tenho muitos objetos com interface comum e comportamento diferente. (São os casos que me vem à mente agora)

A razão pra isso é que quanto mais você separa seu mundo em classes, buscando coesão, mais boilerplates de gerenciamento de dependências você tem que criar - ou usar, os frameworks estão aí mas gastam recursos que não estão sendo aplicados no problema de negócio.

Se OO fosse natural, todo mundo faria “certo”. Se quase ninguém faz “certo”, provavelmente não há um jeito “certo”. Tem o jeito do Martin Fowler e outros, por exemplo, que são bons jeitos (são mesmo? Precisa de tanto padrão?), mas dá para conseguir reúso e boa manutenção com procedural ou funcional sim.

Concordo, faço muito mais reutilização de forma procedural e funcional do que com OOP. Modelagem orientada a objetos nem pensar, é uma visão muito complexa.

itexto