Oggetti: che cosa insegna la programmazione alla filosofia

Cosa insegna l’informatica sugli oggetti alla filosofia: la programmazione orientata agli oggetti ed i metodi per creare gli oggetti.

In questo articolo vorrei fare qualcosa di nuovo:

scrivere un testo in cui spiego come una disciplina scientifica possa insegnare qualcosa ad un’altra, apparentemente molto diversa,

dando origine ad uno scambio di conoscenze, dalle quali la seconda disciplina impara qualcosa.

In questo caso si parla dell’informatica e della filosofia.

In questo articolo vorrei mostrare cosa insegna l’informatica sugli oggetti alla filosofia.

La filosofia, soprattutto continentale, oggi si interessa molto di oggetti, dunque tutto questo può risultare molto utile.

Per fare questo lavoro incominciamo dall'analisi degli oggetti in informatica, per poi arrivare a capire cosa di tutto ciò può essere utile alla filosofia.

Troviamo la nozione di oggetto all'interno della programmazione orientata agli oggetti.

La programmazione orientata agli oggetti ha cambiato molto il modo di programmare, perché si avvicina molto di più al modo di pensare di tutti i giorni, ossia tramite oggetti.

In programmazione orientata agli oggetti l’oggetto è prima di tutto un tipo di variabile che ha proprietà e metodi ed è in secondo luogo l’istanza di una classe.

Cosa insegna l’informatica sugli oggetti alla filosofia

Cosa insegna l’informatica sugli oggetti alla filosofia  1
Cosa insegna l’informatica sugli oggetti alla filosofia, foto 1

Vediamo ora due cose:

le proprietà e i metodi come parti dell’oggetto o elementi di cui l’oggetto si compone;

la classe come insieme di cui l’oggetto è istanza.

Per quanto riguarda la composizione dell’oggetto possiamo distinguere un id, delle proprietà e dei comportamenti (metodi). Se prendiamo una penna, ad esempio, vediamo che ha un colore, una lunghezza, un certo materiale (plastica, inchiostro, ecc.), che sono tutte proprietà. Inoltre la penna ha anche dei comportamenti, per esempio è in grado di scrivere.

Le proprietà nella programmazione sono delle variabili e ogni variabile ha un tipo, un nome e un valore che gli viene assegnato. I tipi vengono dalla teoria dei tipi di Bertrand Russell.

Bertrand Russell
Bertrand Russell

Potrebbe interessarti di più sulla Teoria dei tipi di Bertrand Russell: Java spiegato ai filosofi.

Questo è un esempio della filosofia che insegna all'informatica.

Se prendete un enunciato come “Socrate corre”, certamente quest’ultimo avrà come tipo l’essere un enunciato. Così una stringa in programmazione è di tipo stringa, un numero di tipo numero, ecc. Le stesse categorie di Aristotele funzionano come dei tipi.

Un individuo, ad esempio, potrebbe essere considerato di tipo Sostanza, un numero avrà come tipo la Quantità, un colore la Qualità, ecc. Ad esempio potremmo scrivere usando le categorie di Aristotele una variabile di questo tipo: Qualità colore = ‘rosso’.

Oltre al tipo, quando una variabile viene dichiarata ha anche un nome.

Il nome della variabile normalmente non è casuale, ma deve indicare la proprietà per quello che è. Per esempio quando parliamo della coda, del becco e altri caratteri di un animale, a prescindere dalla tipologia, ossia dal valore.

Il valore della variabile, dunque, va distinto dalla variabile stessa, come è diverso il dire che una cosa è colorata, dal dire che è nera, oppure dire che un certo animale è di una certa specie (es. (Java) String specie), dal dire che si tratta di un’anatra (es. (Java) String specie = ‘anatra’).

Riscontriamo dunque qui tre elementi importanti nelle proprietà dei nostri oggetti:

i tipi, i nomi delle variabili e il valore della variabile.

Ho detto che l’oggetto è un’istanza di una classe. Ora vi dico che il tipo spesso è una classe. In generale si distingue il tipo classe (es. Integer) dal tipo primitivo (es. int), la distinzione graficamente si dà semplicemente a partire dalla maiuscola. Per questo motivo se creo una classe modello Persona per creare oggetti, tutti quegli oggetti saranno di tipo Persona.

La classe funziona come l’insieme, in un certo senso. Dunque, dire che l’oggetto è un’istanza di una classe, significa che quell'oggetto è elemento di una certa classe.

Allo stesso modo in cui Socrate è un uomo, la volpe è un felino, ecc. L’enunciato “Socrate è un uomo” ci dice che Socrate è elemento di un insieme degli uomini, ma, dal punto di vista informatico, può riferirci un’altra cosa: che Uomo è il tipo della variabile/oggetto Socrate.

Ci sono molte tipologie di classe:

classe astratta, classe modello, classe eseguibile, classe formale e classe concreta.

Le classi sono in informatica in rapporto gerarchico. Per esempio la classe Oggetto è la classe suprema, rispetto alla quale tutte le altre sono sotto classi. Se ci pensate bene questo meccanismo è lo stesso che troviamo nella dialettica di Aristotele.

La dialettica di Aristotele è pensata su più livelli: genere, specie e individuo.

Il genere è l’animale, ad esempio, la specie l’uomo e Socrate l’individuo. Quello che è Oggetto (Object) nella programmazione orientata agli oggetti deve essere la Sostanza in Aristotele.

Aristotele stesso sosteneva che le categorie (quelli che prima paragonavo ai tipi) sono i generi sommi (le classi più alte). In ogni oggetto, quando l’oggetto viene creato, in linguaggi come Java, troviamo una classe formale e la classe concreta che non necessariamente coincidono, ma se non coincidono devono essere in relazione di ereditarietà. Per esempio potremmo costruire un oggetto Socrate inserendo come classe formale Animale (genere/classe padre) e come classe concreta Uomo (specie/classe figlio).

Uno dei problemi della programmazione è quello dell’oggetto-Dio o God Object. Questo oggetto è un oggetto complesso, talmente complesso, pieno di dipendenze. È un oggetto da evitare, ma ci pensate bene, una delle letture contemporanee della Sostanza di Spinoza è proprio quella del superoggetto.

La Sostanza di Spinoza è un oggetto-Dio, ossia un oggetto dagli infiniti attributi.

L’informatica ci mette in guardia rispetto a degli oggetti simili perché sono difficili da gestire. Il vero programmatore cerca sempre la via più semplice per arrivare agli obbiettivi prefissati, evitando la complessità.

Passiamo ora all'altro elemento essenziale dell’oggetto: il metodo.

Il metodo definisce semplicemente l’insieme dei comportamenti dell’oggetto. Nel caso degli oggetti reali questi sono tutte quelle cose che possiamo fare con l’oggetto. In filosofia si definiscono come “affetti” (vedi Spinoza).

Un metodo ha una firma che comprende il suo nome, dei parametri e può ritornare un valore. I primi metodi che si incontrano nella programmazione orientata agli oggetti sono i getter/setter e il costruttore.

Cosa insegna l’informatica sugli oggetti alla filosofia: la programmazione orientata agli oggetti e il metodo
Foto 3 per Cosa insegna l’informatica sugli oggetti alla filosofia: la programmazione orientata agli oggetti e il metodo

Potrebbe interessarti anche: Programmazione orientata all’oggetto e ontologia orientata all'oggetto.

I getter servono per prendere il valore di una proprietà di un oggetto specifico.

I setter servono per settare il valore di una proprietà di un oggetto, dunque cambiare il valore della proprietà.

Il costruttore, infine, serve per costruire l’oggetto.

Il costruttore non ritorna nessun valore. Di costruttori ne possiamo averne più di uno. Questo permette di avere dei costruttori in cui omettiamo certe proprietà dell’oggetto e possiamo costruire un oggetto senza quelle proprietà.

È interessante quest’ultimo punto perché in filosofia spesso si distingue tra proprietà che sono essenziali e altre che non lo sono. Per esempio non è essenziale ad una bottiglia di vetro che il vetro sia verde, ma una bottiglia con il fondo rotto non può contenere dei liquidi, dunque non sarebbe più una bottiglia. Dunque è logico pensare che nella creazione di un oggetto possano esistere delle proprietà che possono essere scartate.

Questo è un esempio di costruttore:

public Guerriero(String razza, int vita, int attacco, int difesa, int velocita, int agilita) {
super();
this.razza = razza;
this.vita = vita;
this.attacco = attacco;
this.difesa = difesa;
this.velocita = velocita;
this.agilita = agilita;
}

Vediamo che si tratta di un metodo con un nome che è identico a quello della classe, ma che non restituisce alcun tipo di valore. In questo metodo vediamo tra parentesi tonde dei parametri che vengono passati e che sono le proprietà dell’oggetto. Tutto il metodo serve per costruire un oggetto di tipo Guerriero. L’oggetto costruito avrà questa forma:

Guerriero ratto = new Guerriero("ratto", 300, 20, 30, 30, 50);

A sinistra vediamo per prima cosa la classe formale (Guerriero), poi il nome dell’oggetto/variabile (ratto). A destra troviamo la keyword “new”, la classe concreta (Guerriero), successivamente tutte le proprietà in ordine: specie, vita, attacco, difesa, velocità e agilità. In questo modo, grazie al costruttore, abbiamo costruito il nostro oggetto.

Dunque un oggetto è fatto di proprietà e metodi.

Il nostro oggetto è un ratto guerriero che appartiene alla specie dei ratti, ha vita 300, attacco 20, difesa 30, velocità 30, agilità 50. Inoltre il nostro ratto può avere dei metodi specifici. Per esempio potremmo pensare che il ratto possa mordere e con questo infettare il suo nemico. Questa è una capacità dell’oggetto ratto. Il potrebbe essere il seguente:

public int morsoInfetto(int atk, int vitanemico){

int morso = atk + 10;

vitanemico -= morso;

return morso;

}

Quello che abbiamo visto fino ad ora è il metodo più semplice nella programmazione orientata agli oggetti per creare degli oggetti. Ci sono altri metodi per creare gli oggetti che sono più complessi.

Cosa insegna l’informatica sugli oggetti alla filosofia: i metodi per creare gli oggetti.

Cosa insegna l’informatica sugli oggetti alla filosofia: metodi per creare gli oggetti
Cosa insegna l’informatica sugli oggetti alla filosofia: metodi per creare gli oggetti

Potrebbe interessarti anche: Adrian Fartade: un laureato in filosofia che spiega la l’astrofisica su Youtube.

Ne ho individuati in Java almeno tre: la costruzione dell’oggetto per ereditarietà, la costruzione dell’oggetto per composizione, la costruzione dell’oggetto per clonazione.

Il primo metodo è quello dell’ereditarietà.

L’ereditarietà indica un certo rapporto tra le classi, che si configura in questo modo:

una classe figlio eredita dalla classe padre proprietà e metodi, di modo che la classe figlio non è solo composta dai suoi metodi e dalle sue proprietà, ma anche da quelle della classe padre.

Troviamo un’analogia con il caso di Aristotele nel rapporto tra generi e specie. Per esempio un tucano deve avere tutte le caratteristiche generali degli uccelli, altrimenti non sarebbe un uccello. Dunque “Uccello” potrebbe essere la classe padre e “Tucano” la classe figlio, per il resto potete da voi trarre le conclusioni.

Questo modo di costruire gli oggetti ricorda molto la teoria delle essenze in filosofia.

L’essenza è concepita come una lista di proprietà.

La teoria si è evoluta con la scienza. Se prendiamo il caso della biologia e degli animali, all'inizio vediamo un tentativo di rintracciare l’essenza nella struttura esterna (es. in un uccello andiamo a vedere la forma del becco, il colore del piumaggio, le zampe, ecc.), successivamente lo studio si evolve andando a fare anatomia e analizzando i vari organi (come è fatto il cervello e il sistema nervoso, come funziona la respirazione, la digestione, ecc.), infine si passa allo studio del DNA e i suoi geni.

La teoria delle essenze esiste ancora oggi e segue grosso modo il modello dell’ereditarietà delle classi. Si tratta semplicemente di aggiungere liste di proprietà su altre liste di proprietà, creando una gerarchia per cui le proprietà della classe padre verranno sempre prima di quelle della classe figlio.

Un esempio:

Prodotto p = new Computer(“elettronica”, 20, true, “i7”, “DDR4”, 8, “SSD”);

Usando il polimorfismo possiamo dare a questo oggetto la classe formale “Prodotto”, che è la classe padre, ma come classe concreta la classe concreta “Computer”, che è la classe figlio. Le prime proprietà ho immaginano venissero dalla classe padre: tipo-prodotto “elettronica”, quantita 20, scontato true.

Come ho già spiegato, quello dell’ereditarietà è solo un modo di costruire un oggetto.

Un secondo modo è la composizione.

Secondo la composizione l’oggetto è composto di altri oggetti che a loro volta o hanno altri oggetti per proprietà o hanno proprietà semplici. In questo caso, nella costruzione dell’oggetto, l’oggetto ha un altro oggetto come proprietà.

Questa teoria ricorda meglio la teoria dell’assemblaggio di Manuel De Landa: l’alternativa all'essenzialismo. In questo caso abbiamo un oggetto che è definito da parti che sono in relazioni tra di loro. Nell'assemblaggio ogni parte ha delle capacità che mette in atto in relazione con le altre parti dando origine ad un oggetto che è molto di più della mera somma delle parti. Nel caso della composizione ci troviamo di fronte ad un oggetto di questo tipo:

Computer c = new Computer(new Processore(‘i5’), new Ram(‘DDR4’, 8), new Memoria(‘SSD’, 1000));

In questo oggetto vediamo che il processore, la ram e la memoria sono certamente delle proprietà, ma sono anche e sopratutto degli oggetti che hanno altre proprietà. La cosa è possibile proprio perché un oggetto è comunque una variabile. Questo diverso tipo di costruire l’oggetto comunque sembra rimanere vincolato all'idea dell’oggetto come definito da una lista di proprietà, ma sicuramente cambia completamente il paradigma perché elimina ogni forma di gerarchia tra classi.

Questo ovviamente elimina anche il polimorfismo e gli oggetti di cui il primo oggetto si compone non ereditano alcuna proprietà. Inoltre questi oggetti rimangono del tutto indipendenti. Nel senso che nulla mia vieta, ad esempio, di costruire degli oggetti “Processore”, indipendentemente dalla creazione di un altro oggetto “Computer”.

Il terzo modo di creare gli oggetti consiste nella clonazione.

La clonazione presuppone l’idea che esista un prototipo, dunque un oggetto originario, rispetto al quale tutti gli altri oggetti sono degli oggetti clonati. In questo modo, cambiando il nome degli oggetti, possiamo creare una serie di oggetti uguali, sfruttando un interfaccia.

Programmazione e filosofia, metodi per creare gli oggetti: la clonazione
Programmazione e filosofia, metodi per creare gli oggetti: la clonazione

Un esempio di clonazione: cloniamo dei gatti.

Questa potrebbe essere la nostra classe modello per creare dei Gatti:

public class Gatto implements Cloneable{


private String tipo;

private String colore;

private boolean randagio;

public Gatto(String tipo, String colore, boolean randagio) {
super();
this.tipo = tipo;
this.colore = colore;
this.randagio = randagio;
}

public String getTipo() {
return tipo;
}

public void setTipo(String tipo) {
this.tipo = tipo;
}

public String getColore() {
return colore;
}

public void setColore(String colore) {
this.colore = colore;
}

public boolean isRandagio() {
return randagio;
}

public void setRandagio(boolean randagio) {
this.randagio = randagio;
}

@Override
public String toString() {
return "Gatto [tipo=" + tipo + ", colore=" + colore + ", randagio=" + randagio + "]";
}

public Object clone() throws CloneNotSupportedException{

return super.clone();
}

}

Questa è, invece, la classe eseguibile in cui cloniamo i nostri gatti partendo dal prototipo di riferimento:

public class Cloning {

public static void main(String[] args) {

try {

Gatto g1 = new Gatto("norvegese", "nero", false);

Gatto g2 = (Gatto)g1.clone();

Gatto g3 = (Gatto)g1.clone();

Gatto g4 = (Gatto)g1.clone();

Gatto g5 = (Gatto)g1.clone();

Gatto g6 = (Gatto)g1.clone();

System.out.println(

g1 + "\n" +
g2 + "\n" +
g3 + "\n" +
g4 + "\n" +
g5 + "\n" +
g6 + "\n"

);

} catch(Exception e) {

e.printStackTrace();
}

g1 è il gatto originario che viene clonato almeno altre 5 volte.

Pensare l’oggetto come un clone di un altro oggetto, che è un prototipo. Potrebbe ricordare il discorso di Platone sulle idee e le copie, ma non vedo un collegamento così forte, visto che l’idea non è un oggetto.

Cosa insegna l’informatica sugli oggetti alla filosofia: la clonazione

Cosa insegna l’informatica sugli oggetti alla filosofia: la clonazione
Cosa insegna l’informatica sugli oggetti alla filosofia: la clonazione

Potrebbe interessarti anche: Introduzione all'intelligenza artificiale (AI).

Sicuramente pone il vecchio problema sull'esistenza di oggetti uguali. La filosofia ha spesso negato l’esistenza di oggetti uguali, perché almeno nelle proprietà relazionali, per esempio quelle spaziali, gli oggetti necessariamente differiscono.

Tuttavia la clonazione, lo sappiamo da tempo, è possibile. È anche possibile assegnare ad un oggetto in programmazione delle proprietà di posizione e clonare quell'oggetto, facendo si che gli altri abbiano le stesse proprietà di relazione. Sembra che l’unica cosa che cambi è semplicemente il nome dell’oggetto.

Cosa insegna la programmazione alla filosofia: clonazione con nomi diversi.
Cosa insegna la programmazione alla filosofia: clonazione con nomi diversi.

Due oggetti con lo stesso nome non possono esistere, come non può accadere la stessa cosa con due file del computer nella stessa cartella. Solo allora il computer si rende conto che sono identici, che due cose identiche sono la stessa cosa, quindi non possono essere due e perciò ci si chiede se vogliamo fare la sostituzione.

Quello descritto è il modo di concepire l’oggetto dell’informatica ed è anche il modo in cui l’oggetto viene costruito. Si tratta di un tentativo di offrire alla filosofia stessa altri strumenti e mezzi per pensare gli oggetti.

Per proseguire l’esperimento si dovrebbe vedere che cosa accade se applicassimo questi concetti all'ontologia. Per il momento questo potrebbe essere il primo lavoro sul tema: cosa può insegnare l’informatica alla filosofia.

Foto da Pixabay.