Domanda

Come ho letto attraverso le risposte e le domande StackOverflow che sto ottenendo l'impressione che OO è compartimentato a che sia intrinsecamente imperativo.

Ma non è OO solo un modo per compartimenti stagni codice e dati in oggetti del mondo reale?

Se è così, perché vorrei che rinunciare altro paradigma livello inferiore a lavorare in tale piattaforma?

IOW, un sistema di tipo generico Object Based che è immutabile per default sarebbe il modo un primo linguaggio funzionale avrebbe funzionato, un sistema di tipo generico basato oggetto che è mutevole per default sarebbe il mondo dei linguaggi imperativi.

O mi manca qualcosa di completamente?

È stato utile?

Soluzione

No . OO e imperativo sono due concetti ortogonali.

Ad esempio:

  • Il sistema oggetto Common Lisp è un esempio di Lisp OO e forse il sistema oggetto più complesso intorno.
  • OCaml è un linguaggio funzionale con un sistema oggetto e un sistema di modulo di supporto orientato agli oggetti organizzazione
  • Scala è un linguaggio funzionale con un sistema OO molto flessibile
  • Haskell consente di scrivere codice orientato agli oggetti utilizzando il polimorfismo superiore kinded

Ci sono un sacco di modi diversi di essere orientato agli oggetti.

Altri suggerimenti

La maggior parte dei linguaggi OO sono di importanza fondamentale, ma possono utilizzarli in uno stile un po funzionale. Alcuni linguaggi funzionali siedono in cima ad un quadro OO (F # su .NET è l'esempio più evidente) le operazioni fuori qualche "purezza" al fine di ottenere un quadro enorme di utilizzare, se del caso.

Credo che ci sia un molto di spazio per "principalmente OO" linguaggi per fare di più per aiutare la programmazione in uno stile funzionale - un migliore supporto per immutabilità essere la caratteristica più evidente, forse seguito da una migliore inferenza . (Almeno quando si parla di C #, che è probabilmente l'esempio più significativo di un linguaggio tradizionale cercando di ottenere un piede nella porta funzionale.)

Sì. orientata agli oggetti è uno stile di programmazione che permette al programmatore di esprimere un programma come un insieme di oggetti stateful che agiscono e interagiscono (tipicamente, per mezzo di un messaggio-passando dinamicamente tipizzato lingue e metodo-invocando in lingue staticamente tipizzato), e di farlo in una particolare sequenza.

State, azione e sequenza sono concetti di programmazione procedurale e non sono presenti nella programmazione funzionale nonmonadic (monadi vengono utilizzati per implementare stato, l'azione e la sequenza nel puro linguaggi funzionali Haskell, che altrimenti non hanno questi concetti).

Per vedere le cose da una prospettiva diversa, la maggior parte delle persone piace pensare imperativamente (piuttosto che in ricorsioni o RPN). Da questo consegue che la maggior parte delle lingue saranno di importanza fondamentale.

Naturalmente, molti problemi sono molto più semplice per esprimere (o risolvere) con un approccio non indispensabile (per le interfacce utente ad esempio), ma la maggior parte delle persone che in realtà non sentirsi a proprio agio con questo approccio. Alcuni non piace lasciare il sentiero battuto, mentre altri davvero hanno difficoltà a fare il cambiamento mentale necessaria per affrontare i problemi da questo lato (pensare in chiamate di metodo e ricorsione invece di variabili e loop).

credo ancora fermamente che l'orientamento agli oggetti è un concetto intrinsecamente imperativo. Tuttavia, come un recente interrogazione mi ha fatto pensare un po 'di più su paradigmi di programmazione in generale, ho messo insieme una risposta più completa, che è un po 'off-topic, ma per inciso anche risponde alla tua domanda:

Le 2 principali paradigmi di programmazione sono il paradigma dichiarativo , in cui il programmatore scrive relazioni astratte (raccontando così il compilatore cosa che vuole), e il imperativo paradigma , in cui il programmatore scrive algoritmi (raccontando così il computer come per ottenere ciò che vuole).

I paradigmi sono un linguaggio agnostico priori - è più di un modo su come si pensa e strutturare il programma. Tuttavia, ci sono differenze nel modo in un linguaggio facile rende utilizzare un paradigma:. Semantica del linguaggio e piombo sintassi per un modo idiomatico di scrittura di codice

Un esempio di un linguaggio dichiarativo sarebbe Prolog, un esempio per un linguaggio imperativo sarebbe Fortran (e Patrimonio programmatore può scrivere programmi FORTRAN in qualsiasi lingua ).

Come esempio di codice che è indispensabile e dichiarativa allo stesso tempo, considerare questa implementazione del Fibonacci sequenza in Perl6:

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

Questa è chiaramente una descrizione dichiarativa della sequenza. Tuttavia, come * e ... sono operatori Perl6 validi - la qualunque stelle può essere utilizzato per creare lambda-espressioni, la sequenza-all'operatore di creare liste pigri -. È anche una dichiarazione imperativo invocare codice runtime-intrinseca

Consideriamo alcuni altri paradigmi di programmazione, in particolare programmazione funzionale e orientata agli oggetti.

paradigma funzionale è intrinsecamente dichiarativa, come modella computazione come una relazione tra insiemi.

paradigma object-oriented è intrinsecamente imperativo, come modella computazione come comunicazione tra oggetti con stato, chiamato messaggi.

Alcune lingue sono puri, il che significa tutto il calcolo è conforme al paradigma. Ad esempio, Haskell è un linguaggio puramente funzionale, e Smalltalk è un linguaggio puramente orientato agli oggetti.

Tuttavia, questo non significa che che i linguaggi funzionali resp. linguaggi orientati agli oggetti impediscono resp imperativo. programmazione dichiarativa. In pratica, si utilizza spesso le funzioni imperativamente - si mette in un valore di ingresso per uscire un valore di uscita. Il contrario vale per la programmazione orientata agli oggetti:. L'insieme dei messaggi un oggetto accetta dichiara la sua interfaccia

Alcune persone non sono d'accordo su OO essere un concetto fondamentale, quindi ecco il mio ragionamento.

essenziali orientamento agli oggetti:

  1. oggetti mantenere lo stato (cioè riferimenti ad altri oggetti)
  2. oggetti ricevono (e di processo) i messaggi
  3. l'elaborazione di un messaggio può provocare
    • messaggi inviati beeing all'oggetto stesso o altri oggetti
    • un cambiamento di stato dell'oggetto

Questo significa oo-programmazione richiede stato mutevole tenuto dall'oggetto (!) . Se si simula cambiamento di stato con la creazione di una serie di oggetti, si sta rompendo questi invarianti, semplice.

Flamebait:. Se siete d'accordo con questa definizione di orientamento agli oggetti, riprendere con Alan Kay

Un sacco di diversi concetti contribuiscono al concetto di Object Oriented Programming. Wikipedia elenca mosts di loro.

Vorrei caratterizzare l'essenza della programmazione orientata agli oggetti con l'uso di oggetti con comportamenti .

Wikipedia caratterizza Oggetti dalle seguenti tre proprietà:

  1. Identità : la proprietà di un oggetto che lo distingue da altri oggetti
  2. Stato : descrive i dati memorizzati nell'oggetto
  3. Comportamento : si descrivono le modalità di interfaccia dell'oggetto dal quale l'oggetto può essere utilizzato

Un sacco di Object Oriented Language hanno un concetto di classi, ma in realtà, ci sono anche Prototype lingue basati come JavaScript.

I linguaggi funzionali possono anche utilizzare le classi (ad esempio di tipo Classi in Haskell). Ma solo perché hanno le classi non significa che essi sono object oriented o consentire programmazione orientata agli oggetti. Per rimanere con l'esempio di Haskell: non hanno nemmeno gli oggetti! Non esiste il concetto di "identità"! Tutto si può fare sta componendo funzioni pure!

Solo perché qualcuno sta usando un termine chiamato "classi", ciò non significa che stanno facendo oggetto di programmazione orientata!

OOP è di circa oggetti stateful con comportamento. Anche se il comportamento degli oggetti non devono modificare tale oggetto, perché nuovi oggetti possono essere creati, invece, si sarebbe sciolto il bisogno di oggetti completamente. Non avrebbe bisogno Identità più, perché non importa se le modifiche a un oggetto vengono riflesse da altri riferimenti allo stesso oggetto, perché non ci sarebbe più alcuna modifica. Tutto ciò che serve sono valori (senza identità) e moduli e / o classi per nascondere i dati e l'incapsulamento.

, la programmazione imperativa è inerente alla OOP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top