Università degli studi di Modena e Reggio Emilia
progetto e-COMconvenzioni per i nomi
Premesse
1. L’uso di nomi standardizzati aumenta grandemente le possibilità di manutenere, condividere e sviluppare applicazioni in gruppo.
2. Se avete provato a mettere le mani su un applicativo sviluppato da un altro, conoscete la frustrazione di capire il suo stile e il tempo che ci vuole per fare manutenzione su uno stile diverso dal vostro. Ma anche il vostro stile cambia nel tempo e dopo qualche anno anche il vostro codice vi risulterà estraneo come quello scrito da un altro.
C’è quindi una sola ragione per non adottare convenzioni: tenere nascosta la logica dell’applicazione: agli altri perché sia difficile copiare e a voi stessi per farvi pagare le giornate di manutenzione.
Dunque scegliete: volete essere pagati per mantenere software casalingo, unico al mondo e chiuso nel vostro cassetto o per produrre software aperto, riutilizzabile, fruibile da tutti? State tranquilli, ci sarà sempre nuovo software da produrre!
3. Il metodo qui descritto è chiamato ungherese (hungarian) dalla nazionalità del creatore, Charles Simonyj ed è stato pubblicato da Stan Leszynski e Greg Reddick per la prima volta nel 1993. Ecco il documento originale:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaccgen/html/msdn_20naming.aspPrevede due livelli: il livello 1 è completo, ma non esplicita gli oggetti come il livello 2, che consente di ordinare insieme funzioni simili in basi di dati di grandi dimensioni.
Struttura dei nomi
[prefissi]tag[NomeBase][Qualificatori]
Le parentesi indicano opzionalità e non fanno parte del nome. Può sembrare strano che l’unica parte obbligatoria sia il tag, ma questo consente di fare riferimento a oggetti generici, quando sono passati come parametri.
I prefissi e i tag sono minuscoli, così l’occhio li può oltrepassare in fretta, fino alla prima lettera maiuscola, che inizia il nome base. Il nome base (che rappresenta l’oggetto e non la classe) si compone di una o più parole: non si devono utilizzare spazi bianchi, ma si deve utilizzare la maiuscola all’inizio di ogni parola (se proprio non se ne può fare a meno, usare _). Infine il nome base deve essere singolare, anche se si tratta di una tabella (infatti in questo caso il plurale è implicito).
Il nome base di una tabella deve prevalere, cioè gli oggetti che che si riferiscono direttamente alla tabella devono avere lo stesso nome base e diverso tag.
Oggetti di database
oggetto
tag
esempio
livello 1
Table
tbl
tblCustomer
Table (lookup)
tlkp
tlkpShipper
livello 1
Query (select)
qry
qryOverAchiever
Query (append)
qapp
qappNewProduct
Query (crosstab)
qxtb
qxtbRegionSales
Query (data definition)
qddl
qddlAddWorkColumn
Query (delete)
qdel
qdelOldAccount
Query (form filter)
qflt
qfltSalesToday
Query (lookup)
qlkp
qlkpStatus
Query (make table)
qmak
qmakShipTo
Query (pass-through)
qspt
qsptArchiveQuantity
Query (union)
quni
quniOrderDetail
Query (update)
qupd
qupdDiscount
livello 1
Form
frm
frmCustomer
Form (dialog)
fdlg
fdlgLogin
Form (menu)
fmnu
fmnuUtility
Form (message)
fmsg
fmsgWait
Form (subform)
fsub
fsubOrder
livello 1
Report
rpt
rptInsuranceValue
Report (subreport)
rsub
rsubOrder
livello 1
Macro
mcr
mcrUpdateInventory
Macro (for form)
m[formname]
mfrmCustomer
Macro (menu)
mmnu
mmnuEntryFormFile
Macro (for report)
m[rptname]
mrptInsuranceValue
livello 1
Module
bas
basBilling
Il solo qualificatore previsto è Sub.
I prefissi consentono di mantenere gli oggetti in cima e in fondo all’ordinamento alfabetico:
zz
oggetti abbandonati, ma che si vuole conservare
zt
oggetti temporanei
zs
oggetti di sistema, cioè oggetti non usati dall’utente,
ma utili per lo sviluppo e la manutenzione
_
oggetti in sviluppo
Campi
L’uso dei tag nei nomi dei campi è un tema caldo, perché alcuni sostengono che i nomi dei campi devono essere indipendenti dal tipo del dato, per mantenere puro lo schema del database. Ma i vantaggi dell’uso del tag rimengono forti.
Field Type
Tag
Example
Binary
bin
binInternal
Byte
byt
bytFloorNum
Counter
lng
lngPKCnt
Currency
cur
curSalary
Date/Time
dtm
dtmHireDate
Double
dbl
dblMass
Integer
int
intUnit
Long
lng
lngPopulation
Memo
mem
memComments
Ole
ole
oleEmpPhoto
Single
sng
sngScore
Text
str
strFirstName
Yes/No
ysn
ysnDiscounted
I contatori sono di tipo long: se si vuole distinguere la loro specifica natura, utilizzare il suffisso cnt.
Controlli
Object
Tag
Example
Label
lbl
lblLastName
Control (generic)
ctl
ctlLastName
Chart (graph)
cht
chtSales
Check box
chk
chkReadOnly
Combo box
cbo
cboIndustry
Command button
cmd
cmdCancel
Frame (object)
fra
fraPhoto
Line
lin
linVertical
List box
lst
lstPolicyCode
Option button
opt
optFrench
Option group
grp
grpLanguage
Page break
brk
brkPage1
Rectangle/shape
shp
shpNamePanel
Subform/report
sub
subContact
Text box
txt
txtLoginName
Toggle button
tgl
tglForm
C’è un solo prefisso per i controlli: zs, che denota controlli di sistema, non visibili all’utente, che possno memorizzare valori temporanei o parametri passati.
Procedure
Per una funzione chiamata da una proprietà di una form, utilizzare:
formname_controlname_propertyname for example: frmEmployee_cmdAdd_Push
Per una proprietà che si riferisce a un’intera form, utilizzare:
formname_propertyname, as in frmEmployee_Open.
Se due o più controlli di una form eseguono lo stesso codice, creare una funzione per ognuno, da cui chiamare un’unica funzione che contiene il codice comune.
Variabili
Variable Type
Tag
Example
Container
con
Dim conTables as Container
Control
ctl
Dim ctlVapor As Control
Currency
cur
Dim curSalary As Currency
Database
db
Dim dbCurrent As Database
Document
doc
Dim docRelationships as Document
Double
dbl
Dim dblPi As Double
Dynaset
dyn
Dim dynTransact As Dynaset
Flag (Y/N, T/F)
f
Dim fAbort As Integer
Field
fld
Dim fldLastName as Field
Form
frm
Dim frmGetUser As Form
Group
gru
Dim gruManagers as Group
Index
idx
Dim idxOrderId as Index
Integer
int
Dim intRetValue As Integer
Long
lng
Dim lngParam As Long
Object
obj
Dim objGraph As Object
Parameter
prm
Dim prmBeginDate as Parameter
Property
prp
Dim prpUserDefined as Property
QueryDef
qdf (or qrd)
Dim qdfPrice As QueryDef
Recordset
rec (or rst)
Dim recPeople as Recordset
Relation
rel
Dim relOrderItems as Relation
Report
rpt
Dim rptYTDSales As Report
Single
sng
Dim sngLoadFactor As Single
Snapshot
snp
Dim snpParts As Snapshot
String
str
Dim strUserName As String
Table
tbl
Dim tblVendor As Table
TableDef
tdf (or tbd)
Dim tdfBooking as TableDef
Type (user-defined)
typ
Dim typPartRecord As mtPART_RECORD
User
usr
Dim usrJoe as User
Variant
var
Dim varInput As Variant
Workspace
wrk (or wsp)
Dim wrkPrimary as Workspace
Yes/No
ysn
Dim ysnPaid As Integer
Lo stile proposto non usa i suffissi $ e % perché sono scoraggiati dalla Microsoft.
I tag per le variabli sono gli stessi usati per gli oggetti.
Per le constanti e tipi definiti dall’utente
Si può usare anche la convenzione molto diffusa del tutto maiuscolo, ma si deve usare il prefisso typ e i prefissi g ed m (vedi sotto).
Il livello 2 propone prefissi per lo scope di variabili e costanti.
Questi prefissi vanno anteposti agli altri prefissi.
Le variabili dichiarate localmente con Dim non hanno prefisso
Le variabili dichiarate localmente con Static hanno prefisso s (es.: sintAccumulate)
Le variabili dichiarate in un modulo con Dim hanno prefisso m (es.: mcurRunningSum)
Le variabili dichiarate con Global hanno prefisso g (es.: glngGrandTotal)
Le variabili che denotano parametri passati a una funzione (tra parentesi dopo il nome della funzione) hanno prefisso r se passati per referenza o v se passati per valore
I qualificatori (che seguono il nome della variabile e lo differenziano ulteriormente) dipendono dall’applicazione e possono essere creati ad hoc. Si riporta una lista dei più comuni.
Variable Property
Qualifier
Example
Current element of set
Cur
iaintCur
First element of set
First
iaintStockFirst
Last element of set
Last
iaintStockLast
Next element of set
Next
strCustomerNext
Previous element of set
Prev
strCustomerPrev
Lower limit of range
Min
iastrNameMin
Upper limit of range
Max
iastrNameMax
Source
Src
lngBufferSrc
Destination
Dest
lngBufferDest
Labels
Si usa un qualificatore del nome della funzione per creare label standard. Per esempio per l’istruzione On Error GoTo, si usa il nome della funzione con il qualificatore _Err.
Bisogna creare una label per saltare alla fine della funzione, perché è più appropriato avere un solo punto d’uscita dalla funzione (per assicurara una omogenea chiusura di file e settaggio di variabili), invece di cospargere ovunque le istruzioni di Exit. Utilizzare il qualificatore _Done, come in cmdAdd_Click_Done.
Nomi e commenti
- La convenzione sui nomi non sostituisce i commenti: seplicemente è un’altra tecnica di buona programmazione.
In ogni modulo deve essere indicato, perlomeno: obiettivo, autore, data, parametri, ultima revisione e relative note.