Newsgroup: it.comp.lang.visual-basic
Titolo: istruzione: Visual Basic (Declaration)

Cosa significa l'istruzione in oggetto?
 
Esempio,prima di una funzione:
 
Visual Basic (Declaration)
Public Shared Function NomeFunzione  ( _
corpo funzione...
.....
) As String
 
Ciao 
 
 


Quale scusa?
Visaul basic (declaration) ....so na mazza....è roba del sito dove hai 
preso l'esempio!
 
Public Shared Function è una funzione condivisa fra tutte le istanze.
Che vordì?
Vordì che il dato o la funzione viene condiviso fra tutte le istanze che 
crei!
Non solo...lo puoi usare come se fosse un modulo del vecchio vb6! Non è 
necessario usare l'istanziazione
 
TRADOTTO in pseudo codice
 
Class Triangolo
 
	public property lato1
	public Property lato2
         public property lato3
	public property NomeTriangolo
..metodi.....bla bla bla....
 
Vuoi un metodo GENERALE per tutti gli oggetti triangolo che creerai
 
ad esempio
	public property PERIMETRO
 
poi
         public shared function CALCOLAperimetro(l1 as single,l2 as 
single, l3 as single)
	return l1+l2+l3
         end function
 
 
come la usi? ad esempio
 
 
  dim Tassellatura1 as new Triangolo(10,20,30)
  dim Tassellatura2 as new Triangolo(30,40,50)
 
Tassellatura1.PERIMETRO= 
Triangolo.CALCOLAperimetro(Tassellatura1.lato1,Tassellatura1.lato2,Tasselatura1.lato3)
 
etc etc
per dirtela terra terra alla vb6
serve a mischiare un po modulo ed oggetto...
 
 
è utile per scrivere meno codice....ma ATTENZIONE il rischio di 
spaghetti code è alto!!!
 
Piccolo tip
in 
vb.net
 ti han dato una semantica ad hoc "MODULE" "END MODULE"
se scrivi
public shared class MioModulo
end class
 
....è lo stesso!!!
 
 
Saluti!


Messa così è un po' ambigua; anche un normale metodo di istanza sarebbe per sua natura generale per tutti gli oggetti creati, e otteresti lo stesso risultato dell'esempio pure più facilmente; il punto dello Shared non è soltanto quello di essere generale e condiviso tra le istanze ma più che altro proprio quello di *non* richiedere necessariamente la creazione di alcun oggetto prima dell'uso...
 
 
Quindi, per dire, si nota di più l'utilità in un caso del tipo:
 
Class Triangolo
 
  public property lato1
  public Property lato2
  public property lato3
  public property PERIMETRO
 
public function CALCOLAperimetro()
  return Triangolo.CALCOLAperimetro(me.lato1, Me.lato2, Me.lato3)
end function
 
public shared function CALCOLAperimetro(l1 as single,l2 as 
single, l3 as single)
  return l1+l2+l3
end function
 
End Class
 
dim Tassellatura1 as new Triangolo(10,20,30)
dim Tassellatura2 as new Triangolo(30,40,50)
dim Perimetro3 as Single
 
Tassellatura1.PERIMETRO=Tassellatura1.CALCOLAperimetro()
Tassellatura2.PERIMETRO=Tassellatura2.CALCOLAperimetro()
Perimetro3=Triangolo.CALCOLAperimetro(60,70,80)
 
Dove, quando non è necessario l'oggetto per altri scopi, l'uso dello Shared rende il caso 3 è più compatto e anche più performante, lasciando sempre il codice di "competenza" della classe Triangolo, come è giusto sia.

On 21/06/2012 11:52, Luca D wrote:
zacchete
....
e via scanniamoci su un pelo!
 
Io mi faccio sempre la domanda....perchè dovrei mettere un membro SHARED 
in una classe e non in un modulo?
 
Spesso non mi do risposta....e faccio un modulo!
 
Talvolta mi rispondo...per comodità per accentrare sotto il nome della 
classe ROBA(codice) che è utile controllare o fare PRIMA di istanziare 
un oggetto..o che è utile far fare come complemento (se prevede una 
stampa....controllare che ci sia una stampante?).
 
Ad esempio se ho una classe che mi rappresenta un triangolo potrei avere 
un algoritmo che mi calcola il perimetro e l'area di questo triangolo.
 
Posso fare un
Class Triangolo
 
    function Perimetro
	return l1+l2+l3
    end function
end class
 
però potrei dire ...voglio un algoritmo che mi calcoli il perimetro di 
un generico triangolo ...o ancora meglio siccome tassellando potrei 
unire 2 triangoli un algoritmo che mi calcoli il perimetro di un 
generico poligono
 
 
Cha fare?
 
Un modulo
 
Public PerimetroPoligono (Lati() as single)
 
oppure visto che sono qui dentro triangolo e che non prevedo altri 
oggetti tipo ...quadrato:
 
 
Shared PerimetroTriangolo(lato1,lato2,lato3,optional EspandiLati() as 
single)
 
e quindi posso usare ben 3 strade
 
dim t1perimetro as single=PerimetroPoligono(......array
 
oppure
 
dim t2=triangolo.PerimetroTriangolo(1,2,3)
 
o dim t3=Triangolo.PerimetroTriangolo(1,2,3,...array lati in più)
 
oppure ancora
 
Dim tr1 as new triangolo
dim tr2 as new triangolo
dim tr3 as new triangolo
 
 
Poligono=tr1.perimetro+tr2.perimetro+tr3.perimetro
 
 
  Sostanzialmente si fa la solita cosa....si discute di peli nell'uovo!
 
Io per mia impostazione
ne faccio veramente POCHE di funzioni shared in una classe!!!
 
Però se si aderisce alla "svincolo dell'oggetto da influenze(dipendenze) 
esterne" progettualmente
potrebbe accadere che
l'oggetto avesse
una funzione StampaTriangolo...il pc è senza stampante....
 
  2 strade
  o dare errore o cercare di installare una stampante o analogo sistema 
(ad esempio dirottare sulla creazione di un pdf da stampare succesivamente)
 
ed allora forse
 
(pseudo codice)
if Triangolo.PrintInstalled= false then
	dim TR1 as new Triangolo(printable := false)
	per caricare ad esempio un plugin pdf per salvare almeno in pdf
end if
 
potrebbe avere un senso...anche se si può fare dentro la classe....ma 
perchè appesantire ....
 
dipende....perchè poi sta roba dovrebbe essere manutenibile...forse 
avere in Triangolo il codice che controlla se una stampante è 
installata...aiuterebbe...o forse no! dipende da come si struttura la 
mente e il lavoro!!!
 
:)
 
 

 in una classe e non in un modulo?
 
Io sempre quella opposta: visto che un modulo, lo hai detto tu stesso, non è altro che una scorciatoia verso una classe interamente Shared, che cosa ci guadagno rispetto a scrivere una classe esplicita? 
In funzionalità niente, in righe di codice zero, forse una, e in leggibilità ci perdo un pochino... ergo, di preferenza scelgo classe esplicita+membro shared
 
Ma a parte questo, e trascurando tutto il resto del post perchè sei partito per una tangente che non c'entra nulla, la mia era solo una considerazione molto banale:
 
Hai fatto un esempio della classe Triangolo con un metodo Shared, e fin lì era perfetta per lo scopo, poi però hai fatto anche un esempio di chiamata, e hai usato:
 
dim Tassellatura1 as new Triangolo(10,20,30) 
Triangolo.CALCOLAperimetro(Tassellatura1.lato1,Tassellatura1.lato2,Tasselatura1.lato3) 
 
Che rende l'esempio un po' meno chiaro; uno che non ha dimestichezza con 'Shared' e chiede appunto informazioni, guarda quel codice e non apprezza l'utilità della cosa... da profano, la prima cosa che pensa è
 
"Vabbè, ma che pippa mentale... già che ha creato l'oggetto, non faceva prima a creare un normale metodo di istanza CalcolaPerimetro(), senza parametri, e poi leggere internamente le property dell'istanza stessa?! A cosa serve davvero averlo fatto Shared?"
 
e non è che gli si potrebbe dare torto... quindi, per spiegargli meglio la differenza, ho semplicemnete integrando il tuo esempio con un ulteriore caso che non richiede nessuna istanza e sfrutta meglio l'utilità del membro shared
 
Tutto qua

> e via scanniamoci su un pelo!
 
vecchio problema non mi vedi mentre scrivo....non son partito per la 
tangente
...non riprendo nessuno !
Il problema di net è che talvolta puoi fare le stesse cose in modi diversi
.....
io trovo utile scrivere in un modulo i metodi GENERALI (come ho detto) e 
solo talvolta incorporarli nella classe...tu l'incontrario!!!
 
 
 
Triangolo.CALCOLAperimetro(Tassellatura1.lato1,Tassellatura1.lato2,Tasselatura1.lato3) 
 
è didattico. M'è venuto male l'esempio?....può darsi! L'amico sta 
zitto...non lo sapremo mai!
 
 
Sto ridendo...nessun appunto

 
 
Diciamola tutta. I moduli, comne notazione, sono un vecchio retaggio del VB6.
Infatti quello non è un problema di .Net ma solo di VB.net. In C#, per esempio,
non avresti questa "funzionalità".
 
In realtà in .Net manco esiste il modulo. Infatti esso non è altro che una
sealed class.