martedì 30 dicembre 2014

Usare la pogrammazione orientata agli oggetti

Mi è stato chiesto se Livecode è un linguaggio di programmazione orientato agli oggetti, la risposta è si.
Credo che possa essere visto come il linguaggio più orientato agli oggetti che esista al mondo. Non è possibile scrivere del codice se non si crea un oggetto dove metterlo dentro.
La programmazione orientata ad oggetti è una moda molto in voga ultimamente, ma chi ne parla raramente sa quanto renda molto più complicata la programmazione nella maggior parte dei linguaggi di programmazione.
Oggi andremo con ordine e vedremo cosa è la programmazione ad oggetti e come implementarla in maniera rigorosa in Livecode. Premetto che l'utente medio, grazie a Livecode, programma ad oggetti in maniera veloce senza accorgersene.
La programmazione ad oggetti richiede una classe cioè un modello da cui derivare delle copie da personalizzare. Le copie sono chiamate oggetti.
Come esempio creiamo un pulsante, il pulsante sarà la nostra classe. Tutte le copie del pulsante saranno gli oggetti.

Torniamo al nostro pulsante, la programmazione ad oggetti impone che dobbiamo fornire degli attributi e dei metodi. Gli attributi sono delle variabili che contengo valori, e in livecode basta aggiungere del proprietà personalizzate al pulsante (custom properties). Aggiungiamo tre attributi: attributo1, attributo2 e controllo;  a quest'ultimo diamo il valore false.

I metodi sono le funzioni per interagire con i dati della classe. Essi li possiamo avere con SetProp, GetProp, e i classici messaggi degli oggetti. La programmazione ad oggetti impone che i dati non siano visibili e modificabili direttamente, ma che bisogna passare attraverso i metodi; questa regola è detta incapsulamento.
Facciamo che il nostro oggetto sia un totalizzatore. Creiamo un metodo che metta nell'attributo1  il numero di volte che è stato usato l'oggetto, mentre nell'attributo2 sommi ogni volta un numero a quelli precedenti. La proprietà controllo ci servirà ad evitare di poter modificare gli attributi direttamente. Ecco il codice del pulsante:

setprop attributo1 nuovoValore
   if the controllo of me then
      set the attributo1 of me to nuovoValore
   else
      answer "Per la legge dell'incapsulamento, non puoi impostare il valore direttamente"
   end if
end attributo1

setprop attributo2 nuovoValore
   if the controllo of me then
      set the attributo2 of me to nuovoValore
   else
      answer "Per la legge dell'incapsulamento, non puoi impostare il valore direttamente"
   end if
end attributo2


getprop attributo1
   if the controllo of me then
      return (the attributo1 of me)
   else
      answer "Per la legge dell'incapsulamento, non puoi leggere il valore direttamente"
   end if
end attributo1

getprop attributo2
   if the controllo of me then
      return (the attributo2 of me)
   else
      answer "Per la legge dell'incapsulamento, non puoi leggere il valore direttamente"
   end if
end attributo2


on somma numero
   set the controllo of me to true
   put the attributo1 of me into cont
   add 1 to cont
   set the attributo1 of me to cont
   put the attributo2 of me into totale
   put totale + numero into totale
   set the attributo2 of me to totale
   set the controllo of me to false
   answer "Hai usato questo messaggio " & cont & " volte. Il totale dei numeri che hai fornito fin'ora è " & totale
end somma

Quindi lanciando somma 3 otteniamo:
Un'altra proprietà della programmazione ad oggetti è l'ereditarietà, cioè gli oggetti copiato portano dietro tutti i dati e le funzioni dell'oggetto padre e in più si possono aggiungere altre funzioni, metodi e attributi. Tutte queste cose in Livecode avvengono con un semplice copia e incolla.
Come vedete, volendo Livecode supporta tutte le proprietà dei linguaggi ad ad oggetti. Liveocde è un linguaggio di altissimo livello, chiamato anche il sacro Graal della programmazione, quindi forzarsi ad usare la programmazione ad oggetti è solo un passo indietro invece che uno in avanti.
La letteratura in informatica è piena di esempi che mostrano come la programmazione a oggetti porti più svantaggi che vantaggi, ed è di qualche utilità solo per linguaggi di basso livello.
Se comunque siete dei patiti della programmazione ad oggetti, esiste una libreria specifica per usare tutta una serie di comandi come se stesse programmando ad oggetti in C: http://www.exformedia.se/downloads/oopengine/