Autore Topic: Una domanda sugli oggetti  (Letto 3917 volte)

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Una domanda sugli oggetti
« il: 23 Agosto 2008, 18:20:53 »
Ehilà! Ben tornati dalle vacanze!!

Mentre me ne stavo con le pal... ehm, con i piedi a mollo nel Golfo dell'Asinara, riflettevo e facevo delle prove sul mio fido portatile per vedere se riesco a capire meglio l'uso degli oggetti.
Mi sono venuti diversi dubbi, ma uno in particolare mi ha dato da pensare parecchio e non sono riuscito a darmi una risposta.

Sto realizzando un progettino per la gestione della fatturazione (sono libero professionista) che mi permetta anche di capire come funziona il nostro Gambas.
Non conoscendo la programmazione OO l'ho fatto in maniera, diciamo così, tradizionale. Poi ho deciso di fare un nuovo progetto dove invece vorrei utilizzare le funzioni degli oggetti.
Uno di questi oggetti potrebbe essere, per esempio, la classe dei Clienti, che possiamo chiamare clsCliente.
Ho visto che quando si creano nuove proprietà (che direi che possiamo assimilare ai campi di un record), si creano automaticamente delle funzioni GET e SET, che servono per leggere o modificare ogni proprietà.
Molto bello, ma mi ha fatto venire questo dubbio: io ho i dati del mio cliente su un record che si trova in un file (oppure i dati verranno prima o poi scritti su tale record), in che modo devo leggerli da tale file?
Mi spiego meglio, perché detta così non si capisce: quando scrivo il codice per la funzione GET del campo RagioneSociale, tanto per dire, devo fare in modo che mi venga recuperato il record e mi venga letto il campo? E la stessa cosa devo fare con il SET?
Perché mi dà l'impressione che in questo modo la cosa diventi molto ma molto pesante da eseguire, no?

La risposta che mi sono dato, ma che non mi convince del tutto, è una cosa come questa: quando creo la funzione (non si chiama funzione, ma non ricordo come si chiama... forse metodo?) che CREA una nuova istanza del nostro codice, posso accettare un parametro di input che potrebbe essere, tanto per dire, il codice del cliente. A questo punto, vado sul DB e se il codice esiste popolo tutti i campi con i valori che mi interessano, pronti da essere forniti con il nostro GET, altrimenti creo un record vuoto e inizializzo tutti i campi a zero (o a blank o a quello che serve, insomma...)
E' così che si dovrebbe fare?
A me non sembra male, anche perché a questo punto anche i metodi come SEARCH oppure SearchByName, che permetta di ricercare un codice attraverso la ragione sociale, avrebbero decisamente un senso, no?

Ho provato a guardare qualche esempio che contenga delle classi, ma sinceramente sono troppo "avanzati" per il mio livello di conoscenza :)

Come sempre, grazie per l'attenzione e per l'aiuto :)
Saluti a tutti

Mario

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Una domanda sugli oggetti
« Risposta #1 il: 23 Agosto 2008, 18:41:59 »
Vedo che la vacanza non ti ha distolto dal quel disturbo mentale che abbiamo noi programmatori... :-)

Comunque, stai iniziando a prendere la strada giusta!

Ti dò un piccolo spunto:

a) classe Cliente: contentente le informazioni di un singolo cliente;
b) classe Clienti: che gestisce i singoli clienti, compreso lo scambio dati da/verso il file, oltre a fare da interfaccia con il testo del programma.

In questo hai modo di gestire il tutto attraverso la seconda classe, passando come informazioni una classe (la prima), opportunamente creata e popolata.

Sono riuscito a darti qualche spunto in più ?

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Una domanda sugli oggetti
« Risposta #2 il: 23 Agosto 2008, 20:20:33 »
Due classi? Ohibò...
Mi incuriosisce, ma sinceramente non capisco...

In ogni caso voglio provare con quelle cose che ho provato a dire io stesso (mi piace quando mi rispondo: quanto sono bravo, dovrei pagarmi! :D )
Saluti a tutti

Mario

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Una domanda sugli oggetti
« Risposta #3 il: 24 Agosto 2008, 11:10:03 »
A lavoro da me utilizziamo il gestionale che ho scritto io: anagrafica, gestione documenti, fatturazione mensile, gestione partitari e pagamenti, ecc... Ma se facessi vedere il codice, si drizzerebbero i capelli a tutti i puristi degli oggetti!  :-o
Diciamo che li uso un po'... alla Carlona!  :nulla:

Quindi non ti preoccupare se all'inizio non li usi/non li usi bene/ o li usi un po' così.... con la pratica si impara a far tutto.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Una domanda sugli oggetti
« Risposta #4 il: 24 Agosto 2008, 16:35:27 »
Con la pratica e i consigli degli esperti: è questo il bello degli ambienti come linux e corollari, no? :)
Saluti a tutti

Mario

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Una domanda sugli oggetti
« Risposta #5 il: 24 Agosto 2008, 23:48:58 »
Beh, se non amavamo questo modus operandi, non sceglievamo Linux  :coccole:
Visita il mio sito personale: http://www.leonardomiliani.com

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Una domanda sugli oggetti
« Risposta #6 il: 25 Agosto 2008, 12:54:38 »
Giusto!

E comunque la mia era una risposta, con l'obiettivo appunto di darti qualche altro spunto e darti da pensare... :-)

Comunque, come sempre "l'appetito vien mangiando", per cui, come ha giustamente scritto leo, le idee si buttano giù, poi con l'esperienza e provando cose nuove, si ottimizzano le cose.

L'unica cosa negativa del discorso, è che se c'è in ballo un progetto, con tempi stretti, lo scopo non è più quello di metter giù una cosa fantastica, ma solo quello di fare una cosa che funziona, a prescindere se è stata fatta pensando completamente agli oggetti o meno, per cui poi i programmi (ribadendo il concetto di leo) diventano un casino.
Fino a qui non ci sarebbe nulla di male, se il progetto te lo segui solo tu, per cui sai dove mettere le mani; ma in un progetto di lavoro, la cosa diventa alquanto complicata.

Ora, visto che l'applicazione la stai creando tu, un pò per farla, un pò per imparare, il problema non esiste. Prova a vedere come si comporta il tuo programma, e poi prova a sperimentarci sopra, le idee non mancheranno di certo una volta che ci prendi la mano.

Ciao

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Una domanda sugli oggetti
« Risposta #7 il: 27 Agosto 2008, 11:54:58 »
E' vero, MD: quando sono dal cliente e devo fare un programma, la priorità è il tempo e quasi mai la tecnica o la "purezza" del codice.
Così alle volte mi tocca fare delle "porcate" perché non ho il tempo di studiare un attimo una soluzione più pulita...
E, tra l'altro, questo è il motivo per cui, quando devo rimettere mano al programma, o quando lo deve fare un collega (peggio ancora!) ci vanno delle ore per capire "perché" ho fatto in quel dato modo! :)
Saluti a tutti

Mario

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Una domanda sugli oggetti
« Risposta #8 il: 13 Settembre 2008, 18:09:09 »
Ehm, se non è chiedere troppo, sarebbe possibile avere qualche esempio di codifica di oggetti?
Sinceramente non riesco proprio a entrare in "sintonia" con questo modo di programmare... :)
Saluti a tutti

Mario

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Una domanda sugli oggetti
« Risposta #9 il: 13 Ottobre 2008, 15:33:35 »
Eh eh, finalmente ho cominciato a capirci qualcosa :)
Lo so che ci ho messo parecchio, ma ultimamente, ringraziando il cielo, ho tanto lavoro, per cui il tempo scarseggia ;)

Avevo fatto, tempo fa, un programmi scemo per imparare a usare Gambas. Il programma si "inventava" tre numeri a caso e una ruota, e mi proponeva un bel terno (non ne ho mai azzeccato uno, ma ho imparato il codice RND :D)

Il programma, così com'era, non mi piaceva perché estraendo a caso tre numeri capitava che mi desse dei duplicati, visto che non c'era controllo.
Allora l'ho ripreso e l'ho  modificato aggiungendo una classe "sacchetto", configurata cosi:

Codice: [Seleziona]

PROPERTY READ numeri AS Integer[]


PUBLIC FUNCTION riempi(numeri AS Integer[]) AS Integer[]
 
  DIM estratto AS Integer
   
    FOR estratto = 1 TO 90
      numeri[estratto - 1] = estratto
    NEXT
 
END

PUBLIC FUNCTION mescola(numeri AS Integer[]) AS Integer[]
 
  DIM quale AS Integer
  DIM estratti AS Integer
  DIM memory AS Integer
 
 
  ' Mescolo i numeri
  FOR estratti = 0 TO 89
    quale = Rnd(0, 89)
    memory = numeri[estratti]
    numeri[estratti] = numeri[quale]
    numeri[quale] = memory
  NEXT
 
 
END



Poi nel programma mi limito a fare

Codice: [Seleziona]

DIM ruote AS String[11]
DIM estratti AS Integer[6]
DIM estrazione AS Integer
DIM numeri AS Integer[90]
DIM Sacchetto AS Sacchetto

  Sacchetto = NEW Sacchetto

  'Riempio il sacchetto e mescolo
  Sacchetto.riempi(numeri)
  Sacchetto.mescola(numeri)
 
  'Estraggo i sei numeri
  FOR estrazione = 0 TO 5
   estratti[estrazione] = numeri[estrazione]
  NEXT


(più altra roba, ovviamente)
Quindi prendo, come vedete, i primi sei numeri.
In questo modo sono sicuro di prendere una e una sola volta ogni numero. Non potrò mai avere un duplicato :)
Un miglioramento potrebbe essere il prendere non i primi sei, ma sei posizioni a caso.
Anche il rimescolamento mi pare abbastanza semplice ed efficace: in pratica per ogni posizione da 1 a 90, decido un'altra posizione a caso, e scambio i due numeri.

Cosa ne pensate? La logica degli oggetti è correttamente utilizzata? :)

Più avanti mi piacerebbe fare un altro programmino con la stessa classe, che mi faccia vedere un bel tabellone a video con i 90 numeri, e che mi faccia un'estrazione di un numero per volta, mettendo un segnaposto sul tabellone.
Si, insomma: il gioco della tombola versione "non devo mettere a posto alla fine" :D
Saluti a tutti

Mario

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: Una domanda sugli oggetti
« Risposta #10 il: 13 Ottobre 2008, 16:43:45 »
Ciao. La mia risposta non c'entra niente con il discorso della logica ad oggetti, ma per estrarre 6 numeri unici a caso basta:

Codice: [Seleziona]


DIM ariNumeriEstratti AS NEW Integer[]
  DIM unNumero AS Integer
   
  RANDOMIZE
 
  DO
   
    unNumero = Int(Rnd(1, 91))
    IF ariNumeriEstratti.Find(unNumero) = -1 THEN
      ariNumeriEstratti.Add(unNumero)
    ENDIF  
    IF ariNumeriEstratti.Count = 6 THEN BREAK  
 
  LOOP
 
  FOR EACH unNumero IN ariNumeriEstratti
    PRINT unNumero; " ";
  NEXT



Ciao.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Una domanda sugli oggetti
« Risposta #11 il: 13 Ottobre 2008, 16:48:31 »
Bè, l'esempio che hai fatto rende in qualche modo l'idea, anche se non chiarisce completamente il concetto, ma è pur sempre una tua prova di introduzione nel discorso oggetti.

Sei sulla giusta strada, se poi gi aggiungi un metodo del tipo "Dammi i primi 6 numeri", sei a posto. :-)

Scherzi a parte, credo con inizi a comprenderne la logica. Devi considerare che un'oggetto (o classe) parte dal presupposto che venga utilizzata per un determinato elemento di un più grande complesso di cose.
Potrebbe essere una specie di scatola nera, funzionante, il cui scopo è di manipolare un certo tipo di informazione; l'oggetto ha un ingresso e un'uscita, e il mondo esterno non deve sapere nulla e nè deve assolutamente agire sui suoi elementi interni.
Questo semplifica, in un certo modo, la manutenibilità di un sistema complesso; una volta che l'oggetto è completo e funzionante in tutti i suoi aspetti, non cè più bisogno di sapere altro. Qualsiasi ampliamento verrà fatto solo sull'oggetto, senza la necessità di agire anche sui componenti esterni, perchè questi non hanno collegamenti interni ad esso, solo un ingresso e un'uscita.
E' ovvio che questo concetto, dal punto di vista del tuo esempio, può essere assunto dai singoli metodi pubblici, che permettono all'esterno di passare dati e ricevere risultati dall'oggetto, senza toccare nulla al suo interno.
Sempre nel tuo esempio, se un giorno vorrai cambiare le modalità di miscelazione dei numeri, ti basterà modificare il contenuto del suo metodo, e nulla cambierà nel mondo esterno.
Dato poi lo scopo della classe, è anche ovvio che questa dovrà servire solo per lo scopo cui è stata creata ma, pensa se tu aggiungessi una classe superiore, che non fà altro che riempire una tabella con numeri casuali, in quel caso la tua classe (classe figlia), non farebbe altro che espandere questa funzionalità aggiungendo il metodo "miscelamento", e la classe superiore potrebbe servire anche ad altri scopi (spero di essermi spiegato bene...).

Ottimo lavoro, continua così!

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Una domanda sugli oggetti
« Risposta #12 il: 14 Ottobre 2008, 13:04:27 »
Bella la tua soluzione, Giulio.
Però io cercavo qualcosa di più "naturale", più simile al mischiare un sacchetto.
Come dicevo, questa cosina vorrei svilupparla per fare un programma di tombola.
E' una scemata, lo so, ma può tornare utile nelle feste, no? :)
Saluti a tutti

Mario

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Una domanda sugli oggetti
« Risposta #13 il: 14 Ottobre 2008, 15:17:49 »
Bè, credo che l'unica cosa che puoi fare è di tenerti un'array dei numeri che, mano mano, crea il generatore, in modo che non avvengano duplicazioni. Appena calcoli un numero, lo inserisci nell'array ma, solo se questo non è stato già inserito; se non lo è, oltre ad inserirlo nell'array, lo estrai per la tombola.
Considerando che i numeri per la tombola sono 90, avresti un piccolo array di 90 posti...

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Una domanda sugli oggetti
« Risposta #14 il: 16 Ottobre 2008, 13:44:57 »
La mia logica è sottrattiva, e penso più "naturale": metto 90 numeri nel sacchetto, li mischio e ne prendo i primi sei.
Potrei prendere una posizione a caso (dove ci sarebbe un numero casuale, dipendente dall'azione di "mischia" di prima), e azzerare la posizione: in questo caso dovrei solo controllare che non sia vuota la posizione.

E' interessante in quanti modi diversi, e tutti validi a modo loro, sia possibile fare una cosa relativamente semplice, no? :)
Saluti a tutti

Mario