Eu sou muito novo em programação e um pouco confuso ao ler \ ouvir diferentes convenções de diferentes fontes:
A programação orientada a objetos tem 4 ou 5 conceitos?
Como recém-chegado, entendo que estes são os 5 conceitos:
- Abstração
- Herança
- Encapsulamento
- Polimorfismo
- Modularidade
Então, por que não encontro uma definição mais "rigorosa" e parece haver vários arranjos desses conceitos por aí?
object-oriented
JohnDoea
fonte
fonte
Respostas:
A razão pela qual você encontra explicações diferentes sobre o que significa programação orientada a objetos é porque não há uma pessoa ou organização com autoridade para formular uma definição estritamente aplicável universalmente.
A programação orientada a objetos não é um padrão ISO ou uma lei científica. É uma filosofia. E, como em todas as filosofias, existem todos os tipos de interpretações diferentes e nenhuma interpretação é universalmente aplicável. Ao ler um texto que diz quais conceitos você deve seguir ao projetar uma arquitetura de software, você deve vê-lo como uma diretriz baseada nas opiniões que o autor formou durante sua experiência profissional e não como uma verdade universal.
fonte
Como outros já mencionaram, "OO" não possui realmente nenhum componente , porque é uma maneira de pensar em modelar soluções para problemas e não um kit de ferramentas nem um conjunto de processos claramente definidos.
Herança e polimorfismo são recursos da linguagem de programação. É bom que você entenda isso, mas lembre-se de que são ferramentas (o que significa que, como em qualquer outra ferramenta, elas só devem ser usadas para solucionar problemas específicos e não devem ser tratadas como uma meta ou algo a ser buscado). Você pode (e geralmente deve) escrever o código "OO" sem usar nenhum deles. Alguns dos melhores códigos "OO" que eu já vi fazem muito pouco uso de herança ou polimorfismo.
Abstração, encapsulamento e modularidade têm menos a ver com código e mais com a maneira como você olha para um problema, como tenta entender esse problema e como projeta e estrutura sua solução em código.
Além disso, essas idéias de design não são exclusivas de "OO". As chances são de que você provavelmente as entenda agora em um nível básico, o que poderia incluir a capacidade de explicar uma definição perfeita para um livro didático e aplicá-las a problemas um tanto triviais; embora um teste mais profundo de compreensão esteja recebendo um problema complexo muito grande e com que complexidade você pode lidar.
Outro teste de entendimento é a abordagem usada para resolver um problema; e recém-chegados ao "OO", que são frequentemente ensinados sobre OO em termos de modelagem de dados (porque é assim que a maioria das pessoas costumava entendê-lo nos anos 90), e geralmente acabam focados nos aspectos errados de um problema - ou seja, eles se concentram muito em dados e eles não se concentram o suficiente no comportamento.
Por exemplo, exemplos clássicos muitas vezes se referem a entidades tais como
Dog
,Cat
,Elephant
,Seagull
,Shark
, etc. Os recém-chegados "OO", muitas vezes olhar para exemplos e imediatamente pensar "Oh, eu preciso de uma entidade base chamadaAnimal
" , e eles podem até mesmo acabar com outra entidades intermediárias comoMammal
eAmphibian
em uma hierarquia de herança pura, com atributos diferentes em cada uma.Embora esse modo de pensar demonstre um entendimento muito básico de vários conceitos de OO, um programador experiente de OO nunca abordaria isso dessa maneira nem chegaria a essa conclusão (e na verdade reclamaria por não ter informações suficientes), porque essa abordagem demonstra Entidade modelagem em vez de modelagem OO, e porque o exemplo artificial não diz nada sobre o comportamento desses animais (e muitas pessoas argumentam hoje em dia que a essência do OO está toda no comportamento e na funcionalidade).
O caminho para aprender sobre "OO" tradicionalmente envolve gastar tempo construindo abstrações erradas quando você não sabe nada (ou muito pouco) sobre o comportamento do problema que está modelando ou quando comete o erro de concentrar sua atenção nas entidades, em vez de funcionalidade, embora parte disso seja porque muitos livros, cursos e tutoriais on-line escritos ao longo dos anos têm orientado (mis) os alunos por esse caminho há muito tempo (embora a maré esteja mudando).
No geral, grande parte do seu entendimento se resume à experiência. Esses conceitos que você aprendeu até agora são um bom começo, há mais conceitos que você precisará aprender ao longo do caminho (por exemplo, princípios "SÓLIDO" e "SECO") e precisará gastar muito tempo colocando teoria em prática com problemas reais de alta complexidade antes que tudo isso "se encaixe" no lugar.
fonte
O termo "Orientação a Objetos" foi cunhado pelo Dr. Alan Kay, então ele é a fonte autorizada sobre o que significa e o define assim :
Vamos detalhar isso:
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 mesmos 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.
Portanto, existem duas maneiras de analisar a definição de Alan Kay: se você a considerar por conta própria, poderá observar que as mensagens são basicamente uma chamada de procedimento de ligação tardia e a ligação tardia implica encapsulamento, para que possamos concluir que # 1 e # 2 são realmente redundantes, e OO é tudo sobre ligação tardia.
No entanto, mais tarde ele esclareceu que o importante é o envio de mensagens e, portanto, podemos vê-lo de um ângulo diferente: o envio de mensagens é tardio. Agora, se as mensagens fossem a única coisa possível, o nº 3 seria trivialmente verdadeiro: se houver apenas uma coisa, e essa coisa for atrasada, todas as coisas serão atrasadas. E mais uma vez, o encapsulamento segue as mensagens.
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 "Orientado a objetos" .
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.
Benjamin Pierce, em Tipos e linguagens de programação, argumenta que o recurso definidor da orientação a objetos é a recursão aberta .
Então: de acordo com Alan Kay, OO é tudo sobre mensagens. De acordo com William Cook, OO tem tudo a ver com o envio de método dinâmico (que é realmente a mesma coisa). De acordo com Benjamin Pierce, OO tem tudo a ver com recursão aberta, o que basicamente significa que as referências automáticas são resolvidas dinamicamente (ou pelo menos é uma maneira de pensar), ou, em outras palavras, mensagens.
Como você pode ver, a pessoa que cunhou o termo "OO" tem uma visão bastante metafísica dos objetos, Cook tem uma visão bastante pragmática e Pierce uma visão matemática muito rigorosa. Mas o importante é: o filósofo, o pragmatista e o teórico concordam! Mensagens é o único pilar da OO. Período.
Observe que não há menção de herança aqui! A herança não é essencial para o OO. Em geral, a maioria das linguagens OO tem algum modo de reutilização da implementação, mas isso não necessariamente tem que ser herança. Também poderia ser uma forma de delegação, por exemplo. De fato, 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, novamente indicando que não é necessário para o OO).
fonte
Como afirma @Philipp, a raiz do problema é que não há uma definição oficial do que torna uma linguagem de programação orientada a objetos. Na verdade, isso é provavelmente uma coisa boa. Existem várias maneiras de oferecer suporte à programação OO, cada uma com suas próprias vantagens e desvantagens. Discussões sobre quais idiomas são mais "OO puros" não alcançam muito.
No entanto, olhando para os cinco atributos que você listou, na minha opinião a modularidade é definitivamente a mais estranha. A modularidade é realmente um atributo de um programa, não uma linguagem de programação. No nível lingüístico, o atributo é "suporte à modularização", e isso geralmente assume a forma de um mecanismo "modules" pr "packages".
Mas minha verdadeira objeção à Modularity é que ela não é essencial para a programação OO ou linguagens de programação OO, na medida em que a linguagem de programação arquetípica Smalltalk-80 não suportava módulos. E quando você pensa sobre isso, o suporte linguístico para módulos em muitos OOPLs amplamente usados é "fraco".
Os módulos são projetados para oferecer suporte à "programação em grandes dimensões" ... onde sua base de código fica grande demais para uma única pessoa entender completamente. E você não precisa de módulos em uma linguagem de programação para modularizar seu código.
Não estou entrando no debate sobre os outros quatro atributos e se (por exemplo) quais modelos de "herança" são pura OO. Além disso, embora Alan Kay seja creditado por ter inventado a programação OO, isso não significa necessariamente que suas definições de OO / e OOPL tenham primazia. Claramente, este não é o caso. Ele é uma fonte autorizada, mas há outras fontes que dão outras definições para OO e OOPLs que (na prática) têm maior peso.
fonte