Pergunta

Como eu li através de respostas stackoverflow e perguntas que eu estou começando a impressão de que OO é compartimentada para ser inerentemente imperativo.

Mas não é OO apenas uma maneira de código compartmentalize e dados em objetos do mundo real?

Se assim for, por que que abrir mão de outro paradigma nível inferior ao trabalho de tal plataforma?

IOW, um sistema de tipo genérico objeto com base que é imutável por padrão seria a forma de uma primeira linguagem funcional iria funcionar, um sistema de tipo genérico com base objeto que é mutável por padrão seria o mundo das linguagens imperativas.

Ou estou faltando alguma coisa completamente?

Foi útil?

Solução

Não . OO e imperativa são dois conceitos ortogonais.

Por exemplo:

  • O objeto Common Lisp Sistema é um exemplo de Lisp OO e talvez o sistema de objeto complexo mais ao redor.
  • OCaml é uma linguagem funcional com um sistema de objetos e um sistema de módulo de apoio organização orientada a objetos
  • Scala é uma linguagem funcional com um sistema OO muito flexível
  • Haskell permite escrever código orientado a objetos usando alto-kinded polimorfismo

Existem muitas maneiras diferentes de ser orientada a objetos.

Outras dicas

A maioria das linguagens OO são imperativas, mas você pode usá-los em um estilo um tanto funcional. Algumas linguagens funcionais sentar em cima de um quadro OO (F # no .NET sendo o exemplo óbvio mais) negociação fora de algum "pureza", a fim de obter um quadro enorme para uso quando necessário.

Eu acho que há um muito espaço para "sobretudo oo" línguas para fazer mais para ajudar a programação em um estilo funcional - melhor suporte para imutabilidade sendo a característica mais evidente, possivelmente seguido por um melhor tipo de inferência . (Pelo menos quando se fala em C #, que é provavelmente o exemplo mais significativo de uma linguagem tradicional tentar obter um pé na porta funcional.)

Sim. -orientado a objetos é um estilo de programação que permite o programador para expressar um programa como um conjunto de objetos stateful agindo e interagindo (tipicamente, por meio de mensagem de passagem em dinamicamente digitado linguagens e método invocando em linguagens estaticamente tipado), e fazê-lo em uma seqüência particular.

Estado, ação e seqüência são conceitos de programação processual e não estão presentes na programação funcional nonmonadic (mônadas são utilizados para implementar estado, ação e sequência nas linguagens funcionais puras Haskell, que de outra forma não teria estes conceitos).

Para olhar para ele a partir de uma perspectiva diferente, a maioria das pessoas gostam de pensar imperativamente (em vez de em recursions ou RPN). A partir deste segue-se que a maioria das línguas será imperativo.

É claro, muitos problemas são muito mais simples de expressar (ou resolver) com uma abordagem não-imperativo (para interfaces de usuário de exemplo), mas a maioria das pessoas realmente não se sentir confortável com esta abordagem. Alguns não gostam de sair do caminho batido enquanto outros realmente têm dificuldade para fazer a mudança mental necessária para problemas abordagem deste lado (pensando em chamadas de método e recursão em vez de variáveis ??e loops).

Eu ainda acredito firmemente que a orientação a objetos é um conceito inerentemente imperativo. No entanto, como uma questão recente me fez pensar um pouco mais sobre paradigmas de programação em geral, eu coloquei uma resposta mais abrangente, que é um pouco off-topic, mas aliás também responde a sua pergunta:

Os 2 principais paradigmas de programação são o declarativa paradigma , onde o programador escreve relações abstratas (contando, assim, o compilador o que ele quer), e imperativo paradigma , onde o programador escreve algoritmos (contando, assim, o computador como para conseguir o que quer).

Os paradigmas são a priori linguagem agnóstica - é mais de uma maneira de como você pensar e estruturar o seu programa. No entanto, existem diferenças em como fácil a linguagem torna-se usar um paradigma:. Semântica da linguagem e chumbo sintaxe para uma forma idiomática de escrever código

Um exemplo de uma linguagem declarativa seria Prolog, um exemplo para uma linguagem imperativa seria Fortran (e real programador pode escrever programas Fortran em qualquer idioma ).

Como um exemplo de código que é imperativo e declarativa, ao mesmo tempo, considerar esta implementação do Fibonnaci-seqüência em Perl6:

my @fibonacci-sequence := 0, 1, * + * ... *;

Esta é claramente uma descrição declarativa da seqüência. No entanto, como * e ... são operadores Perl6 válidos - o que quer-estrelas pode ser usado para criar lambda-expressions, a seqüência de operador para criar listas de preguiçosos. - É também uma declaração imperativa invocando código runtime-intrínseca

Vamos considerar alguns outros paradigmas de programação, em especial de programação funcional e orientada a objetos.

O paradigma funcional é inerentemente declarativa, como modelos de computação como uma relação entre as séries.

O orientada a objeto paradigma é inerentemente imperativo, uma vez que os modelos de computação como a comunicação entre objetos stateful, chamado passagem de mensagens.

Algumas línguas são puras, ou seja, todos os conforma computação para o paradigma. Por exemplo, Haskell é uma linguagem puramente funcional, e Smalltalk é uma linguagem puramente orientada a objetos.

No entanto, isso não significa que que as linguagens funcionais resp. linguagens orientadas a objeto prevenir resp imperativo. programação declarativa. Na prática, muitas vezes você usar funções imperativamente - você colocar em um valor de entrada para sair um valor de saída. O inverso é verdadeiro para programação orientada a objetos:. O conjunto de mensagens um objeto aceita declara sua interface

Algumas pessoas discordam sobre OO ser um conceito imperativo, então aqui está o meu raciocínio.

Objeto de orientação essencial:

  1. objetos estado de retenção (ou seja, referências a outros objetos)
  2. objetos recebem (e processo) mensagens
  3. processamento de uma mensagem pode resultar em
    • mensagens beeing enviado para o próprio ou outros objetos objeto
    • uma mudança no estado do objeto

Isto significa Oo-programação requer estado mutável realizada pelo objeto (!) . Se você simular mudança de estado através da criação de uma série de objetos, você está quebrando essas invariantes, simples como isso.

flamebait:. Se você não concordar com esta definição de orientação a objetos, levá-la até com Alan Kay

Um monte de diferentes conceitos contribuem para o conceito de Programação Orientada a Objetos. Wikipédia listas mosts deles.

eu iria caracterizar a essência da OOP pelo uso de objetos com comportamentos .

Wikipedia caracteriza Objetos pelos três propriedades a seguir:

  1. Identidade : a propriedade de um objeto que o distingue de outros objetos
  2. Estado : descreve os dados armazenados no objeto
  3. Comportamento : descreve os métodos na interface do objeto pelo qual o objeto pode ser usado

Um monte de Object Oriented linguagem têm um conceito de classes, mas, na verdade, há também Prototype idiomas baseados como JavaScript.

As linguagens funcionais também podem usar classes (por exemplo Digite Classes em Haskell). Mas só porque eles têm aulas não significa que eles são orientados objeto ou permitir programação orientada a objeto. Para ficar com o exemplo de Haskell: Você não tem que mesmo objetos! Não existe tal conceito como "Identidade"! Tudo o que você pode fazer é compor funções puras!

Só porque alguém está usando um termo chamado "classes", isso não significa que eles estão fazendo objeto programação orientada!

OOP é sobre objetos stateful com comportamento. Embora o comportamento dos objetos não tem que modificar esse objeto porque novos objetos podem ser criados em vez disso, você iria perder a necessidade de objetos completamente. Você não precisa Identidades mais, porque ele não importa se as alterações para um objeto são refletidas por outras referências para o mesmo objeto, porque não haveria qualquer mudança mais. Tudo que você precisa é de Valores (sem identidade) e Módulos e / ou Classes de ocultação de dados e encapsulamento.

Assim Sim , programação imperativa é inerente à OOP.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top