2013-08-19 12 views
5

Ho usato i moduli di classe VBA in Excel per un po 'di tempo, ma non sono sicuro che li sto creando correttamente. Generalmente creo le variabili di livello del modulo per la classe e quindi le proprietà lasciano e ottengono funzioni. Per esempio:Dovrei avere valori duplicati in oggetti di classe VBA?

Private msRegion As String 

Property Get Region() As String 
    Region = msRegion 'Return the Region 
End Property 

Property Let Region(ByVal sRegionName As String) 
    msRegion = sRegionName 'Set the Region 
End Property 

Quando guardo gli oggetti nella finestra locale, mi accorgo che per ogni proprietà io alla fine con la variabile modulo di scope e la variabile richiesto dalla funzione di Let. Mi sembra una duplicazione di una variabile. Sono preoccupato del fatto che se instatassi una grande collezione di oggetti con diverse proprietà in ognuno di essi potrebbe essere costoso in termini di risorse.

Ho provato a modificare il codice in modo che solo una variabile si trovi nella classe dell'oggetto, ma finora ho ricevuto solo messaggi di errore per i miei problemi.

Qualcuno sa di un modo per creare proprietà nei moduli di classe che non porta a variabili duplicate?

Edit:

Ho appena avuto un altro sguardo alla mia finestra gente del posto e capito che l'argomento al let proprietà non c'è. Le 2 espressioni sembrano essere la variabile memorizzata privatamente e il valore get della proprietà, in questo caso msRegion e Region. Questo si adatta alla risposta di Cor_Blimey.

+1

+1 buona domanda e qualcosa di cui sono stato curioso anch'io. Tutti gli esempi che ho trovato (e quelli che ho implementato) rispecchiano il tuo codice. Sospetto che questa sia la natura delle cose ed è corretta, ma è un po 'confusa nella finestra dei locali. –

risposta

5

Hai provato a recuperare o impostare la proprietà msRegion nel codice che chiama la classe? Se lo fai, noterai che non è callabile.

Si sta strutturando correttamente la classe.

La finestra dei locali mostra tutte le variabili dichiarate, incluso varibale privato all'interno di una classe.

+0

Grazie per l'informazione, speravo che l'argomento per la procedura let potesse essere distrutto al termine della procedura, ma suppongo che non sia il modo in cui funziona. –

4

Declan_K ha ragione nel dire che a) si sta facendo bene, e b) la finestra dei locali ignora l'ambito e li mostra comunque.

Per aggiungere un po 'per il motivo per cui è bene separare fuori e avere una proprietà pubblica e ed un campo privato Utente:

1) Si possono avere utili 'logica' limitata nel Get/Set/Lasciare. Forse desideri memorizzare il valore in un formato diverso ma presentarlo sempre in un altro (ad es. Memorizzarlo come un numero lungo di millisecondi ma tornare sempre in Doppio secondo), o forse vuoi convalidare i dati prima di memorizzarlo.

2) Si definisce una "interfaccia" pubblica che rappresenta un contratto tra la classe e le classi che consumano. Pertanto, fai una chiara distinzione tra i componenti interni della tua classe, che sono liberi di cambiare come meglio credi, e l'interfaccia esterna. Questo potrebbe non essere un problema nella pratica in VBA, poiché è probabile che tu abbia completamente il controllo di tutte le classi che consumano e VBA compila su richiesta, quindi non è un problema cambiare i campi alle proprietà e viceversa, ma è una buona pratica e dovrebbe contribuire a rafforzare l'incapsulamento. Ti aiuterà anche a ricordare quando hai bisogno di essere dannatamente sicuro che non stai facendo un cambiamento in altre parti del tuo Addin/programma!

3) Le proprietà in genere non occupano spazio di archiviazione aggiuntivo per la variabile. I requisiti di archiviazione nel caso di avere un campo pubblico e una proprietà con un campo di backing privato sono fondamentalmente gli stessi. Se ti aiuta, pensala come una 'funzione' che restituisce il valore privato o un 'sub' che imposta il valore privato.

4) In alcuni casi è possibile risparmiare risorse: considerare una classe con proprietà che restituiscono oggetti (come una raccolta "Risultati" o qualcosa del genere). È possibile mantenere i campi di supporto come Nothing fino a quando l'oggetto è effettivamente necessario, sia attraverso un metodo della classe o attraverso un consumatore che lo richiede tramite una proprietà. Quando viene richiesto, è possibile creare un'istanza dell'oggetto, se necessario.

5) ambito separato per il Setter e Accessor: I campi sono privati ​​o sono pubblici e quindi, se è pubblico non è possibile impedire, ad esempio, un campo di essere fatto per fare riferimento a un nuovo oggetto che può o non può essere incoerente con lo stato che la tua classe si aspetta D'altra parte, è possibile limitare una proprietà in modo che sia di sola lettura ecc. Si noti che ciò non impedirà a un oggetto di sola lettura di modificarne le proprietà, ma impedisce solo che il riferimento cambi. Ancora una volta, come al punto 2, questo potrebbe non essere affatto un problema per te in quanto è all'interno del tuo progetto e solo VBA, dopotutto, ma dovrebbe aiutare a garantire che le proprietà (nel senso più ampio) della tua classe siano parte integrante le caratteristiche della tua classe sono controllate dalla tua classe.

6) Ci sono molti altri motivi in ​​altre lingue, ma VBA lo fa, è vero, ne ha di meno.

D'altra parte, è un dolore scrivere così tanto testo per qualcosa che potresti trovare utile o meno!

Problemi correlati