Che cos'è l'astrazione? [chiuso]


38

Esiste una definizione generalmente concordata su cosa sia un'astrazione di programmazione , come usata dai programmatori? [Nota, l'astrazione di programmazione non deve essere confusa con le definizioni del dizionario per la parola "astrazione".] Esiste una definizione inequivocabile o persino matematica? Quali sono alcuni chiari esempi di astrazioni?


..e essere costretto a dimostrare che non sono un robot quando invio questo suggerisce che sto davvero chiedendo troppo :)
mlvljr

8
Cosa intendi con "matematicamente"? Non penserei davvero all'astrazione come a un concetto matematico.
Fishtoaster

2
@mlvljr: mi dispiace, non sono ancora sicuro di seguirlo. L'astrazione è solo la pratica di fornire un modo più semplice di trattare qualcosa. Non vedo come strumenti / metodi formali abbiano qualcosa a che fare con esso.
Fishtoaster

1
@mlvljr, vuoi un esempio di matematica o matematica che copra tutte le estrazioni di programmazione. Non penso che quest'ultimo esista.
C. Ross,

8
Perhpas cstheory.stackexchange.com è il posto giusto per questa domanda
Conrad Frix,

Risposte:


46

La risposta a "Puoi definire cos'è un'astrazione di programmazione più o meno matematicamente?" è no." L'astrazione non è un concetto matematico. Sarebbe come chiedere a qualcuno di spiegare matematicamente il colore di un limone.

Se vuoi una buona definizione, però: l'astrazione è il processo di passaggio da un'idea specifica a una più generale. Ad esempio, dai un'occhiata al tuo mouse. È wireless? Che tipo di sensore ha? Quanti pulsanti? È ergonomico? Quanto è grande? Le risposte a tutte queste domande possono descrivere con precisione il tuo mouse, ma indipendentemente da quali siano le risposte, è ancora un mouse, perché è un dispositivo di puntamento con pulsanti. Questo è tutto ciò che serve per essere un topo. "Silver Logitech MX518" è un oggetto concreto e specifico, e "mouse" ne è un'astrazione. Una cosa importante a cui pensare è che non esiste un oggetto così concreto come un "mouse", è solo un'idea. Il mouse sulla tua scrivania è sempre qualcosa di più specifico:

L'astrazione può essere stratificata e a grana fine o a grana grossa come vuoi (un MX518 è un mouse, che è un oggetto di puntamento, che è una periferica del computer, che è un oggetto alimentato dall'elettricità), può andare quanto vuoi e praticamente in qualsiasi direzione tu voglia (il mio mouse ha un filo, il che significa che potrei classificarlo come un oggetto con un filo. È anche piatto sul fondo, quindi potrei classificarlo come un tipo di oggetti che non rotolano quando posizionato in posizione verticale su un piano inclinato).

La programmazione orientata agli oggetti si basa sul concetto di astrazioni e famiglie o gruppi di essi. Una buona OOP significa scegliere buone astrazioni al livello appropriato di dettagli che abbiano senso nel dominio del programma e non "fughe". Il primo significa che classificare un mouse come un oggetto che non rotolerà su un piano inclinato non ha senso per un'applicazione che inventaria apparecchiature informatiche, ma potrebbe avere senso per un simulatore di fisica. Quest'ultimo significa che dovresti cercare di evitare di "inscatolarti" in una gerarchia che non ha senso per un certo tipo di oggetti. Ad esempio, nella mia gerarchia sopra, siamo sicuri che tuttole periferiche del computer sono alimentate dall'elettricità? Che ne dici di uno stilo? Se vogliamo raggruppare uno stilo nella categoria "periferica", avremmo un problema, perché non usa l'elettricità e abbiamo definito le periferiche del computer come oggetti che usano l'elettricità. Il problema dell'ellisse circolare è l'esempio più noto di questo enigma.


2
Penso di vedere; stai specificatamente parlando di fare riferimento a un metodo o una funzione in modo astratto, cioè dal suo contratto invece che dalla sua attuazione. Le tue dichiarazioni sono corrette, e questo è un uso perfettamente valido del termine; una chiamata di metodo è un'astrazione di un qualche tipo di comportamento concreto.
nlawalker,

4
@nlawalker: stai mescolando l'astrazione con la generalizzazione. Non sono la stessa cosa. Quello che stai descrivendo è il secondo ("passare da un'idea specifica a una più generale "). L'astrazione si sta spostando da cose concrete a cose astratte, ad esempio con 7 marmi blu e 7 rossi, e dicendo "Ho due set con lo stesso numero di marmi dello stesso colore": qui mi sto spostando da cose concrete (marmi) a cose astratte (classi e set equivalenti). A proposito, un numero naturale n è la classe di tutti gli insiemi equivalenti di cardinalità n, non circolare definito da mapping uno a uno tra quegli insiemi.
Pillmuncher,

33
Il colore di un limone, matematicamente, è leggero con una lunghezza d'onda di circa 570 nm.
Erik,

1
@Erik Stavo per scriverlo. Bah!
Gary Rowe,

1
@Erik Questa è fisica, non matematica :) La matematica non sa nulla di concetti come "luce". La luce è empirica; La matematica no.
Andres F.

25

Non sono categoricamente in disaccordo con la maggior parte delle risposte.

Questa è la mia risposta:

Dati due insiemi G e H, una connessione di Galois (alfa, beta) può essere definita tra di loro, e si può dire che una sia una concretizzazione dell'altra; invertire la connessione e l'una è un'astrazione dell'altra. Le funzioni sono una funzione di concretizzazione e una funzione di astrazione.

Ciò deriva dalla teoria dell'interpretazione astratta dei programmi per computer, che in genere è finora un approccio di analisi statica.


8
OK, ottieni una stella d'oro per il professismo :)
Mike Dunlavey,

@ Mike: Yay? :-)
Paul Nathan,

Ah, e può esserci un esempio?
mlvljr,

2
@mlvljr: di.ens.fr/~cousot/AI astree.ens.fr fornisce uno schizzo di dati.
Paul Nathan,

1
Amir: è la definizione tecnica di astrazione dal mondo dell'analisi statica.
Paul Nathan,

13

L'astrazione è più focalizzata su Whate meno su How. Oppure puoi dire, conoscere solo le cose che devi fare e affidarti al provider per tutti gli altri servizi. A volte nasconde persino l'identità del fornitore di servizi.

Ad esempio, questo sito fornisce un sistema per porre domande e rispondere a queste. Quasi tutti qui sanno quali sono le procedure per chiedere, rispondere, votare e altre cose di questo sito. Ma pochissimi sanno quali sono le tecnologie sottostanti. Ad esempio se il sito è stato sviluppato con ASP.net mvc o Python, se questo è eseguito su un server Windows o Linux ecc. Perché non è affar nostro. Quindi, questo sito sta mantenendo uno strato di astrazione sul meccanismo sottostante che ci fornisce il servizio.

Alcuni altri esempi:

  • Un'auto nasconde tutti i suoi meccanismi ma fornisce un modo per guidare, fare rifornimento e mantenerlo al suo proprietario.

  • Qualsiasi API nasconde tutti i dettagli dell'implementazione fornendo il servizio ad altri programmatori.

  • Una classe in OOP nasconde i suoi membri privati ​​e l'implementazione di membri pubblici che forniscono il servizio per chiamare i membri pubblici.

  • Durante l'utilizzo di un oggetto di tipo an Interfaceo an abstract classin Java o C ++, l'implementazione reale è nascosta. E non solo nascoste, le implementazioni dei metodi dichiarati in Interfacesono probabilmente diverse in varie classi implementate / ereditate. Ma poiché stai ricevendo lo stesso servizio, non preoccuparti Howche sia implementato e che esattamente Who/ Whatstia fornendo il servizio.

  • Identity Hiding : Per la frase "So che Sam può scrivere programmi per computer". l'astrazione può essere- "Sam è un programmatore. I programmatori sanno come scrivere programmi per computer." Nella seconda affermazione, la persona non è importante. Ma la sua capacità di programmare è importante.


Allora perché non chiamarlo semplicemente "specifica esatta di cosa", tra l'altro?
mlvljr

+1 per il bit satori, anche
mlvljr

@mlvljr Un po 'di Howè sempre utile per capire la Whats. Quindi, può essere miscelato con l'astrazione.
Gulshan,

7

Un'astrazione di programmazione è un modello semplificato di un problema.

Ad esempio, una connessione TCP / IP è un'astrazione sull'invio di dati. Devi semplicemente includere un indirizzo IP e un numero di porta e inviarlo all'API. Non ti preoccupi di tutti i dettagli di fili, segnali, formati dei messaggi e guasti.


Aha! Che cos'è un modello semplificato qui? Ricordi il puzzle che perde , a proposito? :)
mlvljr

7

Un'astrazione è solo la versione di programmazione di un teorema.

Hai un sistema formale, proponi un pensiero su quel sistema. Ne fai una prova e, se funziona, allora hai un teorema. Sapendo che il tuo teorema regge, puoi quindi usarlo in ulteriori prove sul sistema. I primitivi forniti dal sistema (come se le istruzioni e i tipi di valore int) fossero in genere visti come assiomi, sebbene ciò non sia strettamente vero poiché tutto ciò che non è istruzioni CPU scritte nel codice macchina è una sorta di astrazione.

Nella programmazione funzionale, l'idea di un programma come una dichiarazione matematica è molto forte, e spesso il sistema di tipi (in un linguaggio forte, tipicamente statico come Haskell, F # o OCAML) può essere usato per testare la teorema attraverso prove.

Ad esempio: diciamo che abbiamo il controllo di addizione e uguaglianza come operazioni primitive e numeri interi e booleani come tipi di dati primitivi. Questi sono i nostri assiomi. Quindi possiamo dire che 1 + 3 == 2 + 2è un teorema, quindi usa le regole di addizione, numeri interi e uguaglianza per vedere se questa è una vera affermazione.

Supponiamo ora di voler moltiplicare, e i nostri primitivi (per brevità) includono un costrutto a ciclo continuo e un mezzo per assegnare riferimenti simbolici. Potremmo suggerirlo

ref x (*) y := loop y times {x +}) 0

Farò finta di averlo dimostrato, dimostrando che la moltiplicazione vale. Ora posso usare la moltiplicazione per fare più cose con il mio sistema (il linguaggio di programmazione).

Posso anche controllare il mio sistema di tipi. (*) ha un tipo di int -> int -> int. Prende 2 ints e genera un int. L'aggiunta ha un tipo di int -> int -> int in modo che 0 + (resto) rimanga fintanto che (resto) risulta in un int. Il mio loop potrebbe fare tutti i tipi di cose, ma sto dicendo che genera una catena di funzioni curry in modo tale che (x + (x + (x ... + 0))) sia il risultato. La forma di quella catena di addizione è solo (int -> (int -> (int ... -> int))) quindi so che il mio output finale sarà un int. Quindi il mio sistema di tipi ha resistito ai risultati della mia altra prova!

Componi questo tipo di idea nel corso di molti anni, molti programmatori e molte righe di codice e hai moderni linguaggi di programmazione: una serie di primitivi e enormi librerie di astrazioni di codice "comprovate".


4

La risposta di Wikipedia sarebbe abbastanza buona? http://en.wikipedia.org/wiki/Abstraction_%28programming%29

Nell'informatica, il meccanismo e la pratica dell'astrazione riducono e determinano i dettagli in modo da potersi concentrare su alcuni concetti alla volta.


E quale sarebbe un esempio di una cosa sottratta allora?
mlvljr,

3
@mlvljr: se leggi l'articolo di Wikipedia, ne vedrai alcuni.
John Fisher,

Purtroppo, sono praticamente sicuro che saranno troppo astratti ..
mlvljr

4

Bene, matematicamente, "intero" è un'astrazione. E quando fai prove formali come quella x + y = y + x per tutti i numeri interi, stai lavorando con l'astrazione "intero" anziché con numeri specifici come 3 o 4. La stessa cosa accade nello sviluppo del software quando interagisci con il macchina a un livello superiore a registri e posizioni di memoria. Puoi pensare a pensieri più potenti a un livello più astratto, nella maggior parte dei casi.


Non sarà l'utilizzo e la IInt add(IInt a, IInt b);subroutine in un programma in cui si conosce in anticipo che ae bsarà, diciamo Int128: IIntpiù o meno buon esempio? - hai il tuo pezzo di codice fare quello che dovrebbe fare, sapendo (essere in grado di provare) che farà ciò di cui hai bisogno e allo stesso tempo (e d'altra parte) lo fai fare esattamente le cose che bisogno senza mai saperlo (con la possibilità di usare quella cosa anche in altri contesti)?
mlvljr,

1
Scusa, ma non riesco a capire la tua domanda.
Kate Gregory,

Bene, supponiamo che tu stia scrivendo un programma che deve aggiungere da 2 a 3. Puoi farlo chiamando una add(int, int)subroutine / funzione. Sarà sufficiente averlo proprio return 2 + 3;in questo caso. E perché dovresti usare una routine più "universale" (con return a + b;cioè operare su qualsiasi reale a e bparametri forniti, e quindi veramente astratta dai loro valori) - questa era la mia domanda (retorica) sopra. Spero che ora sia diventato un po 'più chiaro.
mlvljr

Il mio primo commento è piuttosto "auto-offuscato", sono d'accordo :)
mlvljr

4

Stai ricevendo buone risposte qui. Vorrei solo avvertire: la gente pensa che l'astrazione sia in qualche modo questa cosa meravigliosa che deve essere messa su un piedistallo e di cui non ne hai mai abbastanza. Non è. È solo buon senso. Sta solo riconoscendo le somiglianze tra le cose, quindi puoi applicare una soluzione al problema a una serie di problemi.

Permettimi una pipì ...

In cima alla mia lista di fastidi è quando le persone parlano di "strati di astrazione" come se fosse una buona cosa. Fanno "involucri" attorno a classi o routine che non gli piacciono e li chiamano "più astratti", come se ciò li rendesse migliori. Ricordi la favola della "Principessa e il pisello"? La principessa era così delicata che se ci fosse un pisello sotto il materasso non sarebbe stata in grado di dormire, e l'aggiunta di più strati di materassi non avrebbe aiutato. L'idea che l'aggiunta di più livelli di "astrazione" sia di aiuto è proprio così - di solito no. Significa solo che qualsiasi modifica all'entità di base deve essere increspata attraverso più livelli di codice.


Pensare all'astrazione come a qualcosa di "troppo bello per essere chiaramente percepito (o, ancora di più, descritto in termini asciutti (matematici)" non aiuta a (in primo luogo e almeno) a capire di cosa si tratta e (in secondo luogo) a sviluppare le sue tecniche applicazione e valutazione (horror!) [di come e in che modo il codice dato è astratto].
mlvljr

3
Se un cambiamento in un posto ti rende necessario apportare più cambiamenti altrove, le tue astrazioni sono cattive. In sostanza, non dirò che io o chiunque altro non abbiamo mai sbagliato dal lato di troppa astrazione, ma esiste un metodo per quella follia. Le buone astrazioni sono la pietra angolare del codice liberamente accoppiato. Data la giusta astrazione, i cambiamenti diventano ridicolmente semplici. Quindi sì, metto astrazioni su un piedistallo e passo una quantità eccessiva di tempo a trovare quelle giuste.
Jason Baker,

@Jason Baker Lascia che le nostre tecniche di astrazione siano abbastanza concrete per essere usate in modo efficace ...
mlvljr

1
@Jason: "Se un cambiamento in un posto ti obbliga a fare più cambiamenti altrove, le tue astrazioni sono cattive." Sono con te lì. Mi sembra di essere circondato da quelli cattivi.
Mike Dunlavey,

1
Sembra che tu abbia lavorato in un posto in cui gli sviluppatori avevano grandi visioni e non c'era un capo forte che tenesse la squadra concentrata. Quando mi trovo in un ambiente del genere, inizio a cercare un altro lavoro (budget di progetto sempre in sospeso o azienda abbastanza piccola => in bancarotta). Di recente ho visto un tweet: "spaghetti code" vs. "lasagna code", quest'ultimo è quando ci sono troppi strati.
yzorg,

4

Penso che potresti trovare utile un mio post sul blog su astrazioni che perdono. Ecco lo sfondo rilevante:

L'astrazione è un meccanismo per aiutare a prendere ciò che è comune tra un insieme di frammenti di programma correlati, rimuovere le loro differenze e consentire ai programmatori di lavorare direttamente con un costrutto che rappresenta quel concetto astratto. Questo nuovo costrutto (praticamente) ha sempre delle parametrizzazioni : un mezzo per personalizzare l'uso del costrutto in base alle proprie esigenze specifiche.

Ad esempio, una Listclasse può sottrarre i dettagli di un'implementazione dell'elenco collegato, dove invece di pensare in termini di manipolazione nexte previouspuntatori, puoi pensare a livello di aggiunta o rimozione di valori a una sequenza. L'astrazione è uno strumento essenziale per creare funzionalità utili, ricche e talvolta complesse da un insieme molto più piccolo di concetti più primitivi.

L'astrazione è correlata all'incapsulamento e alla modularità e questi concetti sono spesso fraintesi.

Nel Listesempio, incapsulamento può essere utilizzato per nascondere i dettagli di implementazione di una lista collegata; in un linguaggio orientato agli oggetti, ad esempio, è possibile rendere privati ​​i puntatori nexte previous, dove solo l'implementazione dell'elenco ha accesso a questi campi.

L'incapsulamento non è sufficiente per l'astrazione, perché non implica necessariamente che tu abbia una nuova o diversa concezione dei costrutti. Se tutta una Listclasse ti fornisse metodi di accesso stile ' getNext' / ' setNext', ti incapsulerebbe dai dettagli di implementazione (ad esempio, hai chiamato il campo ' prev' o ' previous'? Qual era il suo tipo statico?), Ma avrebbe un livello molto basso di astrazione.

La modularità riguarda il nascondere le informazioni : le proprietà stabili sono specificate in un'interfaccia e un modulo implementa tale interfaccia, mantenendo tutti i dettagli di implementazione all'interno del modulo. La modularità aiuta i programmatori a far fronte al cambiamento, perché altri moduli dipendono solo dall'interfaccia stabile.

Il nascondere le informazioni è aiutato dall'incapsulamento (in modo che il codice non dipenda da dettagli di implementazione instabili), ma l'incapsulamento non è necessario per la modularità. Ad esempio, è possibile implementare una Liststruttura in C, esponendo le ' next' e ' prevpuntatori' al mondo, ma anche fornire un'interfaccia, che contiene initList(),addToList() eremoveFromList()funzioni. A condizione che vengano seguite le regole dell'interfaccia, è possibile garantire che determinate proprietà rimarranno sempre valide, ad esempio garantendo che la struttura dei dati sia sempre in uno stato valido. [Il classico documento di Parnas sulla modularità, per esempio, è stato scritto con un esempio in assemblea. L'interfaccia è un contratto e una forma di comunicazione sul design, non deve necessariamente essere controllata meccanicamente, anche se questo è ciò su cui facciamo affidamento oggi.]

Sebbene termini come astratto, modulare e incapsulato siano usati come descrizioni positive del design, è importante rendersi conto che la presenza di una di queste qualità non ti dà automaticamente un buon design:

  • Se un algoritmo n ^ 3 è "ben incapsulato", funzionerà comunque peggio di un algoritmo n log n migliorato.

  • Se un'interfaccia si impegna in un sistema operativo specifico, nessuno dei vantaggi di un design modulare verrà realizzato quando, per esempio, un videogioco deve essere trasferito da Windows a iPad.

  • Se l'astrazione creata espone troppi dettagli inessenziali, non riuscirà a creare un nuovo costrutto con le sue operazioni: sarà semplicemente un altro nome per la stessa cosa.


Bene, quello sembra riguardare quello che volevo realmente (alcuni "rant" a prova di buonsenso / esempio sulla visione "modulare == astratto == buono == non puoi mai stimare-si-lotta") , grazie (ancora leggendo)
mlvljr

Ed ecco un motto provocatorio dalla mia imminente risposta (alla mia domanda) "Le astrazioni perdono quando le menti si indeboliscono";)
mlvljr

2

Ok, penso di aver capito cosa stai chiedendo: "Qual è una definizione matematicamente rigorosa di 'An Abstraction'."

In tal caso, penso che tu sia sfortunato- "astrazione" è un termine di architettura / design del software e non ha alcun supporto matematico per quanto ne sappia (forse qualcuno più esperto in CS teorico mi correggerà qui), più che "accoppiamento" o "occultamento delle informazioni" hanno definizioni matematiche.


2

L'astrazione avviene quando si ignorano i dettagli ritenuti irrilevanti a favore di quelli ritenuti pertinenti.

L'astrazione comprende l'incapsulamento, il nascondimento delle informazioni e la generalizzazione. Non comprende analogie, metafore o euristiche.

Qualsiasi formalismo matematico per il concetto di astrazione sarebbe essa stessa essere un'astrazione, in quanto richiederebbe necessariamente la cosa sottostante che deve essere sottratto in una serie di proprietà matematiche! La nozione di teoria morfologica di un morfismo è probabilmente più vicina a ciò che stai cercando.

L'astrazione non è qualcosa che dichiari, è qualcosa che fai .


+1, "Faccio astrazione!" sarà bello per una maglietta;) Grazie per il link sul morfismo (s) (anche se non menziona direttamente il poli - uno tra le dozzine di altri citati;)).
mlvljr,

2

Come modo di spiegarlo a un'altra persona, farei il contrario, dai risultati precedenti:

L'astrazione nella programmazione informatica è l'atto di generalizzare qualcosa al punto che più di una cosa simile può essere generalmente trattata come la stessa e gestita la stessa.

Se vuoi espanderci, puoi aggiungere:

A volte questo viene fatto per ottenere un comportamento polimorfico (interfacce ed ereditarietà) per ridurre il codice ripetitivo in anticipo, altre volte viene fatto in modo che i meccanismi interni di qualcosa possano essere sostituiti in una data futura con una soluzione simile senza dover modificare il codice dall'altra parte del contenitore o dell'involucro sottratto, speriamo di ridurre le rilavorazioni in futuro.

Oltre a ciò, penso che devi iniziare con esempi ...


1

Potresti voler dare un'occhiata ad alcune delle metriche di Bob Martin

http://en.wikipedia.org/wiki/Software_package_metrics

Detto questo, non credo che la sua "Astrattezza" sia uguale alla tua. La sua è più una misura di "mancanza di implementazione su una classe" che significa l'uso di interfacce / classi astratte. L'instabilità e la distanza dalla sequenza principale probabilmente giocano di più in ciò che stai cercando.


Sì, ricorda quel foglio. Lo zio Bob è geniale nel dare energia alla folla e nel rendere le persone interessate ai meccanismi di OO.
mlvljr

Stranamente, ho dimenticato di votare (subito) :)
mlvljr

1

Merriam-webster definisce l'abstract come un essere aggettivo: dissociato da qualsiasi istanza specifica.

Un'astrazione è un modello di qualche sistema. Elencano spesso un gruppo di ipotesi che devono essere soddisfatte affinché un sistema reale possa essere modellato dall'astrazione e sono spesso utilizzate per permetterci di concettualizzare sistemi sempre più complicati. Passare da un sistema reale a un'astrazione non ha alcun metodo matematico formale per farlo. Dipende dal giudizio di chi sta definendo l'astrazione e qual è lo scopo dell'astrazione.

Spesso però le astrazioni sono definite in termini di costrutti matematici. Questo è probabilmente perché sono così spesso usati nella scienza e nell'ingegneria.

Un esempio è la meccanica newtoniana. Presuppone che tutto sia infinitamente piccolo e che tutta l'energia sia conservata. Le interazioni tra oggetti sono chiaramente definite da formule matematiche. Ora, come sappiamo, l'universo non funziona in questo modo, e in molte situazioni l'astrazione fuoriesce. Ma in molte situazioni, funziona molto bene.

Un altro modello astratto sono i tipici elementi di circuito lineare, resistori, condensatori e induttori. Anche in questo caso le interazioni sono chiaramente definite da formule matematiche. Per i circuiti a bassa frequenza o semplici driver di relè e altre cose, l'analisi RLC funziona bene e fornisce risultati molto buoni. Ma altre situazioni, come i circuiti radio a microonde, gli elementi sono troppo grandi e le interazioni sono più fini e le semplici astrazioni RLC non reggono. Cosa fare a quel punto dipende dal giudizio dell'ingegnere. Alcuni ingegneri hanno creato un'altra astrazione sopra gli altri, alcuni sostituendo gli amplificatori operazionali ideali con nuove formule matematiche per il loro funzionamento, altri sostituiscono gli amplificatori operazionali ideali con amplificatori operazionali reali simulati, che a loro volta sono simulati con una complessa rete di più piccoli elementi ideali.

Come altri hanno già detto, è un modello semplificato. È uno strumento utilizzato per comprendere meglio i sistemi complessi.


Probabilmente avrei dovuto sottolinearlo meglio, ma non sono interessato al tipo di astrazioni che mancano di dettagli inutili dei loro prototipi del mondo reale, ma forniscono quindi alcuni suggerimenti utili sulla progettazione di sistemi che dovrebbero occuparsi degli oggetti del mondo reale sopra menzionati (ad esempio la costruzione di una classe Employee con alcune proprietà dei Employee del mondo reale probabilmente utili in un'applicazione aziendale). Quello che mi interessa è il tipo di astrazione che "divide" un'entità software da altre entità simili che la trattano (ad esempio saranno Employerle ipotesi su Employee).
mlvljr

1
Non hai alcun senso. Fornire suggerimenti sulla progettazione di un sistema reale non è uno scopo per un'astrazione. Se non sai nulla di ciò che viene modellato, questo non è un problema da risolvere per un'astrazione.
whatsisname

Stavo parlando di sottrarre i dettagli degli oggetti del mondo reale che il software tratterà, nel processo di creazione di quel software. Usare un'astrazione (software) di un'entità del mondo reale per (ri) progettare che la cosa del mondo reale non era intesa (si tratta di "sistemi software" come "sistemi" in "ma quindi fornire alcuni suggerimenti utili sulla progettazione di sistemi" in il mio commento sopra).
mlvljr,

1

Un'astrazione rappresenta qualcosa (ad esempio un concetto, una struttura di dati, una funzione) in termini di qualcos'altro. Ad esempio usiamo le parole per comunicare. Una parola è un'entità astratta che può essere rappresentata in termini di suoni (discorso) o in termini di simboli grafici (scrittura). L'idea chiave di un'astrazione è che l'entità in questione è distinta dalla rappresentazione sottostante, così come una parola non è i suoni che vengono utilizzati per pronunciarla o le lettere utilizzate per scriverla.

Pertanto, almeno in teoria, la rappresentazione di base di un'astrazione può essere sostituita da una rappresentazione diversa. In pratica, tuttavia, l'astrazione è raramente del tutto distinta dalla rappresentazione sottostante, e talvolta la rappresentazione " perde " attraverso. Ad esempio, il discorso porta sfumature emotive che sono molto difficili da trasmettere per iscritto. Per questo motivo una registrazione audio e una trascrizione delle stesse parole possono avere effetti molto diversi sul pubblico. In altre parole, l'astrazione delle parole spesso perde.

Le astrazioni vengono generalmente in strati. Le parole sono astrazioni che possono essere rappresentate da lettere, che a loro volta sono esse stesse astrazioni di suoni, che sono a loro volta astrazioni del modello di movimento delle particelle d'aria che sono create dalle corde vocali e che vengono rilevate dai timpani .

Nell'informatica i bit sono in genere il livello più basso di rappresentazione. Byte, posizioni di memoria, istruzioni di assemblaggio e registri della CPU sono il prossimo livello di astrazione. Quindi abbiamo tipi di dati primitivi e istruzioni di un linguaggio di livello superiore, che sono implementati in termini di byte, posizioni di memoria e istruzioni di assemblaggio. Quindi funzioni e classi (assumendo un linguaggio OO) che sono implementate in termini di tipi di dati primitivi e istruzioni di linguaggio integrate. Quindi le funzioni e le classi più complesse vengono implementate in termini di quelle più semplici. Alcune di queste funzioni e classi implementano strutture di dati, come elenchi, pile, code, ecc. Quelle a loro volta vengono utilizzate per rappresentare entità più specifiche come una coda di processi, un elenco di dipendenti o una tabella hash di titoli di libri .


1
Se perde, ovviamente non è un'astrazione ... abbastanza, siamo onesti.
mlvljr,

2
@mlvljr I computer non sono problemi di matematica, purtroppo, quindi devi consentire un certo livello di perdite. Se non altro, il fatto che i calcoli vengano eseguiti su un dispositivo fisico implica alcuni vincoli rispetto alla portata dei problemi che possono essere modellati. Tecnicamente, i teoremi di incompletezza implicano che certe cose non possono essere provate sui sistemi matematici internamente, quindi persino la matematica ha "astrazioni che perdono".
CodexArcanum,

2
Puoi sempre trovare una situazione in cui perderà un'astrazione. Non esiste un'astrazione perfetta. È semplicemente una questione di quanto perde e se puoi conviverci.
Dima,

@CodexArcanum 1. Una routine che prende un valore intinferiore a (MAX_INT_SIZE / 2-1) e ne restituisce un altro che è il doppio: int f(int a) { return a*2; }2. un "gestore" con un prototipo void (*) (void)da chiamare quando ... uhmm dovrebbe essere chiamato secondo il contratto del chiamante - entrambi rappresentano astrazioni (1 - sui dettagli della sua implementazione (che abbiamo fornito, ma che non saranno accessibili a coloro che non hanno accesso al codice sorgente), 2-- su ciò che esattamente il gestore fa (notare, tuttavia, che questo è noto alla persona che ha assegnato il gestore)) e non perdere
mlvljr

La limitazione su MAX_INT_SIZE non è chiarita in nessun punto della firma del metodo. A meno che tu non usi un linguaggio che consenta la programmazione basata su contratto (come Eiffel), è una perdita. Le limitazioni di menzione nella documentazione non contano, poiché la documentazione è esterna al sistema. E se il potere si spegne nel mezzo di un'operazione? Cosa succede se devi trasmettere dati su una rete e c'è latenza? Nessun paradigma di programmazione può sottrarre la fisicità dell'hardware del sistema.
CodexArcanum,

1

Un modo in cui provo a descriverlo alle persone, potrebbe non essere il modo migliore

Considera un programma che aggiunge 2 + 2 e uscite 4

Considera un programma che aggiunge due numeri immessi da un utente, x + y = z

Qual è più utile e generale?


Questo è quasi il mio commento alla risposta di Kate Gregory. ;) La cosa interessante è che, mentre il programma meno generale può utilizzare quello più generale, fornire un utente che ha richiesto il primo con il secondo sarebbe probabilmente contro-utile ...
mlvljr

1

Direi che un'astrazione è qualcosa che nasconde dettagli inutili. Una delle unità di base più astratte è la procedura. Ad esempio, non voglio preoccuparmi di come sto salvando i dati nel database quando sto leggendo quei dati da un file. Quindi creo una funzione save_to_database.

Le astrazioni possono anche essere unite per formare astrazioni più grandi. Ad esempio, le funzioni possono essere riunite in una classe, le classi possono essere unite per formare un programma, i programmi possono essere uniti per formare un sistema distribuito, ecc.


La chiamata in codice save_to_databasenon dovrebbe preoccuparsi di come vengono salvati esattamente i dati, purché / perché tu abbia scelto l'implementazione di cui hai bisogno ! Vale a dire che ci sarà un posto in cui fornire i dettagli ("relativi" astratti ad alcuni pezzi di codice) comunque, è solo questione di sceglierli giudiziosamente - fornire un "cambio di idea" più facile, ecc.
mlvljr

1

Penso sempre all'astrazione nella programmazione come a nascondere dettagli e a fornire un'interfaccia semplificata. È la ragione principale per cui i programmatori possono scomporre compiti monumentali in pezzi gestibili. Con l'astrazione, è possibile creare la soluzione a una parte del problema, inclusi tutti i dettagli grintosi, e quindi fornire una semplice interfaccia per utilizzare la soluzione. Quindi puoi in effetti "dimenticare" i dettagli. Questo è importante perché non c'è modo in cui una persona possa tenere in mente tutti i dettagli di un sistema super complesso contemporaneamente. Questo non vuol dire che i dettagli sottostanti l'astrazione non dovranno mai essere rivisitati, ma per il momento, solo l'interfaccia deve essere ricordata.

Nella programmazione, questa interfaccia semplificata può essere qualsiasi cosa, da una variabile (estrae un gruppo di bit e fornisce un'interfaccia matematica più semplice) a una funzione (estrae qualsiasi quantità di elaborazione in una chiamata a linea singola) a una classe e oltre.

Alla fine, il compito principale dei programmatori è di solito sottrarre tutti i dettagli computazionali e fornire un'interfaccia semplice come una GUI che qualcuno che non conosce una cosa su come i computer possono utilizzare.

Alcuni dei vantaggi dell'astrazione sono:

  • Permette di scomporre un grosso problema in pezzi gestibili. Quando si aggiungono i record di una persona a un database, non è necessario incasinare l'inserimento e il bilanciamento degli alberi degli indici nel database. Questo lavoro potrebbe essere stato fatto ad un certo punto, ma ora è stato sottratto e non devi più preoccupartene.

  • Consente a più persone di lavorare bene insieme su un progetto. Non voglio conoscere tutti i dettagli del codice del mio collega. Voglio solo sapere come usarlo, cosa fa e come adattarlo al mio lavoro (l'interfaccia).

  • Consente alle persone che non hanno le conoscenze necessarie di svolgere un compito complesso per farlo. Mia mamma può aggiornare il suo Facebook e le persone che conosce in tutto il paese possono vederlo. Senza l'astrazione di un sistema follemente complesso con una semplice interfaccia web, non sarebbe in alcun modo in grado di iniziare a fare qualcosa di simile (né lo farei per questo).

L'astrazione, tuttavia, può avere l'effetto contrario di rendere le cose meno gestibili se viene abusato. Rompendo un problema in troppi piccoli pezzi, il numero di interfacce che devi ricordare aumenta e diventa più difficile capire cosa sta realmente succedendo. Come la maggior parte delle cose, è necessario trovare un equilibrio.


1

Un ulteriore livello di riferimento indiretto.

Non vuoi preoccuparti se l'oggetto che stai usando è a Cato a Dog, quindi vai attraverso una tabella di funzioni virtuali per trovare la makeNoise()funzione giusta .

Sono sicuro che questo potrebbe essere applicato anche ai livelli "più bassi" e "più alti" - pensa a un compilatore che cerca le istruzioni giuste da usare per un determinato processore o l' Monadastrattismo di Haskell sugli effetti computazionali chiamando tutto returne >>=.


1

Questo è qualcosa su cui volevo davvero blog per un periodo più lungo, ma non ci sono mai riuscito. Fortunatamente, sono un rappresentante di zombi e c'è persino una taglia. Il mio post si è rivelato piuttosto lungo , ma ecco l'essenza:

L'astrazione nella programmazione riguarda la comprensione dell'essenza di un oggetto in un determinato contesto.

[...]

L'astrazione non si confonde solo con la generalizzazione, ma anche con l'incapsulamento, ma queste sono le due parti ortogonali di nascondere le informazioni: il modulo di servizio decide cosa è disposto a mostrare e il modulo client decide cosa è disposto a vedere. L'incapsulamento è la prima parte e l'astrazione la seconda. Solo entrambi insieme nascondono informazioni complete.

Spero che sia d'aiuto.


+1, Sì, l'argomento sembra davvero impantanare molti di noi;) Spero di (finalmente) integrare la tua risposta con alcuni miei punti per suscitare un po 'più di interesse nella discussione.
mlvljr,

0

Ecco una risposta non matematica:

Sottrarsi alla programmazione fa finta che non ti interessino i dettagli ora, mentre in realtà lo fai e dovresti preoccuparti di loro tutto il tempo. Praticamente finge.


1
+1, ma non sempre penso (pensa a dettagli davvero inutili :)). La domanda iniziale è: "Si tratta di rimuovere i dettagli per sempre, dimenticandoli temporaneamente o addirittura utilizzandoli in qualche modo senza saperlo?"
mlvljr,

1
Non mi interessa quanti fotoni hanno colpito i miei clienti oggi.
flamingpenguin,

0

Per me l'astrazione è qualcosa che non esiste "letteralmente", è qualcosa come un'idea. Se lo esprimi matematicamente, non è più astratto perché la matematica è un linguaggio per esprimere ciò che accade nel tuo cervello in modo che possa essere compreso dal cervello di qualcun altro, quindi non puoi strutturare le tue idee, perché se lo fai, non è un'idea più: dovresti capire come funziona un cervello per esprimere un modello di idea.

L'astrazione è qualcosa che ti permette di interpretare la realtà in qualcosa che può essere indipendente da essa. Puoi astrarre una spiaggia e un sogno, ma la spiaggia esiste ma il sogno no. Ma potresti dire che esistono entrambi, ma non è vero.

La cosa più difficile in astrazione è trovare un modo per esprimerlo in modo che altre persone possano capirlo in modo che possa trasformarsi in realtà. Questo è il lavoro più difficile e non può essere fatto da solo: devi inventare un modello relativo che lavora sulle tue idee e che può essere compreso da qualcun altro.

Per me l'astrazione nel linguaggio del computer dovrebbe essere il nome di "matematizzare" il modello, si tratta di riutilizzare idee che possono essere comunicate ed è un enorme vincolo rispetto a ciò che può essere realizzato in modo astratto.

Per dirla semplicemente, gli atomi sono uno accanto all'altro, ma a loro non importa. Una grande serie di molecole organizzate in un essere umano può capire che è vicino a qualcuno, ma non riesce a capire come, è proprio come gli atomi si sono posizionati in qualche modo.

Un oggetto governato da un concetto, in generale, non può "comprendere" se stesso. Ecco perché proviamo a credere in Dio e perché abbiamo difficoltà a capire il nostro cervello.

Posso avere la mia medaglia ora?


0

Domanda interessante. Non conosco un'unica definizione di astrazione considerata autorevole quando si tratta di programmazione. Anche se altre persone hanno fornito collegamenti ad alcune definizioni da vari rami della teoria CS o della matematica; Mi piace pensarlo in modo simile alla "supervenienza", vedi http://en.wikipedia.org/wiki/Supervenience

Quando parliamo di astrazione nella programmazione, stiamo essenzialmente confrontando due descrizioni di un sistema. Il tuo codice è una descrizione di un programma. Un'astrazione del tuo codice sarebbe anche una descrizione di quel programma ma a un livello "più alto". Ovviamente potresti avere un'astrazione di livello ancora superiore della tua astrazione originale (ad esempio una descrizione del programma in un'architettura di sistema di alto livello rispetto alla descrizione del programma nella sua progettazione dettagliata).

Ora, ciò che rende una descrizione "di livello superiore" rispetto a un'altra. La chiave è la "realizzabilità multipla": la tua astrazione del programma potrebbe essere realizzata in molti modi in molte lingue. Ora potresti dire che uno potrebbe produrre anche più progetti per un singolo programma: due persone potrebbero produrre due diversi progetti di alto livello che descrivono entrambi accuratamente il programma. L'equivalenza delle realizzazioni fa la differenza.

Quando si confrontano programmi o progetti, è necessario farlo in un modo che consenta di identificare le proprietà chiave della descrizione a quel livello. Puoi entrare in modi complicati per dire che un progetto equivale a un altro, ma il modo più semplice di pensarci è questo: un singolo programma binario può soddisfare i vincoli di entrambe le descrizioni?

Quindi cosa rende un livello di descrizione più alto dell'altro? Diciamo che abbiamo un livello di descrizione A (ad es. Documenti di progettazione) e un altro livello di descrizione B (ad es. Codice sorgente). A è di livello superiore a B perché se A1 e A2 sono due descrizioni non equivalenti a livello A, quindi la realizzazione di tali descrizioni, anche B1 e B2 devono essere non equivalenti a livello B. Tuttavia, il contrario non è necessariamente vero .

Quindi, se non riesco a produrre un singolo programma binario che soddisfa due distinti documenti di progettazione (ovvero i vincoli di tali progetti si contraddicono a vicenda), il codice sorgente che implementa tali progetti deve essere diverso. D'altra parte, se prendo due insiemi di codice sorgente che non possono essere compilati nello stesso programma binario, è comunque possibile che i binari risultanti dalla compilazione di questi due insiemi di codice sorgente soddisfino entrambi lo stesso design documento. Pertanto, il documento di progettazione è una "astrazione" del codice sorgente.


0

Le astrazioni di programmazione sono astrazioni fatte da qualcuno su un elemento programmatico. Diciamo che sai come costruire un menu con i suoi elementi e cose. Poi qualcuno ha visto quel pezzo di codice e ha pensato, ehi che potrebbe essere utile in altri tipi di strutture simili a hireachy, e ha definito il Component Design Pattern con è un'astrazione del primo pezzo di codice.

I pattern di progettazione orientati agli oggetti sono un buon esempio di ciò che è l'astrazione, e non intendo la vera implementazione ma il modo in cui dovremmo approcciare una soluzione.

Quindi, per riassumere, programmare l'astrazione è un approccio che ci consente di capire un problema, è il mezzo per ottenere qualcosa ma non è la cosa reale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.