it-swarm.it

Che cos'è l'astrazione?

Esiste una definizione generalmente concordata per ciò che è astrazione di programmazione, come utilizzato dai programmatori? [Nota, l'astrazione della 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?

38
mlvljr

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 - è un Apple Magic Mouse o un mouse ottico Dell o un Microsoft IntelliMouse - "mouse" è solo un concetto astratto.

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. Buono OOP significa scegliere buone astrazioni al livello di dettaglio appropriato che abbiano un senso nel dominio del tuo programma e non "perdere". Il primo significa che classificare un mouse come un oggetto che ha vinto "Rotolare 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 lo fa" Non ha senso per alcuni tipi di oggetti. Ad esempio, nella mia gerarchia sopra, siamo sicuri che tutte le periferiche siano alimentate dall'elettricità? Se vogliamo raggruppare uno stilo nella categoria "periferica", avremmo un problema, perché non utilizza l'elettricità e abbiamo definito le periferiche del computer come oggetti che usano l'elettricità. il problema cerchio-ellisse è l'esempio più noto di questo enigma.

46
nlawalker

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

Questa è la mia risposta:

Dati due insiemi G e H, una connessione Galois (alpha, 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.

25
Paul Nathan

L'astrazione è più focalizzata su What e 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 dei membri pubblici che forniscono il servizio per chiamare i membri pubblici.

  • Durante l'utilizzo di un oggetto di tipo di un Interface o un abstract class in Java o C++, la vera implementazione è nascosta. E non solo nascosta, anche le implementazioni dei metodi dichiarati in Interface sono probabilmente diverse in base alle varie implementazioni/classi ereditate. Ma mentre stai ottenendo lo stesso servizio, non preoccuparti di How che è implementato ed esattamente Who/What sta 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.

13
Gulshan

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.

7
C. Ross

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, 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: supponiamo di avere 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 è un'affermazione vera.

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".

7
CodexArcanum

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 del 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.

4
Mike Dunlavey

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

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 parametrizzazioni : un mezzo per personalizzare l'uso del costrutto in base alle proprie esigenze specifiche.

Ad esempio, una classe List può sottrarre i dettagli di un'implementazione dell'elenco collegato - dove invece di pensare in termini di manipolazione dei puntatori next e previous, puoi pensare a livello di aggiunta o rimozione di valori in una sequenza. L'astrazione è uno strumento essenziale per creare funzioni 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.

Nell'esempio List, l'incapsulamento può essere usato per nascondere i dettagli di implementazione di un elenco collegato; in un linguaggio orientato agli oggetti, ad esempio, è possibile rendere privati ​​i puntatori next e previous, dove solo l'implementazione dell'elenco può accedere 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 classe List ti fornisse metodi di accesso stile 'getNext'/'setNext', ti incapsulerebbe dai dettagli dell'implementazione (ad esempio, hai chiamato il campo 'prev' o 'previous'? qual era il suo tipo statico?), ma avrebbe un livello di astrazione molto basso.

La modularità riguarda 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, puoi implementare una struttura List in C, esponendo i puntatori 'next' e 'prev' al mondo, ma anche fornire un'interfaccia, contenente initList(), addToList() e removeFromList() 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 Assembly. 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 all'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.

4
Macneil

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.

4
John Fisher

Beh, 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.

4
Kate Gregory

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 sull'altro lato del contenitore o dell'involucro sottratto, speriamo di ridurre le rilavorazioni in futuro.

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

2
Bill

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 esso stesso essere un'astrazione, poiché richiederebbe necessariamente che la cosa sottostante fosse astratta in un insieme di proprietà matematiche! La nozione di teoria delle categorie di morfismo è probabilmente la più vicina a ciò che stai cercando.

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

2
Steven A. Lowe

Ok, penso di aver capito cosa stai chiedendo: "Cos'è 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
Fishtoaster

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 importanti, 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 è necessario ricordare solo l'interfaccia.

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
Jason B

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?

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.

1
Jason Baker

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 è risultato 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 aiuti.

1
back2dos

Un ulteriore livello di riferimento indiretto.

Non vuoi preoccuparti se l'oggetto che stai usando è un Cat o un Dog, quindi vai attraverso una tabella di funzioni virtuali per trovare il giusto makeNoise() funzione.

Sono sicuro che questo potrebbe essere applicato anche ai livelli "inferiore" e "superiore" - pensa a un compilatore che cerca le istruzioni giuste da usare per un determinato processore o l'astrattismo di Haskell Monad sugli effetti computazionali chiamando tutto return e >>=.

1
yatima2975

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.

1
MIA

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, proprio 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 " perdite " 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 OO) che sono implementate in termini di tipi di dati primitivi e istruzioni di linguaggio integrate. Quindi funzioni e classi più complesse sono implementate in termini di quelle più semplici. di queste funzioni e classi implementano strutture di dati, come elenchi, stack, code, ecc. Quelli a loro volta vengono utilizzati per rappresentare entità più specifiche come una coda di processi, un elenco di dipendenti o una tabella hash di titoli di libri. In questo schema di cose ogni livello è un'astrazione rispetto al suo predecessore.

1
Dima

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 dimensioni più piccole elementi ideali.

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

1
whatsisname

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. Quindi 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 piuttosto un buon esempio di cosa sia 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 comprendere un problema, è il mezzo per ottenere qualcosa ma non è la cosa reale

0
guiman

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
jokoon

Ecco una risposta non matematica:

Allontanarsi nella programmazione finge di non preoccuparti dei dettagli ora, mentre in realtà lo fai e dovresti preoccuparti di loro tutto il tempo. Praticamente finge.

0
mojuba

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" vedere 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 più elevato 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 trovare modi complicati per dire che un progetto è equivalente 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 è un livello più alto di B perché se A1 e A2 sono due descrizioni non equivalenti al livello A, quindi le realizzazioni di tali descrizioni, anche B1 e B2 devono anche essere non equivalente al livello B. Tuttavia, non è necessariamente vero il contrario.

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
wahbedahbe