Um dia, fui a um bate-papo do Stack Overflow e vi uma frase que dizia que herança, incapsulação e polimorfismo são os pilares da OOP (no sentido de que são fundamentais, uma construção exclusiva).
Além disso, há uma pergunta semelhante, que me fizeram muitas vezes em exames universitários e entrevistas de emprego, e a resposta certa sempre foi a afirmação pronunciada no título da pergunta ("Sim, herança, encapsulamento e polimorfismo são os pilares da OOP )
Mas no bate-papo do Stack Overflow eu fui severamente ridicularizada, os participantes discordaram fortemente dessa afirmação. Então, o que há de errado com essa afirmação?
Os programadores parecem ser treinados em coisas diferentes nas faculdades pós-soviéticas e nos Estados Unidos?
Herança, encapsulamento e polimorfismo não são considerados os pilares da POO pelos programadores dos EUA / Reino Unido?
fonte
Respostas:
Eles são considerados pilares por muitos programadores, e muitas faculdades ensinam OO dessa maneira.
Infelizmente, é também uma visão míope.
OOP tem muito pouca base, pois, na realidade, é muito conceitual: "Aborde o design do seu programa pensando nas coisas como objetos - pacotes coesos de dados e funcionalidade".
E embora o design moderno do programa tenha uma visão ruim de fazer as coisas "de maneira puramente OO", a maioria dos programadores qualificados concorda que os princípios do SOLID (ou algum subconjunto) são melhores candidatos aos "pilares da programação orientada a objetos" (mesmo que eles aplicar bem a não OOP). Eles não funcionam com esses termos. Em vez disso, eles usam os conceitos de entidades de software (das quais objetos são um), interfaces (das quais, C # / Java / etc.
interface
), Abstração e sub-digitação (das quais herança é uma forma).fonte
tl; dr: Você pode ter herança sem OO, pode ter encapsulamento sem OO, pode ter polimorfismo sem OO, pode até ter os três ao mesmo tempo sem OO. Por outro lado, você pode ter OO sem herança. Além disso, existem diferentes tipos de encapsulamento (orientado ao ADT e OO), nem todas as encapsulamentos são OO.
Versão longa:
O termo "Programação Orientada a Objetos" foi inventado por Alan Kay, então ele decide o que significa. E ele define desta maneira :
Em termos de implementação, o sistema de mensagens é uma chamada de procedimento com limite tardio e, se as chamadas de procedimento são limitadas com atraso, não é possível saber em tempo de design o que você chamará, portanto, não é possível fazer suposições sobre a representação concreta do estado. Então, realmente se trata de mensagens, a ligação tardia é uma implementação de mensagens e o encapsulamento é uma conseqüência disso.
Mais tarde, ele esclareceu que " a grande idéia é ' enviar mensagens' " e lamenta tê-la chamado de "orientado a objetos" em vez de "orientado a mensagens", porque o termo "orientado a objetos" coloca o foco na coisa sem importância (objetos ) e distrai o que é realmente importante (mensagens):
(É claro que hoje em dia a maioria das pessoas nem se concentra nos objetos, mas nas classes, o que é ainda mais errado.)
As mensagens são fundamentais para o OO, tanto como metáfora quanto como mecanismo.
Se você envia uma mensagem a alguém, não sabe o que ela faz. A única coisa que você pode observar é a resposta deles. Você não sabe se eles próprios processaram a mensagem (por exemplo, se o objeto possui um método), se encaminharam a mensagem para outra pessoa (delegação / proxy), se eles a entenderam. É disso que se trata o encapsulamento, do OO. Você não pode nem distinguir um proxy do real, desde que ele responda como você espera.
Um termo mais "moderno" para "sistema de mensagens" é "envio dinâmico de método" ou "chamada virtual de método", mas que perde a metáfora e se concentra no mecanismo.
Pontos semelhantes também são apresentados em On Understanding Data Abstraction, revisitado por William R. Cook e também em sua Proposta de definições modernas e simplificadas de "Objeto" e "Objeto Orientado" .
No Smalltalk-72, não havia nenhum objeto! Havia apenas fluxos de mensagens que foram analisados, reescritos e redirecionados. Primeiro vieram os métodos (maneiras padrão de analisar e redirecionar os fluxos de mensagens), depois vieram os objetos (agrupamentos de métodos que compartilham algum estado privado). A herança veio muito mais tarde, e as classes foram introduzidas apenas como uma maneira de apoiar a herança. Se o grupo de pesquisa de Kay já soubesse sobre protótipos, eles provavelmente nunca teriam introduzido aulas em primeiro lugar.
Todo programador deve ler Sobre a compreensão da abstração de dados, revisitada . Explica em detalhes qual é exatamente a diferença entre Objetos e Tipos de Dados Abstratos. Ele dá exemplos usando Java, e que é extremamente relevante para esta pergunta, porque em ambos os exemplos ADT e os exemplos de objetos que ele usa herança, encapsulamento e polimorfismo, mas somente um é orientada a objetos dos exemplos! Em outras palavras: você pode ter herança, encapsulamento e polimorfismo, pode até ter os três ao mesmo tempo e ainda não ter OO.
Por outro lado, você pode ter OO sem herança. Como sugeri acima: as versões originais do Smalltalk (a linguagem projetada por Alan Kay, o inventor do termo "Programação Orientada a Objetos") não tinham herança.
Por fim, mas certamente não menos importante, o Tratado de Orlando discute a delegação como uma alternativa à herança e como diferentes formas de delegação e herança levam a diferentes pontos de design dentro do espaço de design das linguagens orientadas a objetos. (Observe que, mesmo em linguagens que suportam herança, como Java, as pessoas são ensinadas a evitá-la, indicando novamente que não é necessário para o OO).
fonte