Domanda

Perché l'OO basato su classi è così popolare invece dell'OO basato su prototipi?Insegnano quest'ultimo nelle scuole?Sebbene Javascript sia basato su prototipi, la maggior parte delle persone lo utilizza principalmente in modo funzionale o tramite framework che tentano di emulare un sistema basato su classi.

So che Sun ha effettuato alcune ricerche in merito Se stesso - esiste qualche altra fonte di conoscenza sul prototipo basato oo?preferibilmente qualcosa che sia accessibile agli autodidatti.

Ho trovato un libro che contiene articoli pubblicati: Programmazione basata su prototipo:Concetti, linguaggi e applicazioni

Qualcuno lo ha letto?

--

Quindi ho dato la taglia per la risposta che mi ha dato di più.Eppure non sono del tutto soddisfatto.Mi sarebbe piaciuto ricevere risposte molto più tecniche.Forse non mi sono spiegato bene.

È stato utile?

Soluzione

Il vantaggio di ereditarietà prototipale è che permette potenzialmente metaprogrammazione fantasia in modo semplice perché la catena di prototipi è facilmente manipolabile. Questo è un vantaggio piuttosto accademica perché metaprogrammazione è la risposta sbagliata il 99% del tempo. A titolo di esempio, si potrebbe avere un livello di manipolazione dei dati di stile JavaScript valore-chiave Observer con un modem DSL speciale che in modo trasparente commutato tra un supporto SQLite locale quando non in linea e un negozio di server basato su REST quando online tramite prototipo swapping. Io non sono sicuro che sia il modo migliore per fare questo, ma è il meglio che posso venire con questo ritardo. Non è il genere di cosa che generalmente vuole fare in codice del progetto dal momento che questo tipo di indirezione è l'inferno per eseguire il debug una volta che si avvia sempre andando su più livelli, ma non è male quando si tiene in una libreria.

Un altro vantaggio meno utile è che permette di progettare il proprio sistema di classe. Dico meno utile perché più o meno tutte le librerie javascript hanno il proprio approccio leggermente incompatibile a come 'classi' sono messi insieme.

Ci sono un sacco di persone che hanno risposto che stanno mescolando il modello di ereditarietà con le lingue implementate in quel modello. Il fatto che il javascript è dinamico e debolmente tipizzato e quindi difficile da strumento non ha nulla a che fare con esso che è un linguaggio prototipale.

Altri suggerimenti

Se siete alla ricerca di qualcuno a sottolineare i vantaggi / svantaggi di ciascuno come una spiegazione per la loro popolarità, penso che stai innamorando di un errore che è per qualche motivo molto comune nella tecnologia - che la popolarità ha qualcosa da che fare con qualche misura assoluta di qualità.

La verità è molto più blanda - OO basato classe è popolare perché Java utilizza OO classico, e Sun ha speso milioni di dollari e un tempo molto lungo tempo a costruire la popolarità di Java - assicurandosi che la gente sa che è utilizzato con successo in aziende, ha insegnato ampiamente nelle università e nei test di AP di scuola superiore.

prototipale / OO classica sono solo modi diversi di organizzare le vostre idee. È possibile implementare uno dei due in lingue che non supportano in modo nativo ( Python e Java vengono in mente, e JavaScript sul dall'altro lato).

In OO classica, si definisce una gerarchia di classi astratta per gli oggetti, e poi effettivamente lavorare con le istanze di tali classi. In ereditarietà prototipale, si crea una gerarchia di istanze di oggetti. Anche se immagino che potrebbe essere un po 'eretica in entrambi i campi, non vedo una ragione per non si poteva mescolare i due ...

Non conosco le ragioni esatte di ciò, ma ecco le mie ragioni

Penso che questo argomento sia lo stesso di Dynamic vs Static, una classe è la definizione statica dell'oggetto, che può essere utilizzata facilmente per sapere cosa aspettarsi da un oggetto, aiuta anche a dotare i linguaggi di un supporto e documentazione intellisense adeguati perché puoi facilmente sapere quali sono i diversi membri e metodi nell'oggetto, un'altra cosa è il diverso paradigma di avere la possibilità di dichiarare membri privati ​​nella classe che non viene mostrato sull'oggetto, questo non può essere fatto nel prototipo paradigma.

Il paradigma del prototipo è carino, tuttavia manca della capacità di fornire informazioni sui metodi e sui membri nell'oggetto, il che rende più difficile la creazione di strumenti e ha anche più senso per la programmazione della digitazione dinamica.

Questa domanda mi aveva incuriosito così sono tornato e ho letto alcuni dei documenti originali sul concetto. E sembra aver iniziato a metà degli anni 1980 nel mondo Smalltalk, ma alla fine è diventato uno dei principali fondatori della Auto . Molto più tardi Javascript inoltre adottato esso.

L'argomento messo avanti sui giornali è che è più facile da imparare. Non c'è davvero alcun vantaggio tecnico proposto altro che imparare. I giornali tutti spiegano come è altrettanto espressiva come un linguaggio basato su classi, ma molto più facile da imparare. La gente pensa, naturalmente, le cose in modo concreto e non in astratto. Pensiamo di elefante che abbiamo visto allo zoo, non un "elefante" generico. Quando vediamo altri elefanti, li classifichiamo come differenze rispetto al primo. Un linguaggio basato sui prototipi facilita questo modo di pensare. Pensate a come la programmazione dal differenziale.

E 'questo un motivo sufficiente per usarlo in una lingua? Forse. Nei 25 anni da quando l'idea ha iniziato prima che filtra, direi che i concetti astratti come OO classe-based non è stato troppo difficile per la maggior parte delle persone a imparare. D'altra parte, forse v'è la necessità di un linguaggio di programmazione colletti blu (come Javascript) che è più facile e questo può essere un modo per realizzare questo.

Se interessati, si potrebbe iniziare con questo documento di sé.

Io davvero non voglio scrivere un altro articolo su ereditarietà prototipale di nuovo così ho appena sarò link al mio articoli precedenti. Intendiamoci, sono davvero lunga, ma vale la pena di lettura:

  1. Vantaggi di ereditarietà prototipale oltre classica?
  2. Perché prototipale Inheritance

Credo che la differenza è nella dinamica di potenza (prototipo) lingua dà a voi. Javascript, stessa LISP come, dà il potere quasi illimitato a un programmatore. Questo potere è limitato solo dalla responsabilità del programmatore e il livello della sua fiducia in se stessi. Così la discussione è vecchia quanto lo è - uguale a tipizzazione statica vs. senza tipo. Se si considera il tuo potere di programmazione e l'autodisciplina sono abbastanza forti - andare per stile prototipo

.

Parafrasando un famoso detto:

Il talento fa quello che può (leggi: class-based), il genio fa quello che vuole (leggi: prototipo-based).

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