Executando verificação de segurança...
-10

POO e Padrões de Projetos são lixo

Atenção

Esse post trata de algo controverso na indústria de software, caso não esteja confortável com isso, sugiro não ler.

Antes de comentar, recomendo certificar-se de ler todos os comentários e links postados.

Caso você não tenha tempo de ler tudo, aqui está uma versão resumida e atualizada.

No entanto, não tenho mais interesse em discutir esse assunto, mas não posso controlar quem comenta ou não, e também não tenho interesse em excluir o post.


Infelizmente a regra de negócio do TabNews não me deixa responder todos os comentários. Por isso vou responder por aqui. Mais abaixo você encontrará o post original.

Comentários - parte 1
Comentários - parte 2


Segue o post original:


Quando comecei minha carreira em programação, aprendi que POO é uma ferramenta e, como toda ferramenta, tem seu lugar para resolver um problema.

A princípio parecia fazer sentido, mas à medida que fui adquirindo mais experiência em programação, percebi que POO não traz nenhum benefício. É por isso que escrevi para ignorar POO.

A primeira razão para ignorar OOP é que isso leva a um desempenho ruim:

Outra razão é que vários livros tentam corrigir POO:

Esses livros mostram que POO é falho visto que
eles fornecem diretrizes para escrever melhor código OO.
Todos os três livros combinados têm cerca de 1.200 páginas de heurísticas!
Tente se lembrar de tudo isso!

Michael Feathers escreveu em seu blog dizendo que seu livro "Trabalho Eficaz com Código Legado"
deveria se chamar "Trabalho Eficaz com Código Orientado a Objetos".

Eu me pergunto por que não existe um livro para trabalhar com código funcional ou procedural legado.
Provavelmente porque não existe uma técnica secreta, é muito simples de lidar, então não precisa de um livro para isso.

Outra razão é que linguagens modernas, como Zig, Go e Erlang, não adotam explicitamente a POO e não a incentivam. Algumas linguagens mais antigas, como Java, C# e C++, estão se afastando da POO através da implementação de recursos funcionais.

No meu primeiro post, mencionei que Rust não adota POO explicitamente, mas a documentação oficial mostra que sim. No entanto, parece que não é muito divulgado.

Alguns defensores da POO afirmam que a POO é mais adequada para softwares grandes e complexos. Esta afirmação é um absurdo completo. Existem muitos projetos não-OO grandes, complexos e bem-sucedidos: Git, Linux, Redis, Nginx, Postgres e SQLite. Você pode escrever software grande, complexo e bem-sucedido em qualquer paradigma, até mesmo assembly!

Outros defensores afirmam que POO é melhor para código de interface gráfica.
Mas esta não é a única abordagem para escrever código de interface gráfica, como
interface gráfica de modo imediato.

Uma das afirmações mais irritantes é quando alguém critica um código OO e diz que o desenvolvedor
fez mais complicado do que precisa e não é culpa da POO.
Os desenvolvedores podem projetar soluções excessivamente complicadas, mas acredito firmemente
que POO leva a soluções excessivamente complicadas.

Para finalizar esta seção, gostaria de dar um exemplo onde o código procedural é muito mais simples que o código OO. Martin Fowler, que escreveu o livro Refactoring, reescreveu o exemplo da Loja de Vídeo em JavaScript, onde calcula a fatura do cliente e imprime o extrato.

Na primeira versão, ele escreveu em Java. O código inicial tem três classes e 88 linhas de código. Tudo isso cabe facilmente em 42 linhas de JavaScript. Se você adicionar tipagem, aumenta para 57, mas ainda menos que Java.

Você pode até traduzi-lo para C, que, apesar de ser mais antigo que Java, tem uma certa simplicidade que falta ao Java.


Já que já discuti que POO é lixo. Vamos para Padrões de Projeto. Como o título diz: “Padrões de Projetos: Soluções Reutilizáveis de Software Orientados a Objetos” é específico para POO.

O único propósito dos padrões de projeto é corrigir deficiências na linguagem, especialmente C++ e Java.
Os autores concordam que alguns padrões não fazem sentido em outra linguagem porque possuem mecanismos melhores para resolver um problema.
O trecho do livro:

...alguns de nossos padrões são suportados diretamente pelas linguagens orientadas a objetos menos comuns. O CLOS possui vários métodos, por exemplo, que diminuem a necessidade de um padrão como Visitor (página 331). Na verdade, existem diferenças suficientes entre Smalltalk e C++ para significar que alguns padrões podem ser expressos mais facilmente em uma linguagem do que em outra.
e a maioria dessas linguagens existia antes de Java e C++, que são as linguagens alvo do livro.

Além disso, Peter Norvig apontou que
"16 dos 23 padrões têm uma implementação qualitativamente mais simples em Lisp ou Dylan".
Outra postagem interessante mostra como Clojure simplifica esses padrões.

Se C++ ou Java tivessem sido baseados em Lisp, então o livro de padrões nunca existiria.

A escolha da linguagem de programação é importante porque influencia o ponto de vista de cada um. Nossos padrões assumem recursos de linguagem de nível Smalltalk/C++, e essa escolha determina o que pode e o que não pode ser implementado facilmente. Se assumissemos linguagens procedurais, poderíamos ter incluído padrões de design chamados “Herança”, “Encapsulação” e “Polimorfismo”.

Herança, encapsulamento e polimorfismo não são padrões!
Eles são simplesmente recursos de linguagem. Eles não resolvem um problema recorrente.

Eu também acredito
que Padrões de Projeto não descrevem problemas reais
mas problemas fictícios da mentalidade de design da POO.

Algumas citações do livro explicam um pouco sobre o design da POO em geral.

A parte difícil do design orientado a objetos é decompor um sistema em objetos. A tarefa é difícil porque muitos fatores entram em jogo: encapsulamento, granularidade, dependência, flexibilidade, desempenho, evolução, capacidade de reutilização e assim por diante. Todos eles influenciam a decomposição, muitas vezes de formas conflitantes.

As metodologias de design orientadas a objetos favorecem muitas abordagens diferentes. Você pode escrever uma declaração de problema, destacar os substantivos e verbos e criar classes e operações correspondentes. Ou você pode se concentrar nas colaborações e responsabilidades do seu sistema. Ou você pode modelar o mundo real e traduzir os objetos encontrados durante a análise em design. Sempre haverá desacordo sobre qual abordagem é a melhor.

Esta é a falha fundamental do POO. Supõe que devemos
projetar o código em torno de objetos, não da solução.
Isso leva a um design estranho e a uma estrutura complexa, semelhante a este projeto satírico
FizzBuzzEnterpriseEdition.

Os padrões de projeto resolvem muitos dos problemas diários enfrentados pelos designers orientados a objetos.

Eles enfrentam esses problemas porque POO é lixo.

A estrutura de tempo de execução de um programa orientado a objetos geralmente tem pouca semelhança com sua estrutura de código. A estrutura do código é congelada em tempo de compilação; consiste em classes em relacionamentos de herança fixa. A estrutura de tempo de execução de um programa consiste em redes de objetos em comunicação que mudam rapidamente. Na verdade, as duas estruturas são em grande parte independentes.

Com tanta disparidade entre as estruturas de tempo de execução e de compilação de um programa, fica claro que o código não revelará tudo sobre como um sistema funcionará. A estrutura de tempo de execução do sistema deve ser imposta mais pelo designer do que pela linguagem. Os relacionamentos entre objetos e seus tipos devem ser projetados com muito cuidado, pois determinam quão boa ou ruim é a estrutura de tempo de execução.

Esta é outra razão pela qual a OOP leva a um design ruim. Torna mais difícil entender o programa lendo-o porque é uma rede de objetos comunicantes.

Não consideramos esta coleção de padrões de projeto completa e estática; é mais uma gravação de nossos pensamentos atuais sobre design.

Então, por que não há uma segunda edição depois de 30 anos?

Para finalizar esta seção, refatorei um jogo simples.
O jogo fez uso intenso do padrão observer. Então, como demonstração, removi as camadas indiretas e simplifiquei o código geral. No final, o padrão observer era desnecessário.

Você pode comparar você mesmo, o código original e minha versão refatorada. Então, veja qual é mais fácil de ler e entender.

Conclusão

POO tornou-se amplamente utilizado devido à popularidade de C++ e Java, não porque seja inerentemente bom. POO não oferece nenhum benefício que as pessoas dizem. O código procedural é tão flexível, modular e reutilizável quanto OO. A ideia de que POO é de alguma forma melhor nisso é um absurdo completo.

Tenha cuidado com qualquer pessoa que esteja “vendendo” padrões para você. Certifique-se de que eles sirvam a um propósito e resolvam seu problema. Não se esqueça de que as estruturas de dados e os algoritmos são muito mais fundamentais do que qualquer padrão de design.

A principal lição desta postagem é:

Se você ignorar POO, seu código ficará mais simples.

Para finalizar meu caso contra POO, selecionei uma lista de links que discutem um pouco sobre como a POO é ruim:

Carregando publicação patrocinada...
5

concordo com a parte de que existem problemas, não existe bala de prata na programação, mas tem muito coisa equivocada no seu post, o maior problema no seu argumento é colocar o paradigma, implementação e padrão de mercado com se fosse a mesma coisa, vamos por parte:

  1. "A primeira razão para ignorar OOP é que isso leva a um desempenho ruim", desenpenho depende de implementação.
  2. DoD de fato é uma tecnica eficiente pra lidar com dados, tem seus proprios pontos fracos e fortes, nenhum dos links critica OO em si, apenas apresenta soluçoes mais adequadas para um problema especifico, o que é algo normal, OO n é bala de prata, obviamente n serve pra tudo
  3. DoD não subistitue OO, na verdade eles são otimos juntos

"outra razão é que vários livros tentam corrigir POO"
onde isso? ele não corrigem OO, eles apresentam sugestões para resolver problemas modernos, coisas atualizam, problemas de 1994 não são os mesmos de hoje.

"não adotam explicitamente a POO"
não existe explicitamente OO, imagino que voce esteja falando de Java/C#/C++ aqui, Zig, Go e Rust não tem esse estilo porque C++ ja deixou mais do que claro que implementar essas features pode acabar limitando linguagens de sistema, aqui estamos falando de regras de inicilização, vtables,lifetime,...etc, detalhes de implementação de cada lang, não de OO.
(e Erlang usa a definição de Alan Kay, é bem mais fechada que a definição do GoF)

"Alguns defensores da POO afirmam que a POO é mais adequada para softwares grandes e complexos. Esta afirmação é um absurdo completo"
SIM, EXATAMENTE ISSO, DECLARAÇÃO PERFEITA.

"Existem muitos projetos não-OO grandes, complexos e bem-sucedidos: Git, Linux, Redis, Nginx, Postgres e SQLite."
.....

"Você pode escrever software grande, complexo e bem-sucedido em qualquer paradigma, até mesmo assembly!"
SIM, EXATAMENTE ISSO, DECLARAÇÃO PERFEITA

essa linha do meio não da, se fosse só o inicio e o final ficaria simplismente perfeito, sabe porque? pq isso aqui é vdd "desenvolvedor
fez mais complicado do que precisa e não é culpa da POO."
Não é o OO que deixa complexo, pq não é o OO que resolve o problema, quem resolve é voce, desevolvedor, é sua função como Dev de levantar requisitos, é sua função como Dev colocar os tradeoffde cada implementação na balança, é sua função como Dev ser um Dev.

os codigos "Não-OO" que vc citou, são otimos exemplos do bom uso de OO, eles usam conceitos desse paradigma, pq tem utilidade e é simples se usado de forma correta, que nem qualquer coisa
(https://lwn.net/Articles/444910/)

em Padrões de Projeto eu não vou nem comentar, cai no mesmo que eu disse acima sobre a obrigração como Dev, voce que tem que avaliar e modificar da melhor forma para sua aplicação, esses livros de Padrões de Projeto são sugestoes, não regras.
(e o codigo que refatorou é um codigo feito para aprendizado desses conceitos, não é o escopo do projeto o uso de outras tecnica)

"POO tornou-se amplamente utilizado devido à popularidade de C++ e Java, não porque seja inerentemente bom."

isso aqui é só meteção de loko, porque que Java e C++ é popular ent? meter esse papo em TI não cola, C++ com quase 4 decadas de historia, Java vire e mexe quebra a retrocompatibilidade com alguma coisa, é a desculpa perfeita pra troca de lang

se não tivesse vantagem Java taria morto ja.

"POO não oferece nenhum benefício que as pessoas dizem. O código procedural é tão flexível, modular e reutilizável quanto OO."
os "não-OO" ai de cima que diga né

2

Eu não diria que são um lixo completo, apenas que são ferramentas que têm sua utilidade, mas que ao longo do tempo foram extremamente abusadas (ou seja, usadas em contextos inadequados, nos quais não eram a melhor solução). O fato de terem sido moda por um longo período ajudou no abuso, e na percepção geral de que seriam ruins pra tudo.

Por exemplo, um erro comum ao usar design patterns é pegar um padrão e tentar encaixar no código de qualquer jeito. Sendo que o correto é o contrário: vc avalia o problema e verifica qual padrão seria mais adequado para resolvê-lo (em outras palavras, vê qual é o problema e procura a solução, em vez de pegar uma solução e tentar encaixá-la no problema). Neste caso, o problema é do padrão em si, ou de quem tentou usá-lo errado?

Pra complementar, seguem alguns links relevantes:

2

Esse bait no titulo do texto vai ser um probema aqui no tabnews.

Gente que não entende nada de POO e ama muito um paradigma vai rebeixar sua postagem e ela vai sumi no limbo do tabnews.

Eu recomendaria um titulo melhor e um texto menos provocativo!

De resto eu concordo que POO é bem ruim em muita coisa e
pior ainda, POO nem padrão tem. Ninguém sabe a definição dela!

2

Eu consigo entender a intenção do Post, o que ele critica, e nesse sentido até poderia concordar com mais pontos, mas ou o título é muito click bait, ou você está batendo num espantalho o artigo todo.

Você falou muito que OOP é lixo, mas não apresentou muitos argumentos sobre os motivos que levam a isso, cada parágrafo apresenta um efeito, sem realmente mostrar que a OOP é a causa dele, outros você simplesmente joga dois pedaços de código, e não faz nenhum juízo de valor (exceto dizer que a versão procedural é mais simples sem elaborar muito também), ou referencia vários links extras sem fazer nenhum comentário por cima, o que não ajuda muito que está lendo o seu artigo a entender o seu ponto, não é nem por uma questão de má vontade, é só que não ajuda muito a criar uma linha de raciocínio se eu tenho que parar para ver uma talk a cada parágrafo do texto para conseguir seguir a sua linha de raciocínio.

Agora pegando ponto-a-ponto do seu texto.

Sobre os motivos para se ignorar a POO, a performance realmente é algo importante, mas assim, claramente não se utiliza OO por conta da performance, se performance fosse o argumento mais importante de todos, a gente não utilizaria outro paradigma que não fosse procedural, ou quem sabe abandonar tudo isso e voltar pro assembly não-estruturado.

Quanto a ter vários livros que tentam corrigir a OO, se algo for tão explorado na academia, e no mercado ao ponto de ser usado em todo lugar religiosamente, até quando não for o ideal, certamente acredito que teríamos livros semelhantes dessa coisa também.

Daquela lista, eu conheço o Elegant Objects, e apesar de eu gostar bastante das opiniões dele, e algumas coisas realmente estarem mais alinhadas com os princípios, claramente o que ele quer é uma forma diferente de FP, e não de OOP, é só acompanhar o próprio blog do autor para entender isso. Alias, esse é um caminho bem parecido com o que o Alan Kay tomou para criar o Smalltalk (já que ele via o Lisp como algo falho), embora claramente as conclusões são diferentes devido aos objetivos serem diferentes.

Livros sobre como lidar com procedural legado realmente existem, um dos melhores livros de PHP que eu já li fala exatamente sobre esse tema, inclusive a solução que ele propõe é a aplicação de um tom mais OO com design patterns (https://www.amazon.com/Modernizing-Legacy-Applications-Paul-Jones/dp/1787124703).

Não se discute muito mais sobre problemas de procedural, porque os problemas já são bem conhecidos, falta de encapsulamento, mecanismos de abstração tendem a ser mais pobres em linguagens que só suportam esse paradigma, estado global, estado mutável sem controle, spagetti code, e etc. Óbvio que com disciplina, e "boas práticas" é possível ser bem sucedido em qualquer paradigma, seja ele a OO, ou o procedural, um dos melhores exemplos disso é o Linux, que é uma comunidade altamente disciplinada.

Sobre a questão da evolução das linguagens, eu não diria que Erlang é uma linguagem lá muito moderna, ela é bem antiga até para falar a verdade, moderno nesse contexto provavelmente seria o Elixir.

Apesar disso, eu tenho uma boa explicação para isso, a FP vem se popularizando muito nos últimos tempos, então o natural é que as linguagens evoluam na direção de ir adotando mais recursos desse paradigma, foi exatamente o que aconteceu com a OO. O motivo é simplesmente que elas evoluem na direção das ferramentas que podem adicionar algo a mais para elas, Java já implementa muitas coisas de OO, não tem muito mais de OO que implementar ali, logo o caminho natural seria ver como ele poderia se beneficiar de outros paradigmas.

Até porque isso reflete até a maneira que nós programamos no dia-a-dia, é muito difícil classificar algo como puramente de um paradigma, você pode ter um código super imperativo, causando efeitos colaterais, dependendo de estado global, e receber uma callback como parâmetro por exemplo. Não é por conta dessa callback que o código virou FP da noite pro dia, ela continua sendo uma solução muito procedural, só que ela incorporou algumas coisas de FP.

Sobre os usos de OO, as consequências estão corretas (existem outras formas de resolver os mesmos problemas), mas isso não ajuda em nada seu argumento, você não disse que o ponto dos defensores era que OO é a única solução para esses problemas, o ponto é que esses seriam campos onde ela seria uma solução efetiva, não é sobre ser melhor ou pior que outras soluções.

Aqui a gente chega no seu primeiro exemplo de código, nesse ponto eu achei o artigo meio desonesto, se você olhar no repositório essa é a versão 1 do código, sendo que elas vão até a versão 11.

O código da versão 11 ainda poderia ser bem mais OO, mas claramente é bem mais OO que o código da versão 1 que você referencia, este por sua vez é bem procedural, não é porque você está usando classes e objetos que você não pode escrever código procedural, inclusive o erro mais comum de quem vai aprender um novo paradigma é forçar o paradigma que domina nesse outro paradigma.

A sua refatoração melhora aquele código justamente porque ele já era muito procedural para começo de conversa, então implementar ele usando técnicas procedurais naturalmente resultaria numa versão melhor daquele código.

Você não pode dizer o mesmo da versão 11. Claro que ainda tem mais arquivos e LoC (Linhas de Código), mas essa não é a única métrica que importa, se não, não existiriam recursos de abstração na maioria das linguagens, e se o único benefício disso (abstração) fosse reúso de código, então a OOP seria o melhor paradigma de todos, já que nada vence herança múltipla + polimorfismo em termos de reúso de código, o problema são as outras coisas que vem disso.

Não vou falar muito sobre legibilidade pois em muitos casos isso tende a ser meio subjetivo, eu por exemplo acho muito mais simples ler um reduce do que um for hoje em dia para qualquer operação em arrays.

Pelo seu código a gente consegue ver uma área onde a OOP realmente se destaca que é o polimorfismo, o seu código teria problemas para evoluir caso novos tipos de código fossem adicionados, e aquele switch só cresceria (e ficaria mais complexo) ao longo do tempo, com OO, isso seria uma aplicação simples do OCP do SOLID.

Sobre padrões de projeto, isso existe em qualquer lugar, são simplesmente as soluções mais comuns que as pessoas tem para qualquer coisa, coleções de padrões existem até para áreas fora da programação como o design.

Claro que padrões de OO não seriam necessários em programação funcional, é outro paradigma completamente diferente. Você poderia dizer o contrário também, você não precisaria de uma State Monad caso tivesse objetos com encapsulamento simples sendo aplicado, você não precisaria de Optional Monad, se soubesse como usar herança simples para implementar um boolean ou uma variação disso para valores nulos, o Alan Kay mesmo já disse que uma das inspirações que ele teve para OO era a capacidade de compor algebras da matemática, que é um conceito muito bem implementado nessas estruturas algebricas.

Mesmo os padrões de OOP, não precisariam de padrões para serem usados com OOP, boa parte deles é simplesmente polimorfismo básico, o template method é só uma forma inteligente de usar herança, o Visitor é só uma aplicação de double dispatch, e assim por diante. Os padrões são úteis pois assim podemos dar nomes para cada tipo de utilização, o que melhora a comunicação.

Ai o último ponto que eu gostaria de comentar seria a sua segunda refatoração.

Para começar que o código original não é a coisa mais OOP do mundo, "a classe Game" aqui teria controle do estado de toda a aplicação, mesmo tendo pelo menos 3 ou 4 objetos que ela dependeria, e que poderiam sim lidar com o seu próprio estado. O padrão Observer não era necessário em Game, pois ele não usou isso em lugar nenhum depois.

Só que o seu código não simplificou em nada o código original, inclusive depender uma função sendUpdate, meio que tem quase o mesmo efeito de implementar um padrão observer é só que é uma solução mais prática e menos robusta.

O seu código piorou o original, ele faz literalmente a mesma coisa que o original, só que ao invés de separar cada ação que vai alterar o estado da aplicação numa função (o que seria um bom senso até em programação procedural), você colapsou todas as funções dentro de um switch gigante, o que só aumenta a complexidade do código ao invés de diminuir.

Juntar tudo em uma única função tem os seus méritos, mas nesse caso nem ajuda muito, pois agora quem for ler o código onde ela foi usada, vai ter que procurar em qual ponto de uma função enorme, que nem é pura, que aquele comando está sendo tratado, ao invés de simplesmente procurar no módulo que lida com ele.

Mesmo que você possa argumentar que existe uma certa equivalencia num switch com actions (similar a um reducer) e um objeto com métodos, os métodos de um objeto são melhores visto que estão menos propensos a erros de digitação.

A OO é boa para várias coisas sim, o encapsulamento permite que você tenha os mesmos benefícios de uma closure em FP, só que numa situação onde existe mais de uma operação que depende dos mesmos dados.

O encapsulamento provido pelo uso de objetos é uma das melhores formas de lidar com dados mutáveis, pois você consegue restringir as formas com que ele pode ser modificado, o que é algo muito útil para softwares empresariais que precisam de políticas fortes que assegurem as regras de negócio da aplicação.

Claro que todo paradigma permite que você reforce regras de negócio, tal como um if e status code no procedural, ou uma result monad em FP, mas só a OO consegue fazer esse tipo de validação a nível de dado para todas as operações que envolvem ele.

A abordagem da FP para esse caso é garantir que os dados são válidos nas bordas, e assumir que eles são válidos no Core, o que é uma ótima ideia também, mas eu não acho que isso diminui os méritos de garantir essa consistência no próprio dado em si.

O polimorfismo é algo que todos podemos concordar que é uma funcionalidade essencial para desenvolvimento de qq software ser saudável. A capacidade de deixar suas opções abertas para o futuro é algo realmente valioso.

Todo paradigma tem alguma forma de suporte a esse conceito, no procedural, apesar de ser o mais limitado nesse tipo de coisa, você pode ter certo grau de polimorfismo usando polimorfismo paramétrico, e ad-hoc, porém isso se limita só aos dados.

Na FP, apesar dos tipos serem os mesmos do procedural, você tem uma vantagem imensa aqui que é a existencia de type classes, e funções como cidadãs de primeira-classe, assim você consegue quase uma equivalencia com o sistema adotado pela OOP.

Na OO, apesar de poder ser argumentado que ela suporte quase todos os tipos, eu gostaria de focar só no princípal que realmente seria algo singular dela, o de subtype.

Pois, por mais que FP seja incrível, o tipo de polimorfismo que ela oferece só resolve metade do Expression problem (https://en.wikipedia.org/wiki/Expression_problem), o modelo de subtyping da OO resolve a outra metade, e esse é um problema justamente pois não tem como resolver os dois lados ao mesmo tempo.

O modelo da FP permite que você adicione mais tipos de dados facilmente a uma função, enquanto a vantagem da OO é o contrário, facilitar a adição de mais funções a um determinado tipo de dado.

Por isso que problemas onde a OO é melhor, geralmente são problemas onde você consegue abstrair uma estrutura hierarquica entre os objetos.

O que nos leva a herança, que apesar de realmente não ser a melhor coisa do mundo, todos conhecermos a famosa ideia de que composição > herança, tem sim uma função vital no dia-a-dia da maioria dos programadores.

Herança, graças as classes abstratas, é uma ótima forma de pegar boas abstrações que emergirem de uma codebase, e centralizar elas num lugar só, de modo a tornar o desenvolvimento mais incremental.

O padrão template method é uma forma legal de ver como isso poderia ser usado no código do dia-a-dia, mas não é nem sobre ele que eu estava falando. Os frameworks que usamos no dia-a-dia são o maior exemplo dos benefícios que essa funcionalidade pode trazer, apesar de realmente não ser uma boa solução em userland, ter ferramentas que se utilizam disso, é um aspecto positivo sobre esse princípio.

E para fechar, eu gostaria de lembrar que OO é sobre as mensagens trocadas pelos objetos, até porque objetos são receptores de mensagens, tipo como uma forma de reducer glorificado, o que fica evidente no sistema de processos baseado em actor model (que é tipo uma versão async da ideia de OO do Alan Kay) do Erlang/Elixir, por isso que o Alan Kay denomina o paradigma como orientação a objetos.

Então onde cada paradigma vai se destacar vai muito de o que você acha que é mais importante, visto que sistemas são sempre a junção de duas coisas: dados e ações.

Se você vê os dados como mais importantes, então a OO realmente não serve para você, um ótimo exemplo disso foi o que vc deu sobre DoD.

Se você vê os comportamentos como mais importantes, então OO vai acabar sendo melhor, um bom exemplo disso é o sistema de recuperação de falhas de sistemas Erlang de telefonia, que tem quase 0 de downtime desde a sua criação.

1

POO e padrões de projetos muitas vezes não são a melhor solução pra um problema, e sim um padrão de leitura de código.

Agora é lixo a partir do momento em que não te serve ou atrapalha, isso eu concordo.

Pra qualquer outro problema resolvido com POO eu discordo, não é lixo não. Muitas vezes mal implementado, mal documentado e entendido sim, se torna lixo.

Ao meu ver não vou lembrar quem foi o criador do POO, mas muitas linguagens como JAVA nem sequer eram somhados na época da "invenção" do POO

Resumindo: É lixo pra uns, luxo pra outros.

faz algum sentido ?

1

Olá, Douglas. Valor é subjetivo. O principal valor da plataforma é reunir conteúdos de "valor", e o conceito de valor neste contexto, depende da avaliação de cada um que ler seu texto.
Arranhando a superfície da questão, Eu diria que os downvotes vieram da personificação do objeto do assunto, o que faz as pessoas levarem uma opinião, que independente da forma como expôs, ou de seu conteúdo, tem como único alvo uma coisa. Que neste caso é a POO.
Neste momento, não tenho bagagem o suficiente pra sequer discutir esse assunto contigo, em primeiro lugar, porque na minha carreira só tive a experiência real com o paradigma procedural e POO, e o segundo é o que tem ocupado a maior parte da minha carreira; em segundo lugar, você trouxe boas referências para a discussão. Seria leviano se Eu não as lesse antes, e trouxesse pra discussão algo de valor pra de fato agregar no que seria uma discussão sobre o que é pior, ou melhor, sem me agarrar à gostos pessoais.
De qualquer forma, sua publicação tem muito valor, e os downvotes neste caso, dizem mais sobre a pessoalidade que o assunto tem, do que o conteúdo em si.
Continue trazendo boas provocações para a plataforma.
Um forte abraço!

1

Cara eu realmente entendo onde você quis chegar com o post. Porém existe 2 pontos importantes a serem destacados.

  1. Você exagerou quanto a "não servir pra nada"
  2. As pessoas não estão entendem suas argumentações.
    Vamos começar pelo 2°, para entender o pq POO não funciona e entender suas argumentações é necessário ter um embasamento muito grande, principalmente sobre outros paradigmas e outras problemáticas sobre o contexto de computação, e até um pouco de histórica. Você deixou alguns links, acho que o pessoal que deu downvote nem abriu...

Sobre o 1° ponto, você exagerou de mais, POO veio para ajudar na manutenção de códigos, para ajudar na abstração da realidade, entre outras coisas... que se você pesquisou como diz, você save bem. Agora não é culpa de POO que os programadores façam gambiarras...

Você falou que Linux não foi escrito em POO, mas isso está mais do que óbvio. O sistemas é baseado em ações, "procedimentos", em "módulos" não faz sentido ser escrito em POO, além do mais ele foi escrito em C, que não tem suporte a orientação a objetos. Pq vc acha que C++ foi criado? Para resolver problemas que C não conseguia, e isso utilizando POO.

Você afirmou também que, se POO fosse tão bom, não teriam criado outras Lang. Mas isso é ser muito mente fechada, parece que você se frustrou com alguma situação e saiu falando o que tinha em mente. GO foi criado para resolver alguns problemas de paralelismo/concorrência em resolver problemas com STRINGS. O MUNDO NAO GIRA EM TORNO DE UM PARADIGMA.

Outros paradigmas vieram depois de POO e cada um pra resolver problemas que POO deixa passar. Java é basicamente POO puro, e é a linguagem mais utilizada para criar ERPs, Grandes sistemas empresariais, que precisam de bastante abstração.

Desenvolvimento de Games, seria basicamente impossível sem POO, jogos como MOBA, onde um champ tem skills parecidas, seria horrível dar manutenção.

Os famosos motores gráficos, não seriam possíveis, não com a "facilidade" de abstração que o POO trás.

Enfim eu poderia dar vários exemplos mas basta pesquisar. No demais, gostei do teu post! Provavelmente está com downvote negativo pq as pessoas não entenderam."Eu acho"

1

Parece que eu li um post de um iniciante...

Tudo bem mano, sabemos que você não gosta de POO. Se não quiser usar, não use, mas não critique quem use.

Eu nem li seu texto todo, mas li o suficiente pra saber bem do que você estava falando e o que você mais argumentou foi a complexidade do código e a má performance que isso pode trazer.

Eu posso te garantir que, em um sistema de gestão administrativa feito em Java e que gerencia milhões de objetos, o desempenho não cai. Se fosse assim, os mais de 8 ~ 11 mil objetos que a JVM carrega em tempo de execução pesaria todo um servidor. Sem contar que ninguém tem um Pc/Server batatão (um pentium com 2gb de ram) ao ponto de não conseguir lidar com objetos que pesam bytes na memória e mesmo assim, isso nao seria um problema tão grande.

Objetos contêm complexidade procedural, encapsulando funções e variáveis de dados para reutilização e padronização na forma como dados são tratados.
Objetos também são muito úteis ao Serializar/Deserializar dados, enviá-los pela rede e, o mais importante de tudo, fornecer uma maneira de isolar comportamento externo. Por exemplo, usar um objeto Session bem definido em Java pra isolar o carregamento de código arbitrário pelo usuário aumenta muito a segurança e estabilidade geral do sistema, pois a Session, se não corrompida, pode ser anexada e, se corrompida, descartada.

Tudo o que usamos hoje em dia é semelhante a objetos: Tvs, smartphones, Caixa de ferramentas, fogão, geladeira... Qualquer coisa que tenha comportamento ou que contenha comportamento empacotado ou que pode conter tal comportamento pode ser um objeto.
Não tô dizendo que outros modelos ou paradigmas são um lixo, mas sim que expor esse pensamento é anti produtivo. Não quer usar? Não use. Não gosta? Apenas diga que não gosta. Mas tentar provar que tal coisa é um lixo, sendo
que parte do mundo que conhecemos é feito dessa forma é um pensamento bem imaturo.

Tem coisas que não gosto em python, js e outras linguagens, mas nem por isso desestimulo os outros a usarem. Eu desestimulo, sim, as pessoas a não fazerem merda. Até porque desenvolver software é uma tarefa séria e manipular dados privados de forma porca, só porque uma coisa não convém faz de você um péssimo profissional.

Num mundo onde a segurança dos dados se tornou algo preocupante e as máquinas estão ficando cada vez mais tunadas, argumentar sobre isso se tornou algo inviável. Devemos discutir sobre melhores técnicas de segurança de dados, melhores técnicas de modelagem de dados, independente do paradigma usado, melhores abordagens pra se iniciar o desenvolvimento de um software em larga escala nos dias atuais e não sobre esse tipo de discussão que parece ter morrido em 2014.

Enfim, seja um Dev, não um entusiasta. Aprenda a resolver os problemas dos outros e não criar mais problemas dos que já existem. Deixe otimizações com os mantenedores da linguagem e depois rode um profiler a cada update pra ver se a técnica que você usa ainda performa bem no mais baixo nivel, em escala de bytes, nibbles e ate bits.

Boa noite.

1

Tudo bem mano, sabemos que você não gosta de POO. Se não quiser usar, não use, mas não critique quem use.

Em nenhum momento eu critiquei quem usa. Eu apenas critiquei o paradigma e os argumentos feitos a favor dele. Então, por favor, não faça acusações falsas. Também digo o mesmo, se quer usar, use. (No entanto eu não recomendo. Foi por isso que fiz esse post. E a conclusão do meu post foi que se você ignorar POO seu código vai ficar mais simples. E quem não gostaria de ter código simples?)

E você não é o primeiro a fazer acusações falsas, outra pessoa disse que o exemplo que eu usei pra comparar procedural com OO foi "meio desonesto" de acordo com ela. Sendo que a métrica principal que eu usei foi linhas de códigos e o exemplo que eu peguei de OO foi justamente o com menor linhas de código! Eu escolhi cuidadosamente o exemplo para não ter nenhum comentário desse tipo, mas foi em vão.

Meus argumentos podem não ser a prova definitiva (porque isso seria impossível de provar, visto que não há uma "fórmula" que consiga fazer isso), no entanto acredito que levantei alguns pontos que valem a pena refletir.

Por exemplo, se você pesquisar 'why OOP is bad', ou algo similar, vai achar vários posts e pessoas criticando POO. Será que todas elas não entendem ou sabem do que estão falando? Se você pesquisar o oposto, vai achar pouco ou nada sobre. Então porque será que não tem posts/vídeos que mostram como POO é boa? Dá pra perceber que esses que defendem POO só aparecem quando alguém critica. Um exemplo disso é o vídeo do Brian Will. Um dos comentários com mais upvotes fala: "Actual title: "Overengineered solutions to simple problems are bad.", e esse comentário não tem sentido nenhum, porque os exemplos que ele deu foram de pessoas que são experientes com OO. Um dos exemplos é até do próprio Robert Martin! E ele mostra como a solução OO dele é mais complexa do que a solução procedural. E por isso eu acredito que a mentalidade de OO causa código complexo e não porque o programador é ruim.

E se mesmo depois de ler e entender meu ponto de vista, e ainda assim discordar, tudo bem. O importante é utilizar o pensamento crítico pra decidir se determinada coisa é boa ou não pra desenvolver software e também ser capaz de defender sua decisão. Porque muitos apenas repetem o que leem ou ouvem de livros/influenciadores/posts/vídeos sem saber do que está falando.

Eu nem li seu texto todo, mas li o suficiente pra saber bem do que você estava falando e o que você mais argumentou foi a complexidade do código e a má performance que isso pode trazer.

Sinceramente, isso foi o mais frustrante de ver nos comentários, as pessoas simplesmente leem por cima o post (um post que deu muito trabalho pra pesquisar e organizar as ideias) e depois comentam sem saber do que estão falando. Achei que o lugar 'massinha da internet' fosse diferente dos outros fóruns da net. Resolvi não excluir o post porque no fundo queria acreditar que no futuro, caso alguém esbarrasse no post, lesse o post, os links e também as réplicas e minhas tréplicas, pra assim fazer um comentário mais assertivo. Mas a realidade foi o completo oposto.

Eu posso te garantir que, em um sistema de gestão administrativa feito em Java e que gerencia milhões de objetos, o desempenho não cai. Se fosse assim, os mais de 8 ~ 11 mil objetos que a JVM carrega em tempo de execução pesaria todo um servidor. Sem contar que ninguém tem um Pc/Server batatão (um pentium com 2gb de ram) ao ponto de não conseguir lidar com objetos que pesam bytes na memória e mesmo assim, isso nao seria um problema tão grande.

Isso não faz o menor sentido. O que determina a performance não é a quantidade de objetos que tem em memória, mas sim como você acessa eles. O primeiro link sobre performance fala justamente sobre isso. De forma resumida, em um sistema OO os objetos são alocados em regiões diferentes de memória e isso causa vários cache misses que faz a CPU executar várias instruções para mover memória da RAM para o cache do processador. E isso também se aplica as V-Tables (tabelas virtuais) que são o mecanismo por traz dos métodos polimórficos. Se tiver interesse em saber mais sobre performance, recomendo o curso Performance-Aware Programming.

No segundo link sobre performance o palestrante mostra como a equipe dele trocou uma parte do sistema de animação do Chromium que era OO por um código Data-oriented, e afirma que teve vários benefícios, que inclui: melhor performance, mais fácil realizar testes automatizados e mais fácil manter/modificar.

Objetos contêm complexidade procedural, encapsulando funções e variáveis de dados para reutilização e padronização na forma como dados são tratados.

Você também consegue fazer isso com structs e funções.

Objetos também são muito úteis ao Serializar/Deserializar dados, enviá-los pela rede

Serializar/Deserializar não é exclusivo de Objetos. Por exemplo, em C, você consegue fazer isso com qualquer struct (mesmo com hierarquia de structs!) de forma trivial (desde que a struct não tenha ponteiros), usando fwrite e fread. Já num sistema OO você precisa criar/usar um algoritmo recursivo para ignorar qualquer coisa que não seja serializável. Por exemplo, em Java você teria que usar o ObjectInputStream e ObjectOutputStream, e a implementação deles são de ~2100 e ~1100 linhas de código respectivamente. Tudo isso de código pra fazer algo que deveria precisar apenas de umas ~10 linhas de código. (Usei o programa cloc pra contar as linhas de código.)

e, o mais importante de tudo, fornecer uma maneira de isolar comportamento externo. Por exemplo, usar um objeto Session bem definido em Java pra isolar o carregamento de código arbitrário pelo usuário aumenta muito a segurança e estabilidade geral do sistema, pois a Session, se não corrompida, pode ser anexada e, se corrompida, descartada.

Como não programa em Java, não conheço muito sobre esse objeto Session, mas pela descrição não parece ser algo que seja apenas possível utilizando objetos. Você pode simplesmente ter uma struct Session e funções que operam nela, sem a necessidade de acoplar os dois numa estrutura só.

Tudo o que usamos hoje em dia é semelhante a objetos: Tvs, smartphones, Caixa de ferramentas, fogão, geladeira... Qualquer coisa que tenha comportamento ou que contenha comportamento empacotado ou que pode conter tal comportamento pode ser um objeto.
Não tô dizendo que outros modelos ou paradigmas são um lixo, mas sim que expor esse pensamento é anti produtivo. Não quer usar? Não use. Não gosta? Apenas diga que não gosta. Mas tentar provar que tal coisa é um lixo, sendo
que parte do mundo que conhecemos é feito dessa forma é um pensamento bem imaturo.

Esse argumento não faz nenhum sentido pra mim. Então eu poderia criar a Programção Orientada a Átomos e dizer que seria imaturo pensar que tal mentalidade/paradigma é um lixo, visto que tudo no universo é feito de átomos. Além disso um dos maiores defensores da OO, Robert Martin, discorda totalmente dessa ideia que OO serve para modelar o mundo real. Como eu já disse acima eu não consigo provar que POO é um lixo, apenas tentar mostrar evidências que apontam pra isso. Tudo bem se você discorda, mas pelo menos tente embasar melhor sua argumentação.

Tem coisas que não gosto em python, js e outras linguagens, mas nem por isso desestimulo os outros a usarem.

Em nenhum momento desistimulei as pessoas a usarem alguma linguagem. De novo, eu apenas critiquei o paradigma.

Eu desestimulo, sim, as pessoas a não fazerem merda. Até porque desenvolver software é uma tarefa séria e manipular dados privados de forma porca, só porque uma coisa não convém faz de você um péssimo profissional.

Concordo, por isso que fiz esse post. Pra tentar quebrar o status quo de "boas práticas" que mais causam problemas do que ajudam. Mas esse status quo é muito forte. Em outro comentário eu disse que até tinha outros posts provocativos pra postar, mas depois de ver a péssima qualidade dos comentários e o extremo repúdio, isso me fez desistir. Eu não sou o primeiro e nem serei o último a criticar POO.

E acredito que Casey Muratori tenha as melhores críticas contra OO. Segundo ele o problema está em 'orientar' seu software com objetos, ou seja, os objetos serem a peça central do seu código, e não os objetos em si. Recomendo esse post e esse. E também uma palestra recente sobre a história da POO.

O que significa 'manipular dados privados de forma porca' e como isso se relaciona com ser um péssimo profissional? Em que momento eu incentivei a fazer um trabalho porco?

Num mundo onde a segurança dos dados se tornou algo preocupante e as máquinas estão ficando cada vez mais tunadas, argumentar sobre isso se tornou algo inviável. Devemos discutir sobre melhores técnicas de segurança de dados, melhores técnicas de modelagem de dados, independente do paradigma usado, melhores abordagens pra se iniciar o desenvolvimento de um software em larga escala nos dias atuais

Fique a vontade para discutir sobre esses assuntos, basta criar seu post no Tabnews.

Um dos argumentos que os defensores de POO usam é que POO é mais adequada para software grandes e complexos. Isso eu abordei no meu post. Mas, agora imagina que algum dia alguém consiga provar que POO não é a melhor maneira de iniciar um projeto de larga escala? Não teria sido melhor ter analisado os argumentos das pessoas que criticaram pra tentar chegar numa solução melhor?

não sobre esse tipo de discussão que parece ter morrido em 2014.

E o mais irônico é que você desenterrou um post de quase dois anos de idade e com vários downvotes só pra discutir sobre isso. Mas olhando de novo pra esse tópico e baseado nas outras discussões online, percebi que falar sobre OO é puro bike shedding, já que até mesmo entre as pessoas que defendem não conseguem chegar a um consenso sobre o que realmente é OO.

Enfim, seja um Dev, não um entusiasta. Aprenda a resolver os problemas dos outros e não criar mais problemas dos que já existem. Deixe otimizações com os mantenedores da linguagem e depois rode um profiler a cada update pra ver se a técnica que você usa ainda performa bem no mais baixo nivel, em escala de bytes, nibbles e ate bits.

Ter uma opinião formada, embasada e escrito um post sobre isso não torma de mim um entusiasta. De certa forma, eu estou tentando resolver os problemas dos outros, como disse na minha conclusão do post, o seu código ficará mais simples se ignorar POO. Se você olhar no ecossistema JavaScript verá que tem muitas pessoas que reescreveram ferramentas de JavaScript para Rust ou Go para ter maior performance. Não é algo nichado como muitos pensam. Tem um vídeo do Casey Muratori que mostra várias empresas grandes que reescreveram a stack inteira para melhorar a performance, porque isso tinha um impacto direto no faturamento da empresa. E de novo você faz mais uma acusação, quais problemas eu estou criando?

Pra concluir, o seu comentário parece uma tentativa de censura. Vivemos num país com liberdade de expressão. Se você não gosta do que eu escrevo, então não leia (Esqueci, você não leu mesmo). E isso pra mim isso revela total falta de maturidade emocional. Parece que você ficou ofendido com a minha crítica porque OO é seu paradigma preferido e sentiu a necessidade de desenterrar o post e me censurar. Além disso você já conseguiu essa censura, nunca mais eu postei algo sobre POO aqui no Tabnews depois de ver a reação tão negativa e comentários tão ruins.

E também foi extremamente ridículo você tentar dar 'liçãozinha' de moral em mim.

1

1° - eu não li tudo porque eu não tenho o mesmo tempo que o seu pra escrever um post gigantesco.
2 - eu nem se quer vi que você havia escrito isso há 2 anos. Na verdade, eu nem se quer uso redes sociais pra falar a verdade. Aparece uma notificação de notícias que o google me recomenda e, por incrível que pareça, seu post apareceu :)
3 - POO não é meu "paradigma preferido". Só pra você saber, eu inicio meus projetos sem usar POO. Com o tempo que vou vendo a necessidade de usar modelos e então os implemento. Isso faz POO ser meu estilo de programação favorito? Não. Eu gosto de Java e ponto. Também gosto de C++, bash, SQL... Meu mundo não é so feito de POO. Minha contribuição aqui, do qual você chamou de censura, toca no cerne da questão de que a tecnologia hoje em dia é embasada no uso de objetos. Se fossem tão ruins assim, nunca teriam sido implantados no passado. Se eles foram implantados, é porque havia uma necessidade. A partir disso, a computação evoluiu em prol da escalabilidade desse paradigma de programação. Hoje em dia temos computadores tão potentes que um cache miss ou outro não faz diferença. Eu sei como as referências são acessadas na memória e quais instruções de CPU são executadas pra direcionar ponteiros. Estou ciente disso. E te digo mais: nada é perfeito. Erros sempre vão existir independentemente do uso de objetos ou não. O que define a taxa de sucesso é você, não uma linguagem, um paradigma... Se você não souber executar seu trabalho, você vai mais atrapalhar do que ajudar.
"Ah, mas usa-se objetos pra tudo?"
Não. É obvio que não. Você não vai usar objetos em um arduíno, por exemplo. A não ser que seu objetivo seja específico e você tenha os módulos expansores de memória certos. Cada coisa no mundo de hoje tem seu lugar.
4° - Você fazer um post dessa magnitude com todas aquelas críticas não é desincentivar alguém a não usar uma ferramenta? Cara, você praticamente descredibilizou TODOS os avanços que foram feitos dos anos 90 até hoje! Você ainda espera que alguém te responda com sorrisos e flores? Se não queria ter essas respostas, era só não postar, ou então postar algo mais justo, porque nada têm só um lado ruim como você argumentou. Até nessa resposta que você me deu, o que você fez foi dizer que isso e aquilo é "facilmente" alcançável por structs... Mano, se você faz assim e funciona, parabéns! Mas não tente usar isso como uma solução nuclear. Ninguém gosta disso e isso só cria uma imagem de "programador novato" sobre você.
"ah, mas se fosse algo que realmente não desse certo?", todo mundo ia cair matando igual a você! Estaria todo mundo aqui concordando com você. Por exemplo, BrainFuck e a linguagem de emojis não são linguagens de programação e não servem pra nada. Todos aqui concordam.
Concordam também quando digo que vibe coding representa sérios riscos de segurança quando usado somente IAs para produzir um aplicativo ou sistema. Agora sobre a pauta que você levantou? Se há muita divisão ou até pessoas contra você, isso indica que ou você está errado ou é meio verdade, mas você expressou de maneira radical algo que deveria ser tratado com mais justiça dos fatos...
Digo aqui de novo, eu odeio python por ser algo muito modinha, mas eu reconheço que python é bom pra IA, machine learn, tratamento de dados e prototipagem. Eu amo Java, mas reconheço que tem coisas nele que deveriam ser melhoradas ou que eu não gosto. É assim que se cria um ponto argumentativo sobre algo, de forma justa, vendo seus pontos positivos e negativos. Isso cria debates estáveis e talvez você tenha até mais êxito em provar seu ponto. Agora do jeito que você fez? E depois eu que sou o "ditador"? Essas suas respostas e seu post só me faz pensar que você é novato mano. Foi mal, mas é isso.

Se você se ofendeu com algo que eu disse, eu peço perdão por isso, mas sobre meus argumentos, eu nao os retiro.

1

Parece que você mal leu meu comentário e insiste em fazer os mesmos argumentos que eu já rebati.


1° - eu não li tudo porque eu não tenho o mesmo tempo que o seu pra escrever um post gigantesco.

Então porque comentar sobre algo que você não sabe? Essa foi minha crítica 1º contra os comentários feitos aqui.

Como já disse no comentário acima:

Sinceramente, isso foi o mais frustrante de ver nos comentários, as pessoas simplesmente leem por cima o post (um post que deu muito trabalho pra pesquisar e organizar as ideias) e depois comentam sem saber do que estão falando.


2 - eu nem se quer vi que você havia escrito isso há 2 anos.

Pra alguém que nem sequer leu o post direito, é compreensível.

3 - POO não é meu "paradigma preferido". Só pra você saber, eu inicio meus projetos sem usar POO.

Ok e daí? Por que ir nessa tangente? Não tenho interesse no modo que você programa. A discussão é sobre se OO é lixo ou não.

cerne da questão de que a tecnologia hoje em dia é embasada no uso de objetos.

Não, não é. Isso é apenas sua interpretação de OO. De novo, leia o que eu comentei acima:

percebi que falar sobre OO é puro bike shedding, já que até mesmo entre as pessoas que defendem não conseguem chegar a um consenso sobre o que realmente é OO.


Se fossem tão ruins assim, nunca teriam sido implantados no passado. Se eles foram implantados, é porque havia uma necessidade.

No passado eles não sabiam se isso seria algo bom ou ruim. De novo, recomendo você assistir essa palestra. E também como eu disse no post:

POO tornou-se amplamente utilizado devido à popularidade de C++ e Java, não porque seja inerentemente bom.


Hoje em dia temos computadores tão potentes que um cache miss ou outro não faz diferença.

Sim, os computadores conseguem compensar até certo ponto a perda de performance, mas quando não consegue, remover OO torna o software mais performático.

nada é perfeito. Erros sempre vão existir independentemente do uso de objetos ou não. O que define a taxa de sucesso é você, não uma linguagem, um paradigma... Se você não souber executar seu trabalho, você vai mais atrapalhar do que ajudar.

Minha argumentação é que o mentalidade de OO é ruim, e que gera código com maior complexidade. Como já disse anteriormente:

Um exemplo disso é o vídeo do Brian Will. Um dos comentários com mais upvotes fala: "Actual title: "Overengineered solutions to simple problems are bad.", e esse comentário não tem sentido nenhum, porque os exemplos que ele deu foram de pessoas que são experientes com OO. Um dos exemplos é até do próprio Robert Martin! E ele mostra como a solução OO dele é mais complexa do que a solução procedural. E por isso eu acredito que a mentalidade de OO causa código complexo e não porque o programador é ruim.


"Ah, mas usa-se objetos pra tudo?" Não. É obvio que não.

Não, não é óbvio. Muitos posts/vídeos/livros promovem apenas o lado "bom" de OO. Então alguém que começa na área de programação acaba sendo influenciado a pensar que OO resolve tudo. E isso fica ainda mais agravante quando posts como o meu acabam enterrados com downvotes.

Você não vai usar objetos em um arduíno, por exemplo. A não ser que seu objetivo seja específico e você tenha os módulos expansores de memória certos. Cada coisa no mundo de hoje tem seu lugar.

Sinceramente não entendo sua argumentação aqui. O que tem haver 'módulos expansores de memória' com objetos?

4° - Você fazer um post dessa magnitude com todas aquelas críticas não é desincentivar alguém a não usar uma ferramenta?

Primeiro você acusou que eu critiquei as pessoas que usam POO. Depois, que eu desincentivei a usar linguagens, agora você mudou pra ferramenta. Você consegue ver que você não está sendo coerente com você mesmo?

Cara, você praticamente descredibilizou TODOS os avanços que foram feitos dos anos 90 até hoje!

Que avanços? Sinceramente não entendo esse tipo de argumentação vaga que as pessoas fazem.

Você ainda espera que alguém te responda com sorrisos e flores? Se não queria ter essas respostas, era só não postar,

Não espero, mas o que eu esperava era que as pessoas LESSEM os post inteiro e os links mencionados ANTES de comentar abobrinha.

ou então postar algo mais justo, porque nada têm só um lado ruim como você argumentou.

Já que você gosta de comparações com o mundo real, vou dar um exemplo: fumar faz mal a saúde, mas tem muita gente que fuma e mesmo que você fale pra ela parar e mostrar os malefícios, ela vai continuar fumando. O que eu quero ilustrar é que existem sim coisas no mundo que são 100% ruins. No entanto como eu já disse anteriormente:

Meus argumentos podem não ser a prova definitiva (porque isso seria impossível de provar, visto que não há uma "fórmula" que consiga fazer isso), no entanto acredito que levantei alguns pontos que valem a pena refletir.


Até nessa resposta que você me deu, o que você fez foi dizer que isso e aquilo é "facilmente" alcançável por structs... Mano, se você faz assim e funciona, parabéns! Mas não tente usar isso como uma solução nuclear.

"Não tente usar como solução nuclear", o que isso significa? Você tem algum ponto objetivo e negativo sobre meu código ou só está sendo do contra por capricho? Você não gosta de código fácil? De novo, o código com structs, principalmente no caso de serializar/deserializar é extremamente mais simples do que o código OO, mas parece que você ainda não entendeu isso e tem zero contra argumentos sobre isso.

"ah, mas se fosse algo que realmente não desse certo?", todo mundo ia cair matando igual a você! Estaria todo mundo aqui concordando com você.

De novo, eu já disse que não sou o único a criticar OO. E também, as pessoas não concordam porque elas tem diferentes interpretações do que é OO. Até mesmo quem defende não chega num consenso! Como eu já disse, essa discussão é puro bike shedding.

Eu não sou o primeiro e nem serei o último a criticar POO.

percebi que falar sobre OO é puro bike shedding, já que até mesmo entre as pessoas que defendem não conseguem chegar a um consenso sobre o que realmente é OO.


Se há muita divisão ou até pessoas contra você, isso indica que ou você está errado ou é meio verdade, mas você expressou de maneira radical algo que deveria ser tratado com mais justiça dos fatos...

Se estou errado, então basta fazer uma contra argumentação clara e embasada. Mas de novo:

percebi que falar sobre OO é puro bike shedding, já que até mesmo entre as pessoas que defendem não conseguem chegar a um consenso sobre o que realmente é OO.

Fique a vontade para fazer um post com mais "justiça" já que OO foi tão "injustiçado" assim.


É assim que se cria um ponto argumentativo sobre algo, de forma justa, vendo seus pontos positivos e negativos. Isso cria debates estáveis e talvez você tenha até mais êxito em provar seu ponto.

Mas se eu não identifiquei pontos positivos de OO, então como vou falar de forma positiva? As pessoas reagem de forma mais emocional do que racional sobre esse tema. Quando algém 'ataca' OO, elas veem como um ataque a ela mesma. Teve até um comentário aqui que falou sobre isso:

Gente que não entende nada de POO e ama muito um paradigma vai rebeixar sua postagem e ela vai sumi no limbo do tabnews.

Eu dei os pontos negativos, então as pessoas poderiam muito bem argumentar os pontos positivos. Isso por si só seria um debate estável. Não há nenhuma necessidade de uma repulsa tão grande como foi aqui nos comentários.


Agora do jeito que você fez? E depois eu que sou o "ditador"?

E sim, você é o "ditador". Eu apenas critiquei o paradigma. Eu não tentei censurar ninguém a fazer algo, apenas tentei mostrar evidências de que OO não é boa. Se meus argumentos não são convicentes, ok, fique a vontade para discordar. Mas não há nenhum motivo pra me desincentivar a não falar mais sobre esse assunto de forma negativa.


Essas suas respostas e seu post só me faz pensar que você é novato mano. Foi mal, mas é isso.

Diz o cara que não embasou em nada sua argumentação... ¯\_(ツ)_/¯

Se você se ofendeu com algo que eu disse, eu peço perdão por isso, mas sobre meus argumentos, eu nao os retiro.

Só achei ridículo e mal argumentado mesmo.

1

🥱🥱 tá bom, cara. Vou ficar dando palco pra maluco aqui não. Já saquei qual é a sua. Malucos querendo dar pitaco nas coisas que pouco conhece, querendo se parecer o dono do mundo, vão existir em qualquer lugar, infelizmente...

Bom, fica aí falando com as paredes 👍🏽

1

🤣🤣🤣 Ganhei o dia com o seu comentário.

Agora ficou mais do que provado que você não tem nenhum contra argumento e ainda baixou o nível por me insultar me chamando de maluco.

Esse é dos motivos do porque que não dá pra ter uma discussão razoável com alguém que defende OO. Realmente patético e sem educação sua atitude.

0
8

Poderia elaborar porque a versão dele é "infinitamente mais simples" que a minha?

No post eu não entrei em detalhes do porquê eu acredito que minha versão seja mais fácil de ler e entender. Então, vou explicar aqui. Na minha versão eu removi dois arquivos e um design pattern e no geral simplifiquei a estrutura e reduzi o número de linhas de código. Agora tudo fica centralizado na função updateGame. Além disso, otimizei a lógica de colisão com as frutas, ao invés de iterar por todas as frutas pra verificar a colisão, eu criei um dicionário com as coordenadas x e y da fruta como id. Assim ao invés de ser O(n), fica O(1).

0

Esse -7 no seu post pode indicar duas coisas: ou é um completo absurdo o que foi dito, ou faz todo o sentido e você está enfrentando um establishment na área de software. Milhares de paralelos atualmente no mundo real existem dessas situações, desde vacinas, combustível alternativo, cura do câncer, até sutilezas como malefícios da pasta de dente, BBB (big brother brasil (alô, 1984?)) ou sumiço do botão de deslike do YouTube.

Dito isso, orientação a objetos veio para tentar resolver um problema que existia. As regras da OO parecem simples até você mexer em um legado mal feito usando tudo que OO tem de bom. Vão alegar que é culpa de quem fez que não entendia o conceito ou como aplicar OO. Ora, o avião foi inventado para revolucionar o transporte, em seguida foi usado para guerras e mortes. Bomba atômica o mesmo. Depende da pessoa mas também a invenção em si pode levar muitos para o buraco, e OO não é diferente. Podemos ir além, trabalhar com programação em si só vai destruir tua saúde física e mental, homens biologicamente sempre foram ativos fisicamente, ciência não faz ideia do custo disso na humanidade como um todo. Só são recortes aqui e ali.

Minha conclusão é que precisamos disso, da discordância, debate, livre fluxo de ideias. Pelo menos enquanto dá. Todos aprendem. Se é proibido ou censurado, formalmente ou não, formam-se bolhas e poucos terão acesso ao conhecimento. E já dizia a Bíblia... por falta de conhecimento...

7

Se é um completo absurdo, então eu gostaria de uma boa contra-argumentação. Mas acredito que seja o establishment mesmo. No vídeo do Brian Will - Object-Oriented Programming is Embarrassing: 4 Short Examples tem uns 18 mil dislikes e uns 29 mil likes.
Então, é muito forte na cultura de programação que POO é útil em certos casos, daí surge essa controvérsia.

Orientação a objetos veio para tentar resolver um problema que existia

Mas que problemas? Essa é a grande questão. Em quê a POO é útil?

Minha conclusão é que precisamos disso, da discordância, debate, livre fluxo de ideias.

Concordo. No meu primeiro post eu fiz algumas reflexões sobre minha experiência em programação. Foi mais um desabafo contra conceitos tão difundidos na cultura de programação que são regurgitados de um programador para outro. Poucos param para pensar criticamente sobre esses conceitos e ver se têm algum valor. Obviamente tudo isso é minha opinião baseada na minha experiência e também em outros programadores, com mais experiência que eu, que também compartilham das mesmas ideias.

1

Bom, estou no mercado a cinco anos apenas, não tenho a bagagem necessária para te dar uma boa resposta sobre OO.

O que senti na pele, e sinto até agora, é que tudo é bonito na teoria,até você pegar algo mal projetado em OO. Quando você pega uma herança, polimorfismo, genérics mal projetados e não documentados, se torna um inferno, você vai estar na posição que outro dev estava mas ele sabia, supõe-se, o que estava fazendo. Mesma coisa testes, ninguém fala de manutenção de testes, mas enfim, muitos não estão preparados para essa conversa. Muitos entraram em startup com dinheiro jorrando onde havia 0 accountability do que era feito e ficaram com essa experiência, das mais modernas, e mais fantasiosas. Aquela taxa de juros de 2% no Brasil foi uma benção para uns poucos que vai custar décadas para outros.

0

cara, eu não tive tempo de ler e analizar todos os seus links, mas me explica uma coisa... Como vc trabalharia com desenvolvimento WEB sem utilizar POO?
Não digo q seja impossível, mas seu projeto ficará completamente esquisito e estranho... A estrutura MVC para desenvolver para a WEB é uma das coisas mais fáceis do mundo, mas vc precisa de OO para implementa-la.
Eu queria realmente q vc me esclarecesse isto, pois vi muitos exemplos com C++ e Java, e até um com JS, mas não vi nada com PHP, Python...
Outro ponto também, como hoje em dia vc desenvolveria na área de Machine Learning sem utilizar OO com as bibliotecas como TF, PyTorch... Aí sim vc teria uma perda de performance .