O que fez a programação orientada a objetos bem-sucedida? [fechadas]

17

Qual é esse recurso para você que tornou a programação orientada a objetos tão bem-sucedida?

  1. Passagem de mensagem
  2. Herança
  3. Polimorfismo
  4. Encapsulamento

Ou algum outro recurso que você queira apresentar.

Também gostaria de saber que qual é a conexão entre o tipo Abstract Data e a programação orientada a objetos?

Tony
fonte
popular e bem sucedido não são sinônimos
kevin Cline

Respostas:

76

Eu sugeriria que a característica mais importante da programação orientada a objetos é a do gerenciamento da complexidade .

O cérebro humano só pode conter tantos conceitos de uma só vez - vem à mente o limite frequentemente mencionado de lembrar 7 +/- 2 itens independentes.

Quando estou trabalhando em um sistema de 600kloc no trabalho, não consigo segurar tudo na cabeça de uma só vez. Se eu tivesse que fazer isso, estaria limitado a trabalhar em sistemas muito menores.

Felizmente, não preciso. Os vários padrões de design e outras estruturas que usamos nesse projeto significam que não preciso lidar com todo o sistema de uma só vez - posso pegar peças individuais e trabalhar nelas, sabendo que elas se encaixam no aplicativo mais amplo de maneiras bem definidas.

Todos os conceitos importantes de OO fornecem maneiras de gerenciar a complexidade.

Encapsulamento - deixe-me lidar com uma API externa que me fornece vários serviços, sem se preocupar em como esses serviços são implementados.

Abstração - deixe-me concentrar nas características essenciais e ignorar o que não é relevante.

Composição - deixe-me reutilizar componentes que já foram criados em novas combinações

Polimorfismo - deixe-me solicitar um serviço sem me preocupar com como diferentes objetos podem fornecê-lo de maneiras diferentes.

Herança - deixe-me reutilizar uma interface ou implementação, fornecendo apenas as partes diferentes do que foi anteriormente.

Princípio de responsabilidade única - vamos manter o objetivo de cada objeto claro e conciso, para que seja fácil argumentar sobre

Princípio de Substituição de Liskov - não vamos criar armadilhas um para o outro, introduzindo dependências estranhas

Princípio Aberto / Fechado - vamos permitir extensão e modificação de maneiras que não exijam o risco de quebrar o código existente

Injeção de Dependência - vamos elevar a composição ao próximo nível e montar os componentes muito mais tarde.

Desenvolvimento orientado a interface - vamos levar a abstração para o próximo nível e depender apenas da abstração, nunca de uma implementação concreta.

Bevan
fonte
6
+1. Só posso votar uma vez, o que é uma pena que isso mereça mais.
Richard
1
Há um corolário nisso, é uma pena que não encontre a referência no momento, mas tentarei lembrar de procurar e editar o comentário. Portanto, um estudo das práticas de revisão de código constatou que as revisões de código tendiam a demorar mais para encontrar erros no código OO do que no código procedural, porque o fluxo salta mais no código OO. Práticas como TDD e programação de pares atenuam isso, mas ainda é um resultado interessante (e para mim, inesperado).
5
Essa pode ser a resposta perfeita - informações completas, mas curtas o suficiente para que o leitor não precise ler um romance. Bravo
Tim Claason
@ Graham Lee: Eu estaria interessado em ler esse estudo.
22810 Frank Shearar #
13

Interfaces gráficas de usuário. No final dos anos 80, início dos anos 90, quando Macs, Amigas, Atari STs, Windows e GEM começaram a substituir as interfaces de usuário baseadas em caracteres, ficou óbvio que linguagens como C não são adequadas para escrever programas GUI. Enquanto o processamento de dados tradicional é considerado como um esquema de "dados de entrada -> processamento -> dados de saída", que também poderia ser feito em uma linguagem processual, os recursos de OOs se tornaram úteis para lidar com a complexidade inerente de uma GUI.

user281377
fonte
1
+1 por mencionar aplicativos da GUI. A orientação a objetos foi a ferramenta que permitiu implementar as GUIs, que eram de outra maneira (com código processual) bastante difíceis de gerenciar.
Giorgio
7

A ocultação de dados fornecida pelo encapsulamento.


fonte
Esta é uma resposta? ADTs fornecer ocultação de dados (que é por isso que eles são chamados de "abstrações de dados")
Frank Shearar
@ Frank, ele pediu recursos específicos e, quando escrevi esta resposta, havia apenas um outro e estava tentando não duplicar.
É justo, mas o encapsulamento não é exatamente específico para OO. Eu mesmo deveria verificar isso, mas tenho certeza de que estávamos encapsulando muito antes do OO.
precisa saber é o seguinte
1
@ Frank, eu concordo que não é específico para OO, é apenas uma de suas principais características.
Isso é verdade para a maioria dos OOPLs, mas não para todos. CLOS é uma exceção notável.
22430 Frank Shearar
7

Um recurso que ainda não foi mencionado por nenhuma das outras respostas: modelagem de domínio . Como as pessoas tendem a pensar em fazer coisas com ou para objetos e sobre objetos com propriedades intrínsecas, é muito fácil modelar um problema ou fluxo de trabalho usando software orientado a objetos. Essencialmente, ele nos permite usar nossa capacidade existente para lidar com substantivos, verbos e adjetivos no código.


fonte
6

Eu acho que herança é o ponto mais importante do POO.

[do desenvolvimento do jogo] Você pode criar algo como uma classe Drawable, com métodos e atributos de renderização, e criar uma classe Spaceship e Planet, que herda de Drawable. Pegue todos os objetos desses [e de outro filho do Sprite], jogue um drawableObjArray e chame o método draw para cada objeto. Você só precisa saber que é um Drawable.

JulioC
fonte
2
Realmente?? O polimorfismo é MUITO mais importante e não requer herança (do ponto de vista teórico).
Thomas Eding
Nem sequer exige funções virtuais, basta usar ponteiros de função.
Calmarius
1
O conceito original de Alan Kay de OO nem sequer incluía herança porque ele não gostava de como foi implementado em sistemas anteriores.
Michael Borgwardt
3

Abstração

Fornecendo os serviços necessários, ocultando as coisas desnecessárias. Veja minha explicação aqui - O que é abstração?

Gulshan
fonte
Erro de digitação: "Absraction" deve ser "Abstraction"
Vetle
2

É um tanto bem-sucedido porque encoraja o uso da organização das coisas da mente humana em objetos. As pessoas geralmente são boas em ver relacionamentos de coisas - coisas como diferenças, semelhanças e comportamento. OO incentiva o desenvolvimento de software para imitar a conceitualização humana do mundo.

Tornar o desenvolvimento de software semelhante ao modo como vemos o mundo facilita a nossa mente lidar com a complexidade.

Tim
fonte
Talvez seja por causa de mais experiência com procedimentos, mas depois de usar os dois métodos, ainda acho o procedimento mais intuitivo do que o OOP. Ainda gosto das partes boas dos dois estilos.
Juha Untinen
1

" ADT vs objects " já foi solicitado várias vezes aqui. A resposta de uma linha é "ADTs e objetos são inversos um do outro - o que um abstrai ordenadamente que o outro não pode; cada um permite flexibilidade de maneiras diferentes".

Para obter uma resposta mais longa, consulte On Understanding Data Abstraction, de William Cook , Revisitado . Resumidamente, os objetos permitem o uso fácil de várias implementações / representações de algum dado (algo que se parece com uma lista pode ser uma matriz, uma árvore de auto-equilíbrio ou ...), mas dificulta a adição de novas operações (porque você é necessário adicionar essa nova operação a cada uma de suas representações), enquanto os ADTs facilitam a adição de novas operações ao seu tipo de dados, mas dificultam a implementação de várias implementações.

Edit: Eu disse que a passagem de mensagens foi o que fez OO bem sucedido. Com base no comentário de Jonas, isso não está certo, porque a maioria dos idiomas que as pessoas consideram OO não usa a passagem de mensagens. Como não está certo, eu escolhi a minha resposta.

Frank Shearar
fonte
1
A passagem de mensagens dificilmente pode ser a resposta, pois nenhuma das linguagens OOP bem-sucedidas a utiliza.
Jonas
Seu OO não é necessariamente meu OO. E a maioria das linguagens chamadas OO não é, pela definição de Alan Kay. Eu esqueço a citação exata, mas a Kay disse que os objetos não eram o que era importante no Smalltalk, mas a passagem de mensagens (e a que mais perdeu esse ponto).
11558 Frank Shearar
@Jonas Acho que, ao reler a pergunta e a minha resposta, estou dizendo "OO não é bem-sucedido, já que tão poucos idiomas fazem isso direito". Mas só digo coisas assim quando estou usando meu traje à prova de chamas.
Frank Shearar 02/11/10
0

Meus três principais recursos. Composição de Objetos - permitindo que objetos colaborem. Polimorfismo - suporta comportamentos dinâmicos em tempo de execução. Herança - reutilizando código e modificando o comportamento por meio da substituição de métodos.

ADT - você pode ter isso mesmo em linguagens não orientadas a objetos como o Pascal. Uma pilha ou fila são exemplos de ADT.

StartClass0830
fonte
"ADT - você pode ter isso mesmo em linguagens não orientadas a objetos como Pascal. Uma pilha ou uma fila são exemplos de ADT.": Verdadeiro. Porém, o OOP facilita a definição da interface de um ADT e fornece uma implementação intercambiável diferente (interface / classe abstrata <---> subclasses / classes concretas). Até onde eu sei, não é tão fácil em Pascal.
Giorgio
0

em palavras simples, OOP é a chave para a reutilização e o encapsulamento, que resultam na produção de grandes estruturas que facilitam a vida dos programadores nesta época, pois elas podem simplesmente chamar as APIs e fazer o que o dia deseja com mais frequência.

como sua pergunta é sobre os 4 recursos do OOP, então você pode dizer

  1. Herança e 4. Encapsulamento são os recursos mais importantes e outros dois são muito necessários para alcançar os dois primeiros

então 1. Passagem de mensagem e 3. Polimorfismo estão realmente apoiando 2. Herança e 4. Encapsulamento.

  1. Herança e 4. Encapsulamento são a chave para o sucesso da OOP
Badr uz Zaman
fonte
herança não é necessária, um componente definidor ou mesmo uma parte muito desejável da OOP na maioria das vezes. encapsulamento é um bom princípio para a programação em geral. não foi inventado pelo OOP e não é usado apenas no OOP.
sara
-1

Na minha opinião, os três últimos recursos são os mais importantes uma vez que impactaram o amplo uso do OOP:

2. Inheritance
3. Polymorphism
4. Encapsulation

Editar: Outro ponto seria o IDE e os ambientes de desenvolvimento de interfaces gráficas, como o Visual studio e o Eclipse. À medida que eles adotam as linguagens OOP, assim, mais e mais projetos tendiam a OOP.

E, claro, os princípios do SOLID são os únicos que tornam os produtos de software ROCK sólidos e entregáveis ​​:)

Yusubov
fonte