Pergunta

Desde o debate, sem significado dos termos é sem sentido, Eu percebi que eu iria apontar o elefante na sala e perguntar:O que exatamente faz uma língua "orientado a objeto"?Eu não estou olhando para um livro de texto de resposta aqui, mas com base nas suas experiências com linguagens OO que funcionam bem em seu domínio, qualquer que ele seja.

Uma outra questão que pode ajudar a responder a primeira é:O que é o arquétipo das linguagens orientadas a objeto e por quê?

Foi útil?

Solução

Definições para a Orientação a objetos são, naturalmente, uma enorme lata de vermes, mas aqui estão os meus 2 cents:

Para mim, a Orientação a objetos é sobre todos os objetos que colaboram através do envio de mensagens.Isso é, para mim, a única e mais importante característica de uma linguagem orientada a objeto.

Se eu tivesse que colocar uma lista ordenada de todas as características que uma linguagem orientada a objeto deve ter, que seria parecido com este:

  1. Objetos de enviar mensagens a outros objetos
  2. Tudo é um Objeto
  3. Ligação Tardia
  4. Subtipo Polimorfismo
  5. A herança ou algo da mesma forma expressiva, como Delegação
  6. Encapsulamento
  7. Esconder Informações
  8. Abstração

Obviamente, esta lista é muito controverso, uma vez que exclui uma grande variedade de linguagens que são amplamente considerados como orientada a objeto, tais como Java, C# e C++, todos os que violam os pontos 1, 2 e 3.No entanto, não há dúvida de que essas linguagens permitem a programação orientada a objeto (mas, não, C) e, até mesmo, facilitar-lo (o que C não).Então, eu vim para chamar os idiomas que satisfaçam os requisitos de "puramente orientada a objeto".

Como arquétipo linguagens orientadas a objeto que eu gostaria de mencionar Auto e Newspeak.

Ambos satisfazer os requisitos acima mencionados.Ambos são inspirados e sucessores Smalltalk, e os dois conseguem ser mais "OO" em algum sentido.Coisas que eu gosto sobre o eu e o Newspeak são de que tanto levar a mensagem de envio de paradigma ao extremo (Newspeak até mais do que Eu).

Em Newspeak, tudo é uma mensagem a enviar.Não há variáveis de instância, não há campos, sem atributos, sem constantes, sem nomes de classe.Todos eles são emulados usando getters e setters.

No Auto, há não há aulas, apenas objetos.Isso enfatiza, o que é OO realmente sobre:objetos, não de classes.

Outras dicas

De acordo com Booch, os seguintes elementos:Importante:

  • Abstração
  • Encapsulamento
  • Modularidade
  • Hierarquia (Herança)

Menor de idade:

  • Escrever
  • Concorrência
  • Persistência

Basicamente Orientada a Objeto realmente se resume a "message passing"

Em linguagem processual, chamo uma função como esta :

  f(x)

E o nome de f é, provavelmente, ligado a um determinado bloco de código em tempo de compilação.(A menos que esta é uma linguagem de programação procedural com funções de ordem superior ou ponteiros para funções, mas vamos ignorar que a possibilidade de um segundo). Assim, esta linha de código só pode significar uma inequívoca coisa.

Em uma linguagem orientada a objeto que eu passar uma mensagem a um objeto, talvez assim :

 o.m(x) 

No presente caso.m não é o nome de um bloco de código, mas um "método seletor" e o bloco de código é chamado, na verdade, depende do objeto o de alguma forma.Esta linha de código é mais ambígua ou geral, porque pode significar coisas diferentes em diferentes situações, dependendo do ó.

Na maioria das linguagens OO, o objeto o tem uma "classe", e a classe determina o bloco de código é chamado.Em um par de linguagens OO (a mais famosa, Javascript) s não tem uma classe, mas tem métodos diretamente ligado a ele em tempo de execução, ou herdou-los a partir de um protótipo.

Meu demarcação é que nem classes nem herança são necessários para uma linguagem OO.Mas este polimórficos tratamento de mensagens é essencial.

Embora você pode fingir isso com ponteiros de função, digamos C, que não é suficiente para o C, para ser chamado de uma linguagem OO, porque você vai ter que implementar a sua própria infra-estrutura.Você pode fazer isso, e OO estilo é possível, mas o idioma não está determinado para você.

Não é realmente linguagens OO, é o código.

É possível escrever orientada a objeto C do código (com estruturas e até mesmo a função de membros do ponteiro, se desejar) e já vi alguns muito bons exemplos disso.(Quake 2/3 SDK vem à mente.) Ele também é definitivamente possível escrever processuais (i.e.não-OO) de código em C++.

Dado que, eu diria que é a linguagem de apoio para escrever boas OO código que o torna um "Orientada a Objeto, Linguagem." Eu nunca iria incomodar com o uso de ponteiro de função de membros em estruturas em C, por exemplo, para o que seria comum funções de membro;portanto, posso dizer que C não é uma linguagem OO.

(Expandindo este, pode-se dizer que o Python não é orientado a objeto, também, com a obrigatória "auto-referência" em cada passo e construtores chamado init, outros enfeites;mas isso é uma Discussão Religiosa.)

Smalltalk é, geralmente, considerado o arquétipo do OO idioma, embora Simula é frequentemente citado como a primeira linguagem OO.

Atual OO línguas pode ser livremente categorizados pelo qual a língua que pedir emprestado mais os conceitos de:

  • Smalltalk-like:Ruby, Objective-C
  • Simula-like:C++, Object Pascal, Java, C#

Tanto quanto eu posso dizer, a vista principal de o que faz uma língua "Orientado a Objeto" está a apoiar a idéia de agrupamento de dados, e métodos de trabalho em que os dados, que geralmente é obtida através de cursos, módulos, herança, polimorfismo, etc.

Ver esta discussão para uma visão geral do que as pessoas pensam (pensaram?) A Orientação a objetos significa.

Como para o "arquétipo" OO linguagem - que é, de fato, Smalltalk, como Kristopher apontou.

Oferece suporte a classes, métodos, atributos, encapsulamento, esconder de dados, herança, polimorfismo, abstração...?

Desconsiderando as implicações teóricas, parece ser

"Qualquer linguagem que tenha uma palavra-chave chamada 'classe'" :-P

Ainda mais que o aib disse, eu diria que a linguagem não é realmente orientado a objeto, a menos que as bibliotecas padrão que estão disponíveis são orientadas para o objeto.O maior exemplo disso é o PHP.Embora ele suporta todos os padrão orientada a objeto, conceitos, o fato de que uma grande porcentagem do padrão de bibliotecas não são orientadas para o objeto significa que é quase impossível escrever seu código em um objeto de maneira orientada.

Não importa que eles estão introduzindo namespaces se todas as bibliotecas padrão ainda exigem que você prefixo de todas as suas chamadas de função com coisas como mysql_ e pgsql_, quando em um idioma que suporte a namespaces no real API, você poderia se livrar de funções com mysql_ e ter apenas um simples "incluir o sistema.db.mysql.*" na parte superior do seu arquivo, para que ele possa saber de onde as coisas vieram.

quando você pode fazer aulas, é orientada a objeto
por exemplo :java é orientada a objeto, javascript não é, e c++ se parece com algum tipo de "objeto-curioso" idioma

Na minha experiência, as línguas não são orientadas a objetos, o código é.

Há alguns anos atrás eu estava escrevendo uma série de programas em AppleScript, que realmente não fazer valer qualquer objeto-orientado recursos, quando eu comecei a grok OO.É desajeitado para gravar Objetos em AppleScript, embora seja possível criar classes, construtores, e assim por diante, se você tomar o tempo para descobrir como.

A língua era o idioma correto para o domínio:a obtenção de diferentes programas do Macintosh para trabalhar em conjunto para realizar algumas funções automáticas com base em arquivos de entrada.Levando os problemas para se auto-impor um estilo orientado a objetos foi a programação correta escolha, pois resultou no código que foi mais fácil para solução de problemas, testar e entender.

A característica que notei mais na mudança de que o código de processual para OO foi encapsulamento:ambas propriedades e chamadas de método.

Simples:(comparar o seguro caracteres)

1-Polimorfismo 2-a Herança 3-Encapsulamento 4-Re-uso.:)

Objeto:Um objeto é um repositório de dados.Por exemplo, se MyList é um ShoppingList objeto, MyList pode gravar a sua lista de compras.

Classe:Uma classe é um tipo de objeto.Muitos objetos da mesma classe podem existir;por exemplo, MyList e YourList pode tanto ser ShoppingList objetos.

Método:Um procedimento ou função que opera sobre um objeto ou uma classe.Um método é associado a uma determinada classe.Por exemplo, addItem pode ser um método que adiciona um item para qualquer ShoppingList objeto.Às vezes, um método é associado a uma família de classes.Por exemplo, addItem pode operar em qualquer Lista, dos quais um ShoppingList é apenas um tipo.

Herança:Uma classe pode herdar propriedades de uma forma mais geral da classe.Por exemplo, o ShoppingList classe herda da classe Lista a propriedade de armazenar uma seqüência de itens.

Polimorfismo:A capacidade de uma chamada de método de trabalho em diferentes classes de objetos, mesmo se as classes precisam de diferentes implementações do método de chamada.Por exemplo, uma linha de código pode ser capaz de chamar o "addItem" método em cada tipo de Lista, mesmo que adicionar um item a uma ShoppingList é completamente diferente de adicionar um item a uma ShoppingCart.

Orientada A Objetos:Cada objeto, conhece a sua própria classe, e que os métodos de manipulação de objetos dessa classe.Cada ShoppingList e cada ShoppingCart sabe que a implementação de addItem se aplica a ele.

Nesta lista, a única coisa que verdadeiramente distingue linguagens orientadas a objeto de línguas processuais (C, Fortran, Basic, Pascal) é polimorfismo.

Fonte: https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd

Estou feliz em compartilhar isso com vocês, foi muito interessante e útil para mim.Este é um excerto de um artigo de 1994 entrevista da Rolling Stone, onde Steve (não como programador) explica OOP em termos simples.

Jeff Goodell:Você poderia explicar, em termos simples, exatamente o que object-oriented software é?

Steve Jobs:Os objetos são como pessoas.Eles estão vivendo, respirando coisas que têm conhecimento dentro deles sobre como fazer as coisas e tem memória dentro deles de forma que eles podem se lembrar de coisas.E, ao invés de interagir com eles em um nível muito baixo, você interagir com eles em um nível muito alto de abstração, como estamos fazendo aqui.

Aqui está um exemplo:Se eu sou o seu serviço de lavandaria objeto, você pode me dar a roupa suja e enviar-me uma mensagem que diz, "você Pode conseguir a minha roupa lavada, por favor." Acontece que eu sei onde é o melhor serviço de lavandaria lugar em San Francisco.E eu falo inglês, e eu tenho de dólares em meus bolsos.Assim que eu sair e chamar um táxi e dizer ao motorista para me levar a este lugar em San Francisco.Vou começar sua roupa lavada, eu pulo para trás na cabine, eu volto aqui.Eu dar-lhe sua roupa limpa, e dizer, "Aqui estão suas roupas limpas."

Você não tem idéia de como eu fiz isso.Você não tem nenhum conhecimento de lavandaria lugar.Talvez você falar francês, e você não pode mesmo chamar um táxi.Você não pode pagar por um, você não tem de dólares em seu bolso.No entanto, eu sabia como fazer tudo isso.E você não precisa saber de nada.Toda a complexidade que estava escondido dentro de mim, e fomos capazes de interagir em um nível muito alto de abstração.Isso é o que os objetos são.Eles encapsulam a complexidade e as interfaces para que a complexidade são de alto nível.

Arquétipo

A capacidade para expressar situações reais no código.

foreach(House house in location.Houses)
{
 foreach(Deliverable mail in new Mailbag(new Deliverable[]
              {
              GetLetters(), 
              GetPackages(), 
              GetAdvertisingJunk()
              })
 {
    if(mail.AddressedTo(house))
    {
        house.Deliver(mail);
    }
 }
}

-

foreach(Deliverable myMail in GetMail())
{
    IReadable readable = myMail as IReadable;
    if ( readable != null )
    {
        Console.WriteLine(readable.Text);
    }
}

Por quê?

Para nos ajudar a entender isso com mais facilidade.Faz mais sentido em nossas cabeças e se implementado corretamente, torna o código mais eficiente, re-utilizáveis e reduz a repetição.

Para conseguir isso, você precisa:

  • Indicadores/Referências para garantir que este == e != que.
  • Classes para o ponto a (e.g.Braço) que armazenam dados (int hairyness) e operações (Throw(IThrowable))
  • Polimorfismo (Herança e/ou Interfaces) para tratar objetos específicos em um genérico de moda, assim você pode ler livros, bem como o grafite na parede (ambos implementam IReadable)
  • Encapsulamento porque a apple não expor uma Átomos [propriedade]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top