2013-08-09 21 views
8

Ho letto di Stroustrup "The C++ Programming Language" e lui parla di "astrazioni" molto:Cosa sono le "astrazioni"?

Molte delle astrazioni più flessibili, efficienti e utili coinvolgono la parametrizzazione dei tipi (classi) e gli algoritmi (funzioni) con altri tipi e algoritmi

e

C++ è un linguaggio per lo sviluppo e l'utilizzo di astrazioni elegante ed efficiente.

È in qualche modo correlato alle classi astratte in C++? O con l'uso di polimorfismo, ereditarietà o modelli?

Qualcuno potrebbe dare un esempio, per favore?

+2

Immagina che ci vuole un sacco di lavoro per completare un compito. Ora immagina che la loro fosse una semplice funzione per farlo. Voila, un'astrazione. – chris

+1

B.Stroustrup (http://www.stroustrup.com/glossary.html) - * astrazione - l'atto di specificare un'interfaccia generale che nasconde i dettagli di implementazione. Classi, classi astratte e modelli sono i principali meccanismi di astrazione in C++. Vedi anche: incapsulamento. * – SChepurin

+2

riaprire questa domanda, [c'è una risposta adeguata] (http://www.boost.org/community/generic_programming.html#concept) – TemplateRex

risposta

15

astrazione (n) - la qualità di trattare con idee piuttosto che eventi

— fonte: Oxford English Dictionary

Stroustrup non si riferisce a classi astratte o altre idee specifiche in programmazione. Piuttosto, si riferisce alla parola astrazione stessa.

Le astrazioni sono aiutanti mentali. Ci aiutano a pensare in "teoria" piuttosto che in un'applicazione diretta. La matematica è l'arte dell'astrazione. La programmazione è l'arte delle astrazioni applicate.

Le astrazioni ci aiutano a formare modelli mentali, come le gerarchie, per aiutarci a pensare alle cose. Il polimorfismo è possibile a causa delle astrazioni. Diamo un'occhiata a un esempio.

Esempio

1st level

Ho un Oleksiy Dobrodum. Mi riferisco ad un Oleksiy Dobrodum, lo tratto come un Oleksiy Dobrodum, tutto ciò che sarà mai sarà un Oleksiy Dobrodum. Tutto quello che faccio a questo Oleksiy Dobrodum è specificamente per questo. Ora siamo al 1 ° livello di astrazione, o il più specifico che avremo mai quando lavoreremo con questo Oleksiy Dobrodum.

Recentemente ho acquistato una Zach Latta, quindi ora ho sia un Oleksiy Dobrodum che uno Zach Latta.

More 1st level

ho potuto fare riferimento a loro sia a livello individuale, così come Oleksiy Dobrodum e come Zach Latta, ma che sarebbe rapidamente crescere ridondante e dimostrare di non essere flessibili. Invece, possiamo semplicemente raggruppare Oleksiy Dobrodum e Zach Latta e chiamarli Umani. Ora abbiamo raggiunto il livello di astrazione 2. Invece di trattare ciascuna persona individualmente, possiamo riferirci a loro come esseri umani. Facendo ciò, abbiamo sradicato la "implementazione", oi dettagli specifici di ogni persona e abbiamo iniziato a concentrarci sulle idee, quindi ora stiamo pensando in astratto.

More 2nd level

Naturalmente possiamo astratto ulteriormente questo aspetto, ma spero che si sta cominciando a ottenere l'idea alla base di astrazioni. La chiave da tenere presente è che un'astrazione nasconde i dettagli (o l'implementazione). Nascondendo i dettagli nella nostra astrazione Umana, ci permettiamo di parlare in generale. Parleremo brevemente di come questo si applichi nella programmazione nella prossima sezione.

Applicazione Astrazioni

Ora che abbiamo toccato brevemente su ciò che un astrazione è, cerchiamo di applicarlo. Il polimorfismo è possibile a causa delle astrazioni. Seguendo il modello dell'esempio precedente, dire che abbiamo le seguenti due classi:

class OleksiyDobrodum 
    name = "Oleksiy Dobrodum" 
    smarts = :mega-smart 
    mood = :happy 
    favorite_candy = :chocolate 
end 

class ZachLatta 
    name = "Zach Latta" 
    smarts = :so-so 
    mood = :indifferent 
    hair_color = :brown 
end 

se voglio interagire con un'istanza di ZachLatta devo fare riferimento ad esso specificamente. Lo stesso vale per le istanze OleksiyDobrodum.

zach = new ZachLatta 
print zach.name 

oleksiy = new OleksiyDobrodum 
print oleksiy.favorite_candy 

Se creo una classe astratta denominata Human e hanno entrambi OleksiyDobrodum e ZachLatta ereditare da essa, allora posso via astrarre l'implementazione di entrambe le classi e semplicemente fare riferimento a entrambe le istanze di loro come Human.

class Human 
    name 
    smarts 
    mood 
end 

class OleksiyDobrodum < Human 
    name = "Oleksiy Dobrodum" 
    smarts = :mega-smart 
    mood = :happy 
    favorite_candy = :chocolate 
end 

class ZachLatta < Human 
    name = "Zach Latta" 
    smarts = :so-so 
    mood = :indifferent 
    hair_color = :brown 
end 

nostro diagramma delle classi ora è simile al seguente:

Class diagram for code above

Potrei divagare a questo proposito implementazione per sempre, ma passiamo ai nostri punti salienti.

Punti chiave

  • astrazioni sono idee, non eventi specifici
  • a astratto qualcosa è quello di allontanarsi dalla sua attuazione e pensare a grandi idee
  • astrazioni possono essere utilizzati per organizzare il codice (e molti altre cose) efficace
  • programmazione orientata agli oggetti dipende interamente dalle astrazioni. vedere il punto elenco sopra.
+0

Puoi fare un esempio per favore? – Oleksiy

+1

@Zach Latta: Sono d'accordo e ho sviato la tua risposta, ma le astrazioni sono più che aiutanti mentali e modelli mentali. Organizzano il codice reale. – Frodo

+1

@Frodo * alcune * astrazioni possono aiutare a organizzare il codice. – juanchopanza

1

Sì è correlato alle classi astratte in C++ e non è limitato a quel contesto, ha spiegato in modo generico dicendo che C++ ha un pieno supporto di astrazione.

Ad esempio: In C++, possiamo usare i tipi di classe o chiamate di funzione in altri tipi, ad esempio una chiamata di funzione può avere un tipo di classe/funzione come parametro, sia la funzione e una classe riferisce un modulo astrazione- (qui l'astrazione si riferisce al nascondere la definizione di funzione o una classe dall'utente)

+0

In realtà è più ampio delle classi astratte. Ad esempio, quando si scrive in una programmazione generica (modelli), si affrontano le astrazioni: il tipo esatto del parametro è sconosciuto, ma si hanno delle aspettative. –

2

Nella programmazione generica, le astrazioni hanno un significato preciso e sono chiamate "concetti". Un concetto è defined as follows:

Un concetto è un insieme di requisiti costituito da espressioni valide, tipi associati, invarianti e garanzie di complessità.Si dice che un tipo che soddisfa i requisiti modella il concetto. Un concetto può estendere i requisiti di un altro concetto, che si chiama raffinatezza.

Espressioni
  • validi sono C++ espressioni che deve compilare con successo per gli oggetti coinvolti nell'espressione di essere considerati modelli del concetto.
  • Tipi associati sono tipi correlati al tipo di modello in cui partecipano a una o più espressioni valide. È possibile accedere ai tipi associati tipicamente tramite typedef nidificati all'interno di una definizione di classe per il tipo di modellazione o accessibili tramite una classe di caratteri.
  • Gli invarianti sono caratteristiche di runtime degli oggetti che devono sempre essere vere, ovvero le funzioni che coinvolgono gli oggetti devono conservare queste caratteristiche. Gli invarianti assumono spesso la forma di pre-condizioni e post-condizioni.
  • Complessità Garanzie sono i limiti massimi su quanto durerà l'esecuzione di una delle espressioni valide, o quante delle varie risorse verranno utilizzate dal calcolo. I concetti utilizzati nella libreria standard C++ sono documentati allo SGI STL site.

L'implementazione di un concetto in codice reale può essere eseguita in diversi modi. L'approccio OOP classico è quello di scrivere una classe base astratta fornendo le espressioni valide e i tipi associati. Le classi derivate dal calcestruzzo forniscono quindi gli invarianti e le garanzie di complessità. Per i modelli, le espressioni valide sono più implicite e controllate solo dopo l'istanziazione. concetti template attuazione sono una forma di duck typing: se sembra un'anatra, ciarlatani come un'anatra, ....

Il processo di sviluppo C++ 0x devoted a lot of effort per rendere i concetti direttamente esprimibili in codice, ma era not incorporated into the C++11 Standard. Tuttavia, è probabile che una versione Concepts Lite venga visualizzata nel successivo standard C++ 14.