Qual é esse recurso para você que tornou a programação orientada a objetos tão bem-sucedida?
- Passagem de mensagem
- Herança
- Polimorfismo
- 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?
object-oriented
Tony
fonte
fonte
Respostas:
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.
fonte
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.
fonte
A ocultação de dados fornecida pelo encapsulamento.
fonte
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
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.
fonte
Abstração
Fornecendo os serviços necessários, ocultando as coisas desnecessárias. Veja minha explicação aqui - O que é abstração?
fonte
É 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.
fonte
" 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.
fonte
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.
fonte
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
então 1. Passagem de mensagem e 3. Polimorfismo estão realmente apoiando 2. Herança e 4. Encapsulamento.
fonte
Na minha opinião, os três últimos recursos são os mais importantes uma vez que impactaram o amplo uso do OOP:
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 :)
fonte