2010-08-31 17 views
5

Il mio primo linguaggio "serio" era Java, quindi ho compreso la programmazione orientata agli oggetti nel senso che il mattone elementare del programma è una classe. Ora scrivo su VBA e Python. Esistono linguaggi di moduli e sento un disagio persistente: non so come dovrei scomporre il programma in moduli/classi.Programmazione del modulo rispetto agli oggetti in vba

Comprendo che un modulo corrisponde a un dominio di conoscenza, un modulo dovrebbe essere in grado di testare separatamente ... Dovrei apprendere il modulo solo come spazio dei nomi (C++)?

risposta

3

Non eseguo VBA ma in Python, i moduli sono fondamentali. Come dici tu, possono essere visualizzati come spazi dei nomi ma sono anche oggetti a se stanti. Non sono tuttavia classi, quindi non puoi ereditarli (almeno non direttamente).

Trovo che sia una buona regola mantenere un modulo interessato a un'area di dominio. La regola che uso per decidere se qualcosa è una funzione a livello di modulo o un metodo di classe è di chiedermi se potrebbe essere usata in modo significativo su qualsiasi oggetto che soddisfi l''interfaccia' che prende gli argomenti. Se è così, allora lo svincolo da una gerarchia di classi e ne faccio una funzione a livello di modulo. Se la sua utilità in realtà è limitata a una particolare gerarchia di classi, allora creo un metodo.

Se è necessario, lavorare su tutte le istanze di una gerarchia di classi e renderle una funzione a livello di modulo, è sufficiente ricordare che tutte le sottoclassi devono ancora implementare l'interfaccia fornita con la semantica fornita. Questo è uno dei compromessi di allontanarsi dai metodi: non è più possibile apportare una leggera modifica e chiamare lo super. D'altra parte, se le sottoclassi rischiano di ridefinire l'interfaccia e la sua semantica, allora forse quella particolare gerarchia di classi non è un'astrazione molto buona e dovrebbe essere ripensata.

+0

Sì, è molto cool che in python posso bianco se a: importazione a_handler altro: import b_handler ma in VB non posso farlo :(Sai esempio di funzione di livello di modulo che non è una funzione singleton (vedi altre risposte)? – nikaan

+0

@Nikita Non so cosa intendi per funzione di singleton.Un singleton è un modo (raramente buono) di pensare a un modulo ma penso che tu stia cercando di forzare i concetti di OO su un idioma non OO – aaronasterling

1

Gli idiomi delle lingue sono diversi e questo è il motivo per cui un problema risolto in lingue diverse richiede approcci diversi.

  1. "C" è tutto sulla decomposizione procedurale.
  2. L'idioma principale in Java riguarda la scomposizione di "classe o oggetto". Le funzioni non sono assenti, ma diventano parte del comportamento esibito di queste classi.
  3. "Python" fornisce supporto sia per la decomposizione dei problemi basata su classi sia per quanto riguarda le procedure.

Tutti questi utilizzano file, pacchetti o moduli come concetto per l'organizzazione di pezzi di codice di grandi dimensioni insieme. Non c'è nulla che ti limiti ad avere un modulo per un dominio di conoscenza. Queste sono tecniche di decomposizione e di organizzazione e possono essere applicate in base al problema in questione.

Se si ha familiarità con OO, si dovrebbe essere in grado di usarlo molto bene in Python.

+0

> Se si ha familiarità con OO, si dovrebbe essere in grado di usarlo molto bene in Python. In Java, un file <-> una classe pubblica. Sembra che l'applicazione di questa regola sia molto brutta in Python. In Python un file <-> una piccola attività, penso. – nikaan

+0

@Nikita Non è così. In python (spesso) un file <-> insieme di molte piccole attività correlate e forse alcune grandi. – aaronasterling

+2

L'organizzazione del codice dipende totalmente dal programmatore. Le regole non sono scolpite nella pietra. Tipicamente, se ci sono classi multiple piccole, l'abitudine è usarle in un unico file, devo dire modulo. Se le classi sono grandi, di solito sono segregate in più file. Python ha un pacchetto come un modo per raggruppare questi file. Immagino che la flessibilità consenta ai programmatori di identificare quali sono adatte a loro. – pyfunc

1

VBA consente anche l'uso di classi. Sfortunatamente, queste classi non supportano tutte le funzionalità di un linguaggio orientato agli oggetti a tutto tondo. Soprattutto l'ereditarietà non è supportata.

Ma è possibile lavorare con le interfacce, almeno fino a un certo grado.

Ho usato solo moduli come "un modulo = un singoletto". I miei moduli contengono metodi "statici" o anche stateless. Quindi, a mio parere, un modulo VBa non è uno spazio dei nomi. Più spesso un gruppo di classi e moduli formerebbe uno "spazio dei nomi". Spesso creo un nuovo progetto (DLL, DVB o qualcosa di simile) per un tale "spazio dei nomi".

+0

Sì, Singleton è giusto concetto in questo contesto! Quindi, qualcosa è la funzione a livello di modulo se si tratta di una funzione singleton. – nikaan

3

È questione di gusti. Se usi i moduli, il tuo "programma" sarà più orientato alla procedura. Se scegli le classi sarà più o meno orientato agli oggetti. Sto lavorando con Excel per un paio di mesi e personalmente scelgo le lezioni quando posso perché è più comodo per me. Se smetti di pensare a objects e pensi a loro come a Components, puoi usarli con eleganza. Il motivo principale per cui preferisco le lezioni è che puoi averne di più. Non puoi avere due istanze di modulo. Mi consente di utilizzare l'incapsulamento e un migliore riutilizzo del codice.

Ad esempio, supponiamo che ti piaccia avere un qualche tipo di logger, per registrare le azioni che sono state fatte dal tuo programma durante l'esecuzione. Puoi scrivere un modulo per questo. Può avere ad esempio una variabile globale che indica su quale particolare registrazione del foglio verrà eseguita. Prendi in considerazione la seguente situazione ipotetica: il tuo cliente desidera che tu includa alcune fantasiose funzionalità di generazione di report nel tuo programma. Sei intelligente, quindi ti rendi conto che puoi usare il tuo codice di registrazione per prepararli. Ma non è possibile fare log e report contemporaneamente da un modulo. Ed è possibile con due istanze di registrazione Component senza modifiche nel loro codice.

+0

Sì, ho capito, ho una situazione opposta - c'è un grande add-on su VBA, excel, circa 1000 linee su ogni 10 moduli e non ci sono affatto classi :) Ma il prossimo miglioramento richiede 5 casi di comportamento molto simile e voglio introdurre classi. È più difficile che in Java :) VBA proibisce molte cose. Oh! Conoscete qualche IDE per VBA? O add-in con evidenziazione della sintassi, per esempio? – nikaan

+1

Bene, l'IDE incorporato in Excel non è così male come sembra a prima vista. Sto scrivendo nell'edizione del 2003 e ha l'evidenziazione della sintassi e un sistema antico pre-intelli-sense ;-) Anche Debugger è ragionevole. Se rimani bloccato con qualcosa cercherò di aiutare. In quel periodo ho un po 'di exp. – Bart

+0

grazie! Ero abituato a provare il 2003 e il 2007. Mi sono abituato a eclipse, ecc., A proposito di evidenziare notepad simile ++? (Quando seleziono una parola, tutte le parole sono evidenziate ...) o chiamate la gerarchia? Perché, ad esempio, la ricerca di "alcuni" trova non solo "alcune" entità ma "qualcuno", "bello" e così via. La gerarchia delle chiamate è molto utile se si utilizzano variabili globali :) mmm. Inoltre ho problemi con il codice di formattazione - haw posso tab o rientro grande pezzo di codice? Può essere, cosa posso aiutarti - svn tool per VBA (http://www.codeproject.com/KB/office/SourceTools.aspx) – nikaan

Problemi correlati