Qual è la differenza tra ADT e oggetti? [chiuso]

1

Questa domanda è stata risolta in " Comprensione dei tipi di dati astratti (ADT) " e la risposta più votata (di Frank Shearar) è attualmente la seguente:

Objects are not ADTs (*) [editor's note: Links to "On Understanding Data Abstraction, Revisited" - Cook]. (So in C# String and Int32 are not ADTs.)

With that out of the way, an abstract data type "has a public name, a hidden representation, and operations to create, combine and observe values of the abstraction". (Quoting from the linked paper.)

(*) Briefly, Cook explains that:

  • Objects cannot inspect the hidden representation of other objects, unlike members of an ADT. That implies that values of an ADT may be
    implemented efficiently, even for operations that require inspection
    of multiple abstract values.

  • Objects behave like a characteristic function over the values of a type, rather than as an algebra. Objects use procedural abstraction rather than type abstraction

  • ADTs usually have a unique implementation in a program. When one's language has modules, it's possible to have multiple implementations of an ADT, but they can't usually interoperate.

Il mio problema è con il secondo punto. Penso che nella carta collegata, capita solo che per l'esempio specifico di un set usato nella carta di Cook, un oggetto possa essere visto come una funzione caratteristica. Non penso che gli oggetti, in generale, possano essere visti come funzioni caratteristiche.

Inoltre, nel documento Aldritch (Il potere dell'interoperabilità: perché gli oggetti sono inevitabili) suggerisce

Cook’s definition essentially identifies dynamic dispatch as the most important characteristic of object

accettando questo e con Alan Kay quando ha detto

OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.

Tuttavia, in queste serie di diapositive delle lezioni suggerisce che le classi di Java sono ADT mentre le interfacce Java sono oggetti - e infatti l'uso di "oggetti" di interfacce può interagire (una delle caratteristiche chiave di OOP come indicato in uno dei punti elenco sopra).

Le mie domande sono

  1. Sono corretto nel dire che le funzioni caratteristiche non sono una caratteristica fondamentale degli oggetti e che Frank Shearar è in errore

  2. I dati che comunicano tra loro attraverso gli esempi di interfacce Java degli oggetti anche se non utilizzano la spedizione dinamica? Perché? (la mia comprensione è che la distribuzione dinamica è più flessibile e che le interfacce rappresentano un passo verso la messaggistica oggettiva C / smalltalk / erlang)

  3. L'idea del principio di inversione delle dipendenze è correlata alla distinzione tra oggetti e oggetti ADT? (vedi la pagina di wikipedia o google "Gli oggetti parlanti: un racconto sulla programmazione orientata ai messaggi" Anche se sono nuovo del concetto, capisco che ciò implichi l'aggiunta di interfacce tra "strati" di un programma (vedi lo schema della pagina di wikipedia)

  4. Fornisci altri esempi / chiarimenti sulla distinzione tra oggetti e ADT, se lo desideri.

posta LMZ 14.01.2016 - 02:39
fonte

1 risposta

1
  1. No. Gli oggetti sono ben noti oggi per coinvolgere un mix di dati e funzioni. Rimozione delle funzioni significa che non hai più un oggetto.

  2. Sì. Le interfacce utilizzano ancora il dispatch dinamico per chiamare la funzione corretta in base al tipo di runtime dell'oggetto che soddisfa l'interfaccia. Tu sei giusto che il dispatch dinamico è spesso usato per indicare un invio multiplo , dove più del solo parametro this può causare il dispatch, ma il dispatch limitato è ancora sufficiente per gli oggetti .

  3. Non particolarmente. Voglio dire, dal momento che gli ADT sono solo dati, non ci sono dipendenze da invertire. Puoi esaminare gli oggetti funzione rispetto agli ADT come una sorta di inversione di dipendenza, ma l'ADT non li possiede.

  4. Scrivi altro codice. Gli ADT hanno un numero di tratti che la maggior parte degli oggetti non ha. Inferno, anche la maggior parte degli oggetti non ha i tratti degli oggetti. La differenza è spesso nelle capacità delle cose. E molti di questi tratti diventano chiari una volta che inizi a utilizzarli e capisci in che modo le loro diverse capacità limitano la progettazione e l'implementazione del tuo programma.

risposta data 14.01.2016 - 03:05
fonte

Leggi altre domande sui tag