1. Introduction aux spécifications
Cette spécification stipule principalement les règles et précautions que les programmes de source Delphi devraient suivre pendant le processus d'écriture. Le but de la rédaction de cette spécification est de garder les habitudes d'écriture du code source des développeurs de logiciels d'entreprise cohérents. Ce faire que chaque membre du groupe peut comprendre le code des autres membres du groupe, afin de faciliter le développement secondaire de la maintenance du système de mémoire de code source.
2. Spécifications du format général
2.1 Indentation
L'indentation est les deux espaces exposés pour augmenter la lisibilité lorsque le niveau du programme source change. La règle d'indentation est de trouver deux espaces pour chaque niveau. L'onglet n'est pas autorisé. Car Tab produira différents effets en raison des différents paramètres fabriqués par l'utilisateur. Lorsque vous rencontrez un jugement, une boucle, une gestion des exceptions, une déclaration, une déclaration de type d'enregistrement, une déclaration de classe, etc., ajoutez un niveau. Les déclarations de classe, etc. seront réduites d'un même niveau. Par exemple:
iftmpint <> 100
Tmpint: = 100;
2.2Begin..end
L'instruction Begin et l'instruction finale doivent occuper une seule ligne dans le programme source, par exemple:
fori: = 0to10dobegin // Utilisation incorrecte
fin;
fori: = 0to10do // Utilisation correcte
Commencer
fin;
2.3 Espaces
Ajoutez des espaces aux deux extrémités des opérateurs et des symboles de jugement logique, tels que: i: = i + 1;, aandb, etc., mais aucun espace n'est nécessaire lors de l'ajout de supports. Par exemple: if (a> b) alors // utilisation incorrecte
If (a> b) alors // Correction d'utilisation
Par exemple: ProcédureTest (param1: entier; param3: String);
3.ObjectPascal Spécifications de format d'écriture de grammaire
3.1 Mots réservés
Tous les mots ou mots clés réservés dans ObjectPascal doivent être utilisés dans les lettres minuscules.
3.2 Processus et fonctions
3.2.1 dénomination et format
Les noms des procédures et des fonctions doivent tous être composés de mots significatifs, et la première lettre de tous les mots doit être en lettres majuscules. Par exemple:
ProcédureFormAtardDisk; // dénomination incorrecte
ProcédureFormAthardDisk; // NAMING CORRECT
Le processus et la fonction qui définissent le contenu d'une variable doit utiliser SET comme préfixe, par exemple:
ProcédureSeUsername;
Les processus et les fonctions qui lisent le contenu variable doivent utiliser Get As Préfixe, par exemple:
functionGetUserName: String;
3.2.2 Paramètres des procédures et fonctions
3.2.2.1 nommage
Les paramètres du type unifié sont écrits dans la même phrase:
ProcédureFoo (param1, param2, param3: entier; param4: chaîne);
3.2.2.2 nommage
Tous les paramètres doivent être significatifs; et lorsque le nom du paramètre et les autres noms d'attribut sont répétitifs, ajoutez un préfixe «A», par exemple:
ProcéduresomeProc (auSername: String; auSerage: Integer);
3.2.2.3 Conflit de dénomination
Lorsque les deux unités utilisées incluent une fonction ou une procédure en double, lorsque vous vous référez à cette fonction ou procédure, la fonction ou la procédure de l'unité déclarée dans la clause d'utilisation sera exécutée. Pour éviter ces «usages-clause-dépendants», il est nécessaire d'écrire la fonction complète ou la source de processus lorsque vous faites référence à une fonction ou un processus. Par exemple:
Sysutils.findClose (SR);
Windows.findClose (manche);
3.3 Variables
3.3.1 dénomination variable et format
Tout d'abord, les variables doivent être données de noms significatifs afin que les autres membres du groupe puissent facilement comprendre le sens représenté par la variable. capital. Par exemple:
var
WriteFormat :: String;
Dans le même temps, pour certains types spécifiques, certaines abréviations peuvent être utilisées comme suit:
Type de pointeur
P
Type d'enregistrement
Récolte
Type de tableau
Art
gentil
Classe
Les variables de contrôle de boucle utilisent généralement un seul caractère tel que: i, j ou k. De plus, l'utilisation d'un nom significatif tel que UserIndex est également autorisée.
3.3.2 Variables locales
L'utilisation de variables locales dans le processus suit les règles de dénomination pour toutes les autres variables.
3.3.3 Variables globales
Essayez de ne pas utiliser les variables globales. Par exemple:
GPreCuSerCount: point; // la variable globale avec le nom UserCount, son type est un pointeur vers une structure
Mais les variables globales peuvent être utilisées à l'intérieur du module. Toutes les variables globales dans les modules doivent être préfixées avec «F». Si l'échange de données est requis entre plusieurs modules, il doit être mis en œuvre en déclarant les attributs. Par exemple:
taper
TformoverDraftreTurn = class (tform)
Privé
{Privedeclarations}
Fusername: String;
FuSerCount: entier;
Procédures enUsername (valeur: chaîne);
FunctionGetUserName: String;
publique
{PublicDarations}
PropertyUsername: stringReadGetUserNamewriteSeuserName;
PropertyUserCount: IntegerReadFuserCountwriteFuserCount;
fin;
Type 3.4
3.4.1 Protocole de cas
Les noms de type des caractères réservés doivent être tous minuscules. Les types Win32API sont généralement en majuscules, et les premières lettres sont capitalisées pour d'autres types, et les lettres restantes sont en minuscules, par exemple:
var
MyString: String; // réservéword
WindowHandle: hwnd; // win32apitype
I: entier; // type identification deinTrodUceSystemUnit
3.4.2 Type de point flottant
Essayez de ne pas utiliser le type réel, il veut juste être compatible avec l'ancien code Pascal et essayer d'utiliser le double type. Le double type est un processeur optimisé et un bus de données et est une structure de données standard définie par IEEE. Étendu est utilisé lorsque la valeur est en dehors de la plage de double. Mais étendu n'est pas soutenu par Jave. Cependant, le type unique peut être utilisé lors de l'écriture de DLL dans d'autres langues.
3.4.3 Type d'énumération
Le nom du type d'énumération doit être significatif et le nom du type doit être préfixé «t». Le nom du contenu du type d'énumération doit contenir l'abréviation du nom du type d'énumération, par exemple:
TsongType = (Strock, stclassical, stcountry, stalternative, stheavymétal, strb);
3.4.4 Type de tableau
Le nom du type de tableau doit être significatif et le nom du type doit être préfixé «t». Si vous déclarez un pointeur sur un type de tableau, vous devez préfixer 'P' avant le nom de ce type, par exemple:
taper
PCyClearray = ^ tcyClearray;
TCyClearray = array [1..100] OFInteger;
3.4.5 Type d'enregistrement
Le nom du type d'enregistrement doit être significatif et le nom du type doit être préfixé «t». Si vous déclarez un pointeur sur un type de tableau, vous devez préfixer 'P' avant le nom de ce type, par exemple:
taper
Pemployee = ^ temPloyee;
TemPloyee = Record
Employeename: String
Employé: double;
fin;
Catégorie 3.5
3.5.1 dénomination et format
Le nom de la classe doit être significatif et le nom du type doit être préfixé «t». Par exemple:
taper
TCustomer = classe (tobject)
Le nom d'une instance de classe est généralement le nom de la classe avec «t» supprimé. Par exemple:
var
Client: TCustomer;
Variables dans la classe 3.5.2
3.5.2.1 NAMING ET FORMAT
Le nom de la classe doit être significatif et le nom du type doit être préfixé «f». Toutes les variables doivent être quatre en un. Si vous devez accéder à cette variable depuis l'extérieur, vous devez déclarer une propriété
Méthode 3.5.3
3.5.3.1 Noming and Format
Dénomination et formatage des fonctions et des procédures.
3.5.3.2 Méthode d'accès à l'attribut
Toutes les méthodes d'accès aux attributs doivent apparaître en privé ou protégé. Nommer la méthode d'accès à l'attribut est la même chose que la dénomination des fonctions et des procédures. Le paramètre de la méthode écrite doit être nommé «valeur», et son type est cohérent avec l'attribut à écrire. Par exemple:
Tsomeclass = classe (tobject)
Privé
Fsomefield: entier;
protégé
FunctionGetSomefield: entier;
ProcédureSetSomefield (valeur: entier);
publique
PropertySomefield: IntegerReadgetSomeFieldWriteSetSomefield;
fin;
3.6 Propriétés
3.6.1 dénomination et format
Les noms des variables de la classe avec le préfixe «f» sont cohérents avec l'opération.
3.7 Fichier
3.7.1 Fichier du projet
3.7.1.1 Structure du répertoire de projet
Répertoire de la maison du programme - Bin (chemin où se trouve l'application)
-DB (chemin où se trouve la base de données locale)
-Doc (chemin où se trouve le document)
-Hlp (chemin où se trouve le fichier d'aide)
-Backup (chemin de sauvegarde)
-Tmp (chemin de fichier temporaire)
3.7.1.2 NAMING
Le fichier de projet doit utiliser un nom significatif. Par exemple: le fichier de projet pour les informations système dans Delphi est nommé sysinfo.dpr.
Fichier 3.7.2form
3.7.2.1 nommage
Conformément au nom de la forme: par exemple: si le nom de la forme est formant, alors le nom du fichier de formulaire est formmain.frm.
Fichier 3.7.3Datamodule
3.7.3.1 nommage
La dénomination du fichier Datamodule doit avoir un sens et utiliser «DM» comme préfixe. Par exemple: l'utilisateur Datamodule est nommé 'dmcustomes.dfm'.
3.7.4 Fichier de liais
3.7.4.1 NAMING
La dénomination du fichier à distancedatamodule doit avoir un sens et utiliser «RDM» comme préfixe. Par exemple: l'utilisateur RemoteDatamodule est nommé 'rdmCustomers.dfm'.
Fichier 3.7.5 Unit
3.7.5.1 Unité normale
3.7.5.1.1 Unit Noming
La dénomination du fichier unitaire doit avoir un sens et utiliser «unité» comme préfixe. Par exemple: une unité générique est nommée «Unit General».
3.7.5.2formnits
3.7.5.2.1 nommage
Le nom du fichier Forunit doit être cohérent avec le nom du formulaire. Par exemple: le formulaire principal est appelé formmain.pas, le nom du fichier de formunit est: unitformmain.
3.7.5.3DatamoduleUnits
3.7.5.3.1 nommage
Le nom du fichier DatamoduleUnit doit être cohérent avec le nom du Datamodule. Par exemple: le datamodule principal est appelé dmmain.pas, alors le nom du fichier DatamoduleUnit est: unitdmmain.
3.7.5.4 En-tête de fichier
Le but, l'auteur, la date et l'entrée et la sortie de ce fichier doivent être écrits à l'en-tête de tous les fichiers. Par exemple:
{
Date de modification:
auteur:
utiliser:
Cette structure de module se compose de:
}
3.7.6forms et datamodulesforms
Classe 3.7.6.1form
1. forme des normes de dénomination de classe
Le nom de la classe Forms doit avoir un sens et utiliser «tform» comme préfixe. Par exemple: le nom de la classe à propos est:
Taboutform = class (tform)
Le nom du formulaire principal est
Tmainform = class (tform)
2. Normes de dénomination pour les instances de classe de formulaire
Les noms des instances de classe de formulaire doivent être cohérents avec les noms de la classe de formulaire avec «t» pendant la même période. Par exemple:
Typename
Nom d'instance
Taaboutform
À propos de forme
Tmainform
Mainform
TCustomERentRyform
CustomerEntryform
3.7.6.2datamodulesform
3.7.6.2.1.Datamoduleform Noming Standard
La dénomination de la classe DatamodulesForms devrait avoir un sens et utiliser «TDM» comme préfixe. Par exemple:
TdmCustomer = class (tdatamodule)
TdMorders = classe (tdatamodule)
3.7.6.2.2.Datamodule Instance de nommage norme
Le nom de l'instance de classe DataModuleForm doit être le même que le nom de la classe DatamoduleForm avec «T» tombe en même temps. Par exemple:
Typename
Nom d'instance
TCustomerDatamodule
ClientDatamodule
Tordersdatamodule
Ordersdatamodule
3.8 Contrôles
3.8.1 dénomination des instances de contrôle
Une instance de contrôle doit utiliser le nom de la classe de contrôle qui supprime 'T' comme un préfixe, par exemple:
Le nom du fedit qui pénètre dans le nom de l'utilisateur est: editUsername.
3.8.2 Abréviation des contrôles
Le nom du contrôle peut être utilisé avec l'abréviation suivante, mais l'abréviation utilisée est ajoutée entre le nom de contrôle '_':
3.8.2.1standardtab
mmtmainmenu
pmtpopupmenu
mMitmainMenuem
pmitpopupmeniuitem
lbltlabel
edttedit
memtmemo
btntbutton
cbtcheckbox
rbtradiobutton
LBTListbox
cbtcombobox
scbtscrollbar
gbtgroupbox
rgtradiogroup
pnltpanel
cltcommandlist
3.8.2.2Additionaltab
bbtntbitbtn
sbtspeedbutton
MetMaskedit
sgtsstringgrid
dgtdrawgrid
imgtimage
shptshape
bvltbevel
sbxtscrollbox
clbtchecklistbox
spltsplitter
stxtstaticText
chttchart
3.8.2.3win32tab
tbctabControl
pgctpageControl
iLtimagelist
rétriche
tbrtracbar
prbtprogressbar
udtupdown
hkthotkey
anitanimer
dtptdatetimepicker
tvtreeview
lvtlistview
hdrtheaderControl
STBTSTATUSBAR
tlbttoolbar
ClbtCoolbar
3.8.2.4Systemtab
tmttimer
pbtpaintbox
MPTMediaPlayer
olectoleContainer
ddcctddeclientConv
ddcitddeclientitem
ddsctddeserverconv
ddsitddeserveritem
3.8.2.5 Internetab
CSKTCIENTSOCK
ssktServersocket
wbdtwispatcher
pptpageproducteur
tptquerytableproducer
dstptDatasettableProducer
NMDTTNMETHILET
nectnmecho
nftnmfinger
nftptnmftp
nhttptnmhttp
nmsgtnmmsg
nmsgtnmmsgserv
nntptnmnntp
npoptnmpop3
nuuptnmuprocesseur
smtptnmsmtp
nsttnmstrm
nstnmstrmserv
ntmtnmtime
nudptnmudp
psktpowersock
ngstnmgeneralserver
htmlthtml
urltnmurl
smltimplemail
3.8.2.6dataaccesstab
dstdatasource
tbltable
qrytquery
sptstoredproc
dbtdatabase
SSNTSESSIE
bmtbatchmove
usqltupdatesql
3.8.2.7Datacontrolstab
dbgtdbgrid
dbntdbnavigateur
dbttdbtext
dbetdbedit
dbmtdbmemo
dbitdbimage
DBLBTDBLIST
dbcbtdbcombobox
dbchtdbcheckbox
dbrgtdbradiogroup
dblltdblookuplistbox
dblctdblookupcombobox
dbretdbrichedit
dbcgtdbctrlgrid
dbchtdbchart
3.8.2.8Decisioncubetab
dcbtdecisioncube
dcqtdecisionquery
dcstDeciscisonource
dcptdecisionpivot
dcgtdecisiongrid
dcgrtdecisiongraph
3.8.2.9qReporttab
QrtquickReport
QRSDTQRSUBDETAIL
QRBTQrBand
QRCBTQRCHILD
qrgtqrgroup
qrltqrlabel
qrttqrtext
Qretqrexpr
qrstqrsysdata
qrmtqrmemo
qrrrttqrrichText
qrdrtqrdbrichText
qrshtqrshape
Qritqrimage
qrditqrdbmimage
qrcrtqrcompositEreport
qrptqrpreview
qrchtqrchart
3.8.2.10dialogstab
Opentialogtopennialog
Sauvedialogtsavedialog
OpenPicturealiogtopenpiTturealialog
Sauvegarder
Fontdialogtfontdialog
Colordialogtcolordialog
Printdialogtprintdialog
Imprimersetupdialogtprintsetupdialoging
Finddialogtfinddialogt
Remplacé
3.8.2.11win31tab
dblltdblookuplist
dblctdblookupcombo
tsttabset
oltoutline
tnbttabbedNotebook
NBTNOTEbook
chef de file
flbtfilelistbox
dlbtDirectoryListbox
dcbtdrivecombobox
fcbtfiltercomboBox
3.8.2.12Samplestab
ggtgauge
cgtcolorgrid
SPBtspinbutton
spetspinedit
DoltDirectory
Caltcalendar
iBeatiBevenalener
3.8.2.13activextab
cfxtchartfx
vsptvsspell
f1btf1book
vtctvtchart
grptgraph
3.8.2.14midastab
prvtprovider
cdstclientDataset
qcdstQueryClientDataset
dcomtdcomconnection
oleetoleenterpriseconnection
SCKTSOCKECKECTION
rmstremoseserver
midtmidasconnection
4 Modifier les spécifications
Les dispositions prises dans ces règles s'appliquent uniquement aux procédures qui ont été incorporées dans la gestion de la configuration. Dans de telles modifications, il est nécessaire de conserver le contenu avant la modification et d'identifier le contenu modifié et nouvellement ajouté. Et ajouter les informations nécessaires telles que Modifyer, la date de modification, les instructions de modification, etc. à l'en-tête de fichier.
4.1 Modifier le dossier d'historique
Lorsque vous apportez des modifications approuvées au fichier source, le modification doit ajouter un élément d'historique de modification à l'en-tête du fichier du programme. Dans chaque modification ultérieure, le modificateur doit remplir les informations suivantes dans l'élément:
Modifier
Temps de modification
Raison de la modification
Comment modifier les instructions
4.2 Ajouter une nouvelle ligne de code
La nouvelle ligne de code aurait dû commenter les lignes avant et après.
// modifier la personne, temps de modification, instructions de modification
Ajout de ligne de code
// Fin de la modification
4.3 Supprimer la ligne de code
Utilisez des lignes de commentaires pour décrire avant et après la suppression de la ligne de code.
// modifier la personne, temps de modification, instructions de modification
// la ligne de code à supprimer (commentez la déclaration à supprimer)
// Fin de la modification
4.4 Modifier la ligne de code
Modifiez la ligne de code pour supprimer la ligne de code et ajouter de nouvelles lignes de code.
// modifier la personne, temps de modification, instructions de modification
// la ligne de code avant modification
// Fin de la modification
// ligne de code modifiée
Ligne de code modifiée
// Fin de la modification