Autore Topic: Logica degli oggetti  (Letto 4189 volte)

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Logica degli oggetti
« il: 09 Luglio 2008, 18:25:27 »
Ciao a tutti

Io provengo dalla programmazione basata sui cicli, e sono già parecchio lontano dalla logica della programmazione basata sugli eventi.
Un altra grossa differenza tra quello che faccio io quotidianamente (programmare in RPG) e Gambas, è l'utilizzo degli oggetti, delle classi e di tutto quello che gira intorno a un linguaggio Object Oriented.

So che faccio una domanda difficile, e non mi aspetto una risposta completa, ma qualche indicazione sì :-)
La domanda potrebbe essere "A cosa servono gli oggetti?", ma sarebbe troppo generica. Forse è meglio "Si può programmare in Gambas, e in altri linguaggi OO, senza usare gli oggetti e le classi?"
E ancora: "A cosa possono servire in un caso pratico le classi?"
E ultima: "Esiste un 'modo' migliore per usare le classi?"

Grazie a tutti, e fate i bravi :-)
Saluti a tutti

Mario

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Logica degli oggetti
« Risposta #1 il: 10 Luglio 2008, 00:10:11 »
Anch'io provengo dalla vecchia scuola  :-D
Io ho iniziato a programmare col BASIC integrato nel Commodore 16, poi col GW-BASIC dei PC, e lì era un tripudio di GOTO e altre orrendità  :-)
Poi a scuola mi insegnarono il Pascal, e dovetti "convertirmi" ai cicli condizionali (if-then-else, do-loop, while-wend ecc...).
Mi ricordo che in quei tempi arrivò il Turbo Pascal 5.5 (io usavo il 3.0) che introduceva la programmazione OO, Object-Oriented  :-o

E da lì sono tutti oggetti!

A parte gli scherzi, un oggetto altro non è che una classe che contiene sia gli attributi (i dati) che i metodi (le procedure) che operano su di essi.

Immagina, ad esempio, di voler scrivere un giochino che simuli una pista per automobiline.
Scrivi un oggetto "automobilina" e poi da quell'oggetto istanzi (cioè derivi) tanti oggetti figli, ognuno con le caratteristiche basi dell'oggetto genitore.
Poniamo quindi che la tua "automobilina" abbia questi attributi:
- numero
- pilota
- colore
- carburante
- potenza
- velmax
E poi codifichi questi metodi:
- crea: per istanziare un nuovo oggetto derivato da questo
- rifornimento: per rifornire la tua macchinina

Al gioco partecipi tu ed un tuo amico. Tu ti chiami XXX ed il tuo amico YYY.
Allora basta invocare la funzione Crea (che ovviamente avrai codificato in "automobilina") con:
automobilinaXXX = automobilina.Crea

Adesso automobilinaXXX ha tutte le proprietà che erano di automobilina.
Quindi scrivi:
automobilinaXXX.numero = 12
automobilinaXXX.pilota = "XXX"
automobilinaXXX.colore = "rosso"
automobilinaXXX.carburante = 100
automobilinaXXX.potenza = 500
automobilinaXXX.velmax = 200

E così fai anche con automobilinaYYY, l'automobilina del tuo amico.

Siamo a metà gara, la tua automobilina ha bisogno di rifornimento: hai solo 20 litri di benzina.
Dai automobilinaXXX.rifornimento(60) per "versare" nel serbatoio 60 litri di carburante.
Se adesso dai:
Print(automobilinaXXX.carburante)
ottieni 80.

Per gli usi... beh, dipende dal tipo di programma che stai scrivendo. Non sempre devi o puoi usare gli oggetti, anche se questi possono tornarti comodi per tante cose.
Se ad esempio devi scrivere un programma di crittografia, potresti usare un oggetto AES con i metodi Decifra e Cifra. Così per cifrare i tuoi messaggi dovresti semplicemente dare AES.Cifra(Testo, Password).
Questo è solo un esempio.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline comisat

  • Gamberetto
  • *
  • Post: 10
    • Mostra profilo
    • http://www.rfc.altervista.org
Re: Logica degli oggetti
« Risposta #2 il: 10 Luglio 2008, 00:42:32 »
Giusto per fare chiarezza a chi legge: la programmazione a cicli non esiste come paradigma; l'RPG (di un tempo) rientrava nella programmazione sequenziale in cui il flusso (input->calcolo->output) era gestito da un ciclo logico infinito, mentre oggi la sua evoluzione l'ha portato ad essere un linguaggio procedurale.
(correggimi tu se dico castronate che di RPG ne sai sicuramente _molto_ piu' di me:).
Ma veniamo al topic, per quanto di (poca) competenza posso risponderti, cercando di essere il piu' chiaro possibile.

"A cosa servono gli oggetti?" "A cosa possono servire in un caso pratico le classi?"

Cerco di risponderti al "domandone filosofico" :) illustrandoti i concetti fondamentali dell'OOP e le differenze di fondo con la programmazione procedurale/modulare.
Come sicuramente sai, elementi indispensabili della programmazione sono le strutture dati e le funzioni; l'insieme di questi costituisce una classe, ovvero un "modello/template" (giusto per fare un riferimento molto azzardato, pensa ai tipi di dati definiti dal programmatore nei linguaggi procedurali) dotato dunque di proprieta' "proprie" (strutture) e procedure (metodi). La classe rappresenta dunque un elemento "astratto", che si concretizza in oggetto qualora sia istanziato (detta in soldoni, una classe non occupa memoria, un oggetto si)
Fin qui puo' sembrare solo una questione di organizzazione di codice (una sorta "creazione di modelli") ma, per quanto detto, puoi capire come la classe e' un "contenitore" di dati che detiene anche le regole (metodi) per potere gestire tali dati, e come dunque la modifica di un singolo modello possa generare modifiche globali in modo ordinato, logico e senza workaround particolari a tutti gli oggetti di tale classe nell'intero progetto. Tale caratteristica in OOP viene detta incapsulamento (proprio per il fatto dell'avere dati e metodi per gestirli all'interno dell'oggetto stesso). Sempre per riferimento, pensa invece alla gestione procedure<->dati nella programmazione procedurale/modulare e come la divisione tra questi elementi sia un dramma in fase di mantenimento del software... E sempre in questo contesto, tieni presente un'altra grande differenza/pregio dell'OOP rispetto alla programmazione procedurale/modulare: i dati di un oggetto vengono gestiti/modificati esclusivamente dall'oggetto stesso, poiche' un secondo oggetto vi accede solo ed esclusivamente attraverso i metodi del primo, e non direttamente...
La seconda caratteristica degli oggetti e' l'ereditarieta', ovvero la possibilita' di derivare una sottoclasse da una classe, e non e' cosa da poco. Esempio astratto: definisci la classe "frutta" e quindi ne scrivi il modello con tutte le sue proprieta' e le sue regole; se ora devi definire la classe "mela" non parti da zero, ma erediti tutte le proprieta' della classe "frutta" ed agisci esclusivamente sulle proprie esclusive della classe "mela". Capisci anche qui che se, a stadio avanzato del progetto, devi fare una modifica alla "frutta" non devi necessariamente andare a mettere mano alle eventuali "mele" "pere" "fichi" che hai nel progetto. Una delle possibilita' (ovvero la terza caratteristica fondamentale dell'OOP) di agire "solo sulle proprieta' della mela" e' quella di modificare i metodi ereditati per farli propri a seconda dell'esigenze della sottoclasse; questa caratteristica si chiama polimorfismo.

"Si può programmare in Gambas, e in altri linguaggi OO, senza usare gli oggetti e le classi?"

Sarebbe come avere la bici elettrica ed usarla a pedali :)
Comunque si, si puo' fare. Basta scrivere in procedurale/modulare.

"Esiste un 'modo' migliore per usare le classi?"

No, dal momento che le classi sono delle entita' astratte, dei modelli.


Spero di essere stato il piu' chiaro possibile e di aver scritto il minor numero di castronerie possibile :D

ciao

Offline comisat

  • Gamberetto
  • *
  • Post: 10
    • Mostra profilo
    • http://www.rfc.altervista.org
Re: Logica degli oggetti
« Risposta #3 il: 10 Luglio 2008, 00:44:19 »
Ehm, non ho visto, sono arrivato dopo Leo (che e' stato molto piu' esemplificativo di me:).
Scusate  :-)

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Logica degli oggetti
« Risposta #4 il: 10 Luglio 2008, 08:44:26 »
Ragazzi, con le vostre due risposte mi avete chiarito parecchie cosette, vi ringrazio :-)

Prima la risposta a Comisat: sì, il linguaggio RPG ha una logica a ciclo, ma è "forzata", nel senso che è possibile utilizzare file definendoli primari, e questi vengono letti dal primo all'ultimo record senza fare nient'altro che eseguire il programma. RPG significa Report Program Generator (Generatore di programmi di reporting) e nelle sue versioni più antiche era letteralmente un "leggi-e-scrivi" semi automatico, con poche funzioni di calcolo.
Oggi con l'RPG ILE questo paradigma è stato ampiamente superato: i file primari si usano pochissimo e solo in casi particolari più per semplificare che per altro. Si possono usare strutturazioni come il Select/When, il Do While e il Do Until, oppure il Monitor per controllare gli errori. C'è il supporto per i puntatori sia di dati che di procedura e questo permette di usare direttamente le API di sistema, che prima erano precluse :-)

Scusate la divagazione...

Cosa fossero gli oggetti mi era relativamente chiaro (ma un ripasso mi ha fatto comunque bene, Leo72) e questa semplice frase di Comisat
Citazione

si concretizza in oggetto qualora sia istanziato (detta in soldoni, una classe non occupa memoria, un oggetto si)

mi ha fatto capire finalmente il concetto di "istanziare" un oggetto, cosa che mi era un tantinello ostica :-)

Provo a fare un esempio concreto, che sia più nelle mie corde:
creo una classe Fattura che ha una serie di attributi (numero, data di emissione, data di scadenza, importo, iva, codice cliente) e alcuni metodi (crea, modifica, cancella)
All'inizio il codice interno dell'evento "cancella" si limita a eliminare dal file fatture il record con la fattura che mi interessa.
Poi decido di implementare una procedura che mi gestisca un archivio Rate, con altri attributi e altri eventi.
Naturalmente se cancello una fattura devo anche cancellare le sue rate, per cui intervengo nel metodo della fattura per cancellare anche il file Rate.

Ho fatto un esempio calzante?
Saluti a tutti

Mario

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Logica degli oggetti
« Risposta #5 il: 14 Luglio 2008, 23:58:03 »
Mi pare che sia più un esempio legato ad una gestione di un DB, il tuo  :-D
Secondo il tuo schema, si presuppone che il computer stia sempre acceso per cui in qualunque momento io possa accedere ad una fattura chiamandola ad esempio fatt123.stampa.
Ma se spengi il PC? Al riavvio, devi ricaricare tutto da un DB... ecco, un oggetto è una cosa che sopravvive finché il programma gira (non è detto che possa essere riversato su un file, però).

Analizziamo (se non ti bastasse l'esempio delle macchinine) l'esempio degli algoritmi di crittazione ed approfondiamolo....

Gli algoritmi di crittazione son complessi algoritmi con operazioni eseguite per diverse volte (cicli) su blocchi fissi di dati o flussi di dati di lunghezza arbitraria.
Hanno spesso la necessità di un "set-up", vale a dire devono essere inizializzati. L'inizializzazione è la preparazione dei valori iniziali e questa operazione si fa in genere 1 volta per ogni password, passando un VI (un vettore di inizializzazione).

Se usi gli oggetti, non devi ogni volta richiamare tutto l'algoritmo tramite procedure interne ad un form ma puoi impostare un oggetto che svolga il compito per te.

Esempio: potresti creare un oggetto Salsa (un algoritmo di cifratura di tipo streaming) con attributi Password, Testo e Lun_Chiave e metodi Inizializza, Cifra e Decifra.
Da quest'oggetto potresti istanziare, cioè derivare, 2 classi distinte, Salsa128 ed Salsa256: esse differiranno l'una dall'altra per la proprietà Lun_Chiave, rispettivamente a 128 e 256 bit.
Codice: [Seleziona]

DIM cSalsa128 As New Salsa
DIM cSalsa256 As New Salsa

Siccome queste sono istanze, cioè derivazioni, dell'oggetto Salsa, ereditano i suoi metodi ed i suoi attributi. Perciò puoi adesso impostare la lunghezza della chiave per le 2 classi così:
[/code]
cSalsa128.Lun_Chiave = 128
cSalsa256.Lun_Chiave = 256
[/code]
perché entrambe le classi "sanno" che posseggono un attributo denominato Lun_Chiave dato che lo hanno ereditato dall'oggetto Salsa che lo possedeva (come lo possedeva? Beh, lo avevi scritto tu nel suo codice :-)).

Adesso, se vuoi cifrare un documento con il Salsa a 128 non devi far altro che invocarlo così:
Codice: [Seleziona]

cSalsa128.Inizializza(VI)
cSalsa128.Testo = strTesto
cSalsa128.Password = strPassword
TestoCifrato = cSalsa128.Cifra

Se devi cifrare altro testo, basta richiamare questo codice:
Codice: [Seleziona]

cSalsa128.Testo = strTesto2
TestoCifrato2 = cSalsa128.Cifra

Come vedi non hai dovuto né reinizializzare l'algoritmo né reimpostare la chiave o la lunghezza di essa: questo perché la classe cSalsa128 derivata dall'oggetto Salsa conserva, finché non viene distrutta, le informazioni che gli hai passato. E non devi neanche richiamare sub-routine per eseguire il codice: basta invocare i metodi della classe affinché essa esegua le operazioni in proprio.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Logica degli oggetti
« Risposta #6 il: 15 Luglio 2008, 08:54:44 »
Uhm, se non ho capito male, sono due esempi (il mio e il tuo) estremamente diversi :-)
Il concetto di fattura può essere fine a sé stesso, e chiudersi all'interno della gestione delle stesse fatture (a meno che un altro programma non abbia bisogno di accedere alle fatture,ma questo è un altro discorso).
L'algoritmo di decrittazione è evidentemente qualcosa che deve essere utilizzato più spesso, e all'interno di programmi diversi.
Nell'AS/400 esiste il concetto di "programma di servizio", che però è più vicino a una API costruita dall'utente, che svolge funzioni e che può essere richiamata da diversi programmi (viene incorporata, quindi il tempo di chiamata è vicino allo zero :-) )

Comunque mi sa che per ora continuerò a utilizzare la tecnica "normale" :-)

Grazie Leo per la spiegazione
Saluti a tutti

Mario

Offline Will32

  • Maestro Gambero
  • ****
  • Post: 273
  • Evviva Linux e la Programmazione
    • Mostra profilo
    • TuttoComputer
Re: Logica degli oggetti
« Risposta #7 il: 31 Gennaio 2010, 08:25:47 »
Carino quello dell'automobilina !!  ;D
Devo provare a farla ...... ECCO UN' IDEA !!!
Ciao

Visita le comunità di Gambas, programma e diventa nostro amico :2birre:

Offline Will32

  • Maestro Gambero
  • ****
  • Post: 273
  • Evviva Linux e la Programmazione
    • Mostra profilo
    • TuttoComputer
Re: Logica degli oggetti
« Risposta #8 il: 12 Febbraio 2010, 10:21:34 »
Sei un genio Leo !  ;D
Grazie per l'idea

Visita le comunità di Gambas, programma e diventa nostro amico :2birre:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Logica degli oggetti
« Risposta #9 il: 12 Febbraio 2010, 18:37:46 »
Che fossi un genio lo so da 500 anni circa... la gente pensa che sia morto ma io glielo lascio credere :-)

Tornando a noi, io immagino (e visto che sono un genio sicuramente ci ho preso) che tu stia convertendo in pratica tutte le idee che raccatti in giro per il forum... di' la verità! :-)

Ad esempio, con.... l'esempio delle macchinine che ci hai fatto?
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Logica degli oggetti
« Risposta #10 il: 13 Febbraio 2010, 00:33:12 »
Ad esempio, con.... l'esempio delle macchinine che ci hai fatto?

Ci ha aperto una concessionaria.... :P

Offline Will32

  • Maestro Gambero
  • ****
  • Post: 273
  • Evviva Linux e la Programmazione
    • Mostra profilo
    • TuttoComputer
Re: Logica degli oggetti
« Risposta #11 il: 14 Febbraio 2010, 11:11:57 »
Citazione
Ci ha aperto una concessionaria....   :P

Non sarebbe neanche male.  ;D

Comunque, volevo provare a fare un giochino in c / c ++  ma non ci sono riuscito !
« Ultima modifica: 14 Febbraio 2010, 14:28:14 da Will32 »

Visita le comunità di Gambas, programma e diventa nostro amico :2birre: