Por que herança, encapsulamento e polimorfismo não são os pilares da OOP? [fechadas]

16

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?

PaulD
fonte
7
Sua pergunta não tem contexto; não sabemos o que as pessoas no chat do SO estavam pensando ou para o que estavam respondendo. Talvez você possa vincular a conversa na sala de bate-papo, para que possamos dar uma olhada nela? Dito isto, acho que é melhor resolver isso na sala de bate-papo do que aqui.
Robert Harvey
1
@ Robert, tempo passado demais. Duvido que consiga encontrar o link para a conversa. Mas concordo que o contexto é importante. Não é para culpar alguém, ou para me apresentar como vítima inocente de uma agressão por bate-papo, só quero saber a verdade.
PaulD 12/08
5
Salão. Você vestiu seu traje à prova de fogo primeiro?
Robert Harvey
1
Os únicos significados que posso dar à sentença é "você pode ter OOP sem nenhum deles" (é verdade, mas não faz sentido, pelo menos, para encapsulamento) ou "você pode usá-los fora do OOP também", ou algo assim.
precisa saber é o seguinte
2
O Imo OO possui apenas um pilar e é: "Estado". Quando seu cérebro pensa em estado, você recebe OO.
Pieter B

Respostas:

40

Herança, encapsulamento e polimorfismo não são considerados os pilares da OOP pelos programadores dos EUA / Reino Unido?

Eles são considerados pilares por muitos programadores, e muitas faculdades ensinam OO dessa maneira.

Infelizmente, é também uma visão míope.

  • A herança é apenas um mecanismo usado para implementar OOP e pode ser abusado para não fazer OOP.
  • Encapsulamento é um conceito útil para programação de todos os tipos, OOP e não.
  • Polimorfismo é uma característica ... (?) Para descrever como a computação se comporta. Existem muitas maneiras de obter polimorfismo, nem todas específicas de OO.

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).

Telastyn
fonte
10
Resposta decente a uma pergunta essencialmente sem resposta.
Robert Harvey
3
OOP existe?
Tulains Córdova
5
Eu argumentaria que apenas o encapsulamento é um "pilar" do POO. A maior diferença entre OOP e programação estrutural é a idéia de que os objetos contêm código e dados, não apenas dados (por exemplo, uma estrutura C clássica). Os outros dois conceitos são usados ​​principalmente nas linguagens OO, mas não são restritos ao OO ou exigidos por ele.
3
O encapsulamento do @Snowman também não está restrito ao OOP. As pessoas implementam tipos de dados abstratos em C e linguagens funcionais o tempo todo.
Doval
2
E o @ JörgWMittag teve uma boa resposta com relação às mensagens. A idéia de mensagens requer necessariamente encapsulamento. As mensagens geralmente são passadas para uma função ou método em um objeto, que age no estado que está encapsulado no mesmo. Isso não quer dizer que idiomas não OO também não possam ter passagem ou encapsulamento de mensagens, apenas que essas são idéias fundamentais do OOP.
23

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 :

OOP para mim significa apenas mensagens, retenção e proteção local e ocultação de processos estatais e vinculação extrema de todas as coisas.

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):

Apenas um lembrete gentil de que eu me esforcei no último OOPSLA para tentar lembrar a todos que o Smalltalk não é apenas NÃO sua sintaxe ou a biblioteca de classes, nem mesmo sobre aulas. Sinto muito que, há muito tempo, cunhei o termo "objetos" para este tópico porque leva muitas pessoas a se concentrarem na idéia menor.

A grande idéia é "mensagens" - é disso que trata o kernal do Smalltalk / Squeak (e é algo que nunca foi totalmente concluído em nossa fase do Xerox PARC). Os japoneses têm uma pequena palavra - ma - para "o que está no meio" - talvez o equivalente em inglês mais próximo seja "intersticial". A chave para criar sistemas grandes e cultiváveis ​​é muito mais para projetar como seus módulos se comunicam do que quais devem ser suas propriedades e comportamentos internos. Pense na Internet - para viver, ela (a) precisa permitir muitos tipos diferentes de idéias e realizações que estão além de qualquer padrão único e (b) permitir graus variados de interoperabilidade segura entre essas idéias.

(É 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" .

O envio dinâmico de operações é a característica essencial dos objetos. Isso significa que a operação a ser invocada é uma propriedade dinâmica do próprio objeto. As operações não podem ser identificadas estaticamente e, geralmente, não há como exatamente qual operação será executada em resposta a uma determinada solicitação, exceto executando-a. É exatamente igual às funções de primeira classe, sempre despachadas dinamicamente.

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).

Jörg W Mittag
fonte
Você pode ter "herança", "polimorfismo" e "herança" ... Parece-me que há um erro de digitação em algum lugar :)
slebetman
1
Essa resposta me faz desejar que também possamos respostas 'favoritas'.
Chan-Ho Suh
A definição de Alan Kay está desatualizada. OO precisa de herança e, se você pode executar a ligação em tempo de execução e em tempo de compilação, como no C ++, também obtém desempenho semelhante ao do C.
Erik Alapää
Não, sua definição é a correta. Você não precisa de herança para ser OO. Linguagens de protótipo não usam herança como C ++ e ainda são OO. A herança é usada apenas para implementar a reutilização de código, não é a melhor maneira, existem muitas linguagens melhores que possuem mixins, por exemplo. Também não tem nada a ver com ligação, pois é possível ter despacho dinâmico, nem mesmo em C ++, quando você pode usar métodos virtuais. O desempenho não tem nada a ver com isso, esses são conceitos de alto nível, eles não têm desempenho. Na verdade, você poderia implementar a passagem de mensagens em C e ser OO
Luiz Felipe