Sempre tendi a culpar a popularidade do C pela necessidade de uma linguagem assembly universal. Sua combinação de especificidade no nível da máquina, padronização e extrema portabilidade permite que o C funcione como essa linguagem assembly universal de fato e, por esse motivo, desconfio que seu papel continuará indefinidamente.
Devo mencionar que sempre fico surpreso quando o OOP é apresentado nos cursos de programação como uma espécie de "modelo final" que é o único ponto final possível para uma boa programação. Como muitos outros aspectos da programação, o valor da OOP é um compromisso entre muitos fatores concorrentes, incluindo como os cérebros humanos organizam as informações, como os grupos sociais apóiam o software a longo prazo e, no caso da programação orientada a objetos, alguns aspectos bastante profundos de como o próprio universo funciona.
E esse último ponto vale a pena martelar um pouco. Leia mais se você estiver interessado em uma exploração no nível da física de por que certos estilos de programação existem, como eles funcionam juntos e para onde o mundo está indo no futuro, à medida que expandimos ainda mais esses conceitos ...
Um objeto na física é qualquer coisa que mantenha coerência reconhecível ao longo do tempo. Isso, por sua vez, permite que criaturas simples como nós passemos a representar o objeto usando apenas um pequeno número de bits, sem comprometer muito nossa sobrevivência. Mas em termos de física em geral, o número de coisas que você precisa acertar para tornar esse tipo de simplificação fácil e comum é notavelmente grande. Como seres humanos, não pensamos em tudo isso porque, francamente, não estaríamos aqui se não fosse verdade.
Parece muito abstrato? Realmente não é. Imagine, por exemplo, tentar navegar pela estrada para a casa de seu amigo se, em vez de carros, você encontrar campos de plasma que oscilam rapidamente e condensações momentâneas de matéria se movendo com uma enorme variedade de velocidades. Esse cenário pode se aprofundar bastante nas oportunidades de socialização, certo? Precisamos de objetos, que são objetos, e a existência de objetos nos proporciona um nível enorme e extremamente importante de simplificação do ambiente que nos rodeia.
Então, vamos colocar tudo isso de volta no software. O que objetos no mundo real têm a dizer sobre objetos em termos de programação?
Bem, por um lado, significa que o que define um objeto "bom" no software deve ser realmente se o tipo de dados que você está manipulando prontamente suporta a idéia de persistência reconhecível ao longo do tempo .
Com a definição, as formas mais fáceis de POO são fáceis de serem reconhecidas. Eles são os únicos que conseguem entender um pouco, usando apenas dados que já estão "anexados" ou definidos por algum objeto verdadeiramente físico do mundo real, como uma pessoa, casa ou carro. Ainda hoje, essa ainda é a única definição de objetos que as pessoas obtêm nos cursos de software. Isso é muito ruim, porque mesmo programas triviais de orientação a objetos precisam de uma definição mais ampla do que isso.
A segunda e muito mais interessante categoria de objetos consiste no que chamarei de eventos imortalizados do mundo real . Por "imortalizado", quero dizer coisas que pelo menos brevemente existem como uma entidade ou coleções bem definidas no mundo real, mas que depois se dispersam e deixam de existir como coleções fisicamente significativas. Um simpósio é um ótimo exemplo: o simpósio existe por um curto período como uma coleção decentemente bem definida de lugares e pessoas. Mas, infelizmente, mesmo as melhores conferências devem terminar, e as partes individuais que as criaram passam para outras atividades.
Mas, usando computadores e redes, podemos fazer com que um simpósio transitório pareça um objeto de longo prazo, capturando e mantendo uma memória dele como um objeto de software. Muitas das coisas que fazemos com computadores e bancos de dados equivalem a esse tipo de imortalização de eventos transitórios, nos quais tentamos, de fato, tornar nosso universo real mais rico, capturando e estendendo-o de maneiras que não podem existir fisicamente. Por exemplo, você viu um Pandora real ultimamente? Tais capturas e extensões de peças do mundo real ajudam a enriquecer e prolongar nossas próprias vidas, economias e escolhas de maneiras notáveis. Isso para mim é o coração da programação orientada a objetos, o lugar onde ela teve e continua a ter os impactos mais notáveis.
Uma categoria final de OOP consiste em objetos que não têm conexão estreita com eventos externos, mas são a infraestruturanecessário para apoiar nossa extensão contínua da realidade usando objetos imortalizados do mundo real. É aqui que você pode descer até o (semi) metal do computador, criando pedaços de realidade persistente que, como os elementos químicos do mundo real, podem ser combinados rapidamente e de maneiras interessantes para construir novos mundos internos. A computação móvel ajudou a promover o crescimento desse tipo de abordagem altamente recombinatorial, que novamente imita de várias maneiras os recursos recombinatórios do mundo físico. Também é difícil: o que pode parecer uma boa escolha ao longo do tempo pode ter sido inesperadamente ruim, geralmente porque acaba bloqueando a diversidade e a expansão, em vez de apoiá-la.
Essa última categoria também aponta os riscos de usar apenas um modelo para programação, pois, assim como o mundo real, os mundos programados também precisam de processos que nãocorrespondem bem a objetos relativamente imutáveis. A Terra está cheia de objetos, mas o sol está cheio de fluxos de energia altamente dinâmicos que são necessários para "dirigir" os objetos e atividades na Terra de menor energia. Da mesma forma, na criação de mundos da computação, há casos em que você deve lidar com fluxos e transformações e contextos em rápida mudança que, embora não sejam muito parecidos com objetos, são absolutamente críticos para permitir que objetos mais simples e amigáveis ao ser humano sejam usados em níveis mais altos . Não é por acaso que grande parte da programação feita no nível do kernel não é visivelmente semelhante a um objeto ou tende a depender fortemente de linguagens como C, mais orientadas ao processamento. Esses são os domínios mais profundos que complementam a diversidade fascinante que vemos mais no mundo gerado por computador.
A outra área em que o OOP pode dar errado está se concentrando demais nos conceitos de objetos antigos .
Objetos no mundo real, e especialmente objetos vivos , têm um nível absolutamente surpreendente de capacidade de interagir com seus ambientes de maneiras complexas e sutis. Os widgets compostas que se examinam, fazem algumas verificações de compatibilidade e sanidade e talvez até descobram novas maneiras de interagir se aproximam muito do conceito biológico de objetos do mundo real do que as estruturas simples e os esquemas simples de herança que tendemos focar (geralmente por necessidade!) no nível do código. Essa é uma das áreas de crescimento de objetos no mundo cibernético, quanto mais abordagens "semelhantes a agentes", onde a reatividade ao meio ambiente é a norma, mesmo na própria programação.
E muito pela minha "crítica" ao POO! Ainda assim, espero ter apontado por que criar um mundo cibernético mais rico significa abranger a diversidade de estilos de programação, em vez de assumir que "apenas um" é tudo o que é necessário. Meu sentimento é que as coisas realmente interessantes ainda estão por vir, não importa quão mundano seja o que fazemos agora!