Executando verificação de segurança...
2

Ola, Gustavo.

Sua reflexão é bem interessante e eu pessoalmente me identifico com ela, pois percebi algo parecido quando estava aprendendo programação. Em especial, naquele momento que comecei a aprender os primeiros conceitos de orientação a objetos, olhei para meus primeiros algoritmos e tentei inaginar como faria para aplicar esse conceito a eles.

Eu gosto muito de ambos os paradigmas - Orientado a Objetos e Funcional - e tendo vivenciado programar com ambos por quase uma década em aplicações comerciais, constatei as linguagens de programação mais populares (Java, C#, JavaScript, PHP, Python, etc) bebem das duas fontes. A programação pragmática aplicada no mercado de trabalho tende a explorar as particularidades de cada um onde isso tornar o código mais expressivo, fácil de construir e manter. Tanto que linguagens puristas, como SmallTalk (em OOP) ou Haskell (em FP) tendem a ter uma difusão mais restrita.

Não que eu desencoraje que linguagens mais puristas sejam exploradas, pelo contrário. Desenvolver um projeto em Haskell, por exemplo, para quem tem uma base forte em OOP num primeiro momento pode parecer frustrante, mas é extremamente enriquecedor em termos de encontrar novas abordagens de resolver problemas e nos tornar melhores programadores de forma geral. Aprender FP pode te tornar um melhor programador OOP, ainda que isso possa parecer contraditório, já que pode te deixar consciente das limitações do paradigma e de como contorná-las da melhor forma possível.

Indo à sua questão, acredito que muito do criticismo sobre OOP é devido a tipo de programação predominante atualmente, ao menos quando falamos em software empresarial. Compare com qualquer outra ciência e vai ver que tudo que é status quo em um momento é alvo de maiores ponderações.

Com isso, quero dizer que OOP é perfeita? Certamente que não. É um paradigma muito rico conceitos e te dá muitas possibilidades de estruturar um projeto que, às vezes, pode te levar a construir software de uma forma que dificulta a manutenabilidade. Porém, isso é questão de maturidade e maestria para aplicar os conceitos de formas positivas.

Muita gente argumenta que aplicar OOP pode deixar seu código difícil de manter. Dependendo de como, isso é verdadeiro, mas com FP, é possível terminar com o mesmo problema. O conceito de currying é muito bacana, por exemplo, mas dependendo de como é aplicado, pode diminuir a legibilidade e dificultar a manutenção de um código se mal aplicado.

Sobre OOP e boas práticas, eu diria que os conceitos principais precisam ser bem compreendidos, mas a aplicação deles tem que ser cuidadosa. Herança, por exemplo, é um conceito muito interessante e útil, mas sua aplicação tem que muito cuidadosa e restrita para evitar terminar com um codigo que é desnecessariamente complexo.

Eu diria para focar no âmago do paradigma - que é sobre trocas de mensagens entre objetos -, e priorizar sempre a composição em relação a herança.

Da mesma forma, aplicar conceitos de FP quando eles facilitam a compreensão e manutenabilidade do código, como funções de primeira ordem. Que dependendo do caso, usar métodos estáticos não é nenhum crime e pode ser a melhor forma de resolver um dado problema (funções de utilidades, por exemplo).

Por fim, lembrar que código bom é que código que é seguro, veloz, que pode ser facilmente compreendido e mantido por diferentes pessoas.

Carregando publicação patrocinada...