Newsgroup: it.comp.lang.c++
Titolo: c++

Che cos'è un linguaggio object-oriented?

Che cos'è un linguaggio object-oriented?
Piu` che altro, al giorno d'oggi, un termine di "marketing"
con i quali i patiti di un linguaggio X attaccano il linguaggio
rivale Y, sostenendo che, X si` che e` object-oriented,
altro che Y, che invece non lo e`...!
In questo senso e` l'esatto sinonimo dei termini
"strutturato", "ad alto livello", "di terza generazione",
e "algoritmico", di altre ere dell'informatica, sempre
relativi ai linguaggi; e, per altri settori circonvicini,
dei termini "open" ("aperto"), "RISC", "event driven",
"relazionale", "ergonomico", "modulare", "democratico".
Tutti questi termini hanno in comune il fatto che, al di
la` del loro eventuale significato originale, il loro uso
concreto di riduce normalmente a "quattro gambe
buono due gambe cattivo" (Orwell, "Animal Farm").
A parte l'uso prevalente, cioe` polemico, "object
oriented" ricopre un insieme di concetti, che risale
in prevalenza al linguaggio Simula degli anni '60,
basati su di un paradigma di incapsulamento dei
dati in strutture ("oggetti") che comprendono anche
il codice eseguibile che accede direttamente a quei
dati; alcuni dei meccanismi utili per conseguire
questo incapsulamento (nessun linguaggio li
supporta tutti) comprendono vari approcci al
polimorfismo (interfacce, eredita`, prototipi,
classi, signature, metaclassi, eccetera), che e`
un modo particolare di impostare i rapporti fra
testo statico del programma e sua esecuzione
dinamica; e vari approcci alla gestione dei nomi
(overload, genericita`, template, parametrizzazione,
spazi dei nomi, metatipi, eccetera), che sono
invece schemi di impostazione relativi in tutto
e per tutto alle strutture statiche del programma,
ma possono spesso produrre effetti simili.
Vi sono poi molte altre distinzioni fra i linguaggi,
come il loro differente grado di "dinamismo", o
la diversa misura in cui _obbligano_ l'utente ad
usare i meccanismi del polimorfismo (ecc) o
invece offrono questi meccanismi "accanto" ad
altri alternativi (linguaggi mono-paradigma, e
altri pluri-paradigma); queste querelles, e altre
ancora, non dovrebbero inficiare il discorso
strettamente relativo all'object-oriented, anche
se in pratica, spesso, vi ci si infilano, visto
soprattutto il fatto gia` notato ai primi paragrafi.
Alex

...


E' un linguaggio che supporta i seguenti concetti (scritti in modo piu' o
meno rigoroso):
ENCAPSULATION (incapsulamento)
Incapsulare dati e codice in un oggetto di piu' facile manipolazione. Il
linguaggio ti permette di creare classi con attributi e metodi che lavorano
sugli attributi. Ad esempio creo una classe Finestra che contiene gli
attributi posizione, dimensioni, colore, etc e i metodi di apertura,
chiusura, spostamento, scrittura, etc.
DATA HIDING (nascondere i dati)
Permette di nascondere all'utilizzare di una classe l'implementazione della
stessa. Il linguaggio di permette di nascondere alcuni attributi della
classe a chi la usa perche' utili solo all'interno dell'implementazione dei
metodi della classe o perche' dipendenti dalla piattaforma o altro. Ad
esempio nella classe Finestra nascondo gli attributi sullo stato della
finestra, sull'handle utilizzato, etc.
INHERITANCE (ereditarieta')
Permette di creare classi partendo da classi già esistenti cambiandone
leggermente il comportamento o aggiungendo nuove caratteristiche. Il
linguaggio ti permette di definire una nuova classe facendo riferimento ad
una classe gia' esistente e ti permette di cambiare metodi della classe
base, aggiungere attributi e metodi nuovi. La cosa importante e' che
funzioni accettano oggetti della classe base accettano anche oggetti di
classi derivate.
Ad esempio creo una classe FinestraSenzaBordo che deriva da Finestra e che
cambia il metodo di visualizzazione.
POLYMORPHISM (polimorfismo)
Permette di applicare la stessa funzione a dati di tipo diverso. Il
linguaggio ti permette di definire una stessa funzione con parametri di tipo
diverso a cui si associa una implementazione diversa. Ad esempio
print(stringa) o print(intero) hanno due implementazioni distinte pur avendo
lo stesso nome. Utile nella definizione degli operatori per classi nuove (ad
es. a == b dove a e b sono numeri complessi).
--
Antonio Donatiello

