1. Einführung in Spezifikationen
Diese Spezifikation legt hauptsächlich die Regeln und Vorsichtsmaßnahmen fest, die beim Schreiben von Delphi-Quellprogrammen befolgt werden sollten. Der Zweck dieser Spezifikation besteht darin, die Schreibgewohnheiten der Softwareentwickler des Unternehmens im Quellcode zu vereinheitlichen. Dadurch kann jedes Teammitglied den Code anderer Teammitglieder verstehen, was die Wartung des sekundären Entwicklungsspeichersystems des Quellcodes erleichtert.
2. Allgemeine Formatspezifikationen
2.1 Einrückung
Durch die Einrückung werden zwei Leerzeichen freigelegt, um die Lesbarkeit zu verbessern, wenn sich die Quellprogrammebene ändert. Die Einrückungsregel beträgt zwei Leerzeichen pro Ebene. Tab ist nicht erlaubt. Weil Tab aufgrund unterschiedlicher Einstellungen des Benutzers unterschiedliche Effekte erzeugt. Wenn Sie auf eine Anfangs- oder Eintrittsbeurteilung, eine Schleife, eine Ausnahmebehandlung, eine With-Anweisung, eine Datensatztypdeklaration oder eine Klassendeklaration usw. stoßen, erhöhen Sie eine Stufe Die Deklaration wird beim Warten um eine Ebene reduziert. Zum Beispiel:
wenn TmpInt <> 100 dann
TmpInt := 100;
2.2 Beginn..Ende
Die begin-Anweisung und die end-Anweisung müssen eine Zeile im Quellprogramm belegen, zum Beispiel:
for I := 0 to 10 do begin //Falsche Verwendung
Ende;
for I := 0 to 10 do //Richtige Verwendung
beginnen
Ende;
2,3 Leerzeichen
Fügen Sie an beiden Enden von Operatoren und logischen Beurteilungssymbolen Leerzeichen hinzu, wie zum Beispiel: I := I + 1;, a und b usw., beim Hinzufügen von Klammern sind jedoch keine Leerzeichen erforderlich. Zum Beispiel: if ( a > b ) then //falsche Verwendung
Wenn (a > b) dann //Korrekte Verwendung
Ein weiteres Beispiel: PROcedure Test(Param1: integer; Param3: string);
3. Spezifikation des Object Pascal-Syntax-Schreibformats
3.1 Reservierte Wörter
Reservierte Wörter oder Schlüsselwörter in der Object Pascal-Sprache sollten ausschließlich in Kleinbuchstaben geschrieben werden.
3.2 Abläufe und Funktionen
3.2.1 Benennung und Format
Prozedur- und Funktionsnamen sollten ausschließlich aus aussagekräftigen Wörtern bestehen und der erste Buchstabe aller Wörter sollte großgeschrieben werden. Zum Beispiel:
Prozedur formatharddisk;//falsche Benennung
procedure FormatHardDisk;//Korrekte Benennung
Prozeduren und Funktionen, die den Inhalt von Variablen festlegen, sollten mit dem Präfix „Set“ versehen werden, zum Beispiel:
Prozedur SetUserName;
Prozeduren und Funktionen, die den Inhalt von Variablen lesen, sollten Get als Präfix verwenden, zum Beispiel:
Funktion GetUserName: string;
3.2.2 Parameter von Prozeduren und Funktionen
3.2.2.1 Benennung
Parameter desselben Typs werden im selben Satz geschrieben:
procedure Foo(Param1, Param2, Param3: Integer; Param4: string);
3.2.2.2 Benennung
Alle Parameter müssen aussagekräftig sein. Wenn der Parametername mit dem Namen anderer Attribute übereinstimmt, fügen Sie ein Präfix „A“ hinzu, zum Beispiel:
procedure SomeProc(AUserName: string; AUserAge: integer);
3.2.2.3 Namenskonflikt
Wenn die beiden verwendeten Einheiten eine Funktion oder Prozedur mit demselben Namen enthalten, wird beim Verweisen auf diese Funktion oder Prozedur die Funktion oder Prozedur in der später in der Use-Klausel deklarierten Einheit ausgeführt. Um diese „Uses-Klausel-Abhängigkeit“ zu vermeiden, müssen Sie bei der Referenzierung die vollständige Quelle der Funktion oder Prozedur schreiben. Zum Beispiel:
SysUtils.FindClose(SR);
Windows.FindClose(Handle);
3.3 Variablen
3.3.1 Variablenbenennung und -format
Erstens müssen alle Variablen aussagekräftige Namen haben, damit andere Teammitglieder die Bedeutung der Variablen leicht verstehen können. Bei der Benennung von Variablen können mehrere englische Wörter verwendet werden, der erste Buchstabe jedes Wortes muss jedoch groß sein. Zum Beispiel:
var
WriteFormat::string;
Gleichzeitig können für bestimmte Typen bestimmte Abkürzungen wie folgt verwendet werden:
Zeigertyp
P
Datensatztyp
Empf
Array-Typ
Arr
Art
Klasse
Schleifensteuerungsvariablen verwenden normalerweise ein einzelnes Zeichen wie i, j oder k. Es ist auch erlaubt, einen aussagekräftigen Namen wie UserIndex zu verwenden.
3.3.2 Lokale Variablen
Die Verwendung lokaler Variablen innerhalb einer Prozedur folgt den Benennungsregeln für alle anderen Variablen.
3.3.3 Globale Variablen
Versuchen Sie, keine globalen Variablen zu verwenden. Wenn Sie globale Variablen verwenden müssen, müssen Sie das Präfix „g“ hinzufügen und der Typ der Variablen sollte sich im Variablennamen widerspiegeln. Zum Beispiel:
gprecUserCount: point;//Globale Variable namens UserCount, ihr Typ ist ein Zeiger auf eine Struktur
Aber globale Variablen können innerhalb von Modulen verwendet werden. Allen globalen Variablen innerhalb des Moduls muss das Präfix „F“ vorangestellt werden. Müssen Daten zwischen mehreren Modulen ausgetauscht werden, muss dies durch die Deklaration von Attributen erfolgen. Zum Beispiel:
Typ
TFormOverdraftReturn = class(TForm)
Privat
{Private Erklärungen}
FuserName: string;
FuserCount: Ganzzahl;
Prozedur SetUserName(Value: string);
Funktion GetUserName: string;
öffentlich
{Öffentliche Erklärungen}
Eigenschaft UserName: string read GetUserName write SetUserName;
Eigenschaft UserCount: Integer read FuserCount write FuserCount;
Ende;
3.4 Typ
3.4.1 Fallprotokoll
Typnamen für reservierte Wörter müssen ausschließlich aus Kleinbuchstaben bestehen. Win32-API-Typen werden normalerweise alle groß geschrieben. Bei anderen Typen wird der erste Buchstabe groß geschrieben und die restlichen Buchstaben sind Kleinbuchstaben.
var
MyString: string; // reserviertes Word
WindowHandle: HWND; // Win32-API-Typ
I: Ganzzahl; // Typkennung in Systemeinheit eingeführt
3.4.2 Gleitkommatypen
Versuchen Sie, nicht den Typ „Real“ zu verwenden. Dies dient nur der Kompatibilität mit dem alten Pascal-Code. Versuchen Sie, den Typ „Double“ zu verwenden. Der Double-Typ ist für Prozessoren und Datenbusse optimiert und ist eine von IEEE definierte Standarddatenstruktur. Wenn der Wert den Bereich von Double überschreitet, verwenden Sie Extended. Aber Extended wird von Java nicht unterstützt. Der Single-Typ kann jedoch verwendet werden, wenn in anderen Sprachen geschriebene DLLs verwendet werden.
3.4.3 Aufzählungstypen
Der Name des Aufzählungstyps muss aussagekräftig sein und dem Typnamen muss ein „T“ vorangestellt sein. Der Name des Inhalts des Aufzählungstyps muss die Abkürzung des Aufzählungstypnamens enthalten, zum Beispiel:
TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
3.4.4 Array-Typen
Der Name des Array-Typs muss aussagekräftig sein und dem Typnamen muss ein „T“ vorangestellt sein. Wenn Sie einen Zeiger auf einen Array-Typ deklarieren, müssen Sie dem Namen des Typs ein „P“ voranstellen, zum Beispiel:
Typ
PCycleArray = ^TCycleArray;
TCycleArray = array[1..100] of integer;
3.4.5 Datensatztypen
Der Name des Datensatztyps muss aussagekräftig sein und dem Typnamen muss ein „T“ vorangestellt sein. Wenn Sie einen Zeiger auf einen Array-Typ deklarieren, müssen Sie dem Namen des Typs ein „P“ voranstellen, zum Beispiel:
Typ
PEmployee = ^TEmployee;
TEmployee=Datensatz
Mitarbeitername: Zeichenfolge
Mitarbeiterrate: Doppelt;
Ende;
Kategorie 3.5
3.5.1 Benennung und Format
Klassennamen müssen aussagekräftig sein und Typnamen müssen mit dem Präfix „T“ versehen sein. Zum Beispiel:
Typ
TCustomer = class(TObject)
Der Name einer Klasseninstanz ist normalerweise der Name der Klasse abzüglich des „T“. Zum Beispiel:
var
Kunde: TCustomer;
3.5.2 Variablen in Klassen
3.5.2.1 Benennung und Format
Klassennamen müssen aussagekräftig sein und Typnamen müssen mit dem Präfix „F“ versehen sein. Alle Variablen müssen vierdimensional sein. Wenn Sie von außen auf diese Variable zugreifen müssen, müssen Sie ein Attribut deklarieren
3.5.3 Methode
3.5.3.1 Benennung und Format
Gleiche Benennung und gleiches Format für Funktionen und Prozeduren.
3.5.3.2 Eigenschaftenzugriffsmethoden
Alle Eigenschaftenzugriffsmethoden müssen in „private“ oder „protected“ angezeigt werden. Die Benennung von Attributzugriffsmethoden ist dieselbe wie die von Funktionen und Prozeduren. Darüber hinaus muss die Lesemethode das Präfix „Get“ verwenden. Die Schreibmethode muss das Präfix „Set“ verwenden. Der Parameter der Schreibmethode muss „Value“ heißen und sein Typ muss mit der zu schreibenden Eigenschaft übereinstimmen. Zum Beispiel:
TSomeClass = class(TObject)
Privat
fsomeField: Integer;
geschützt
Funktion GetSomeField: Integer;
procedure SetSomeField( Value: Integer);
öffentlich
Eigenschaft SomeField: Integer read GetSomeField write SetSomeField;
Ende;
3.6 Eigenschaften
3.6.1 Benennung und Format
Stimmt mit dem Namen der Klassenvariablen mit dem Präfix „F“ überein, mit der sie operiert.
3.7 Dokumentation
3.7.1 Projektdateien
3.7.1.1 Projektverzeichnisstruktur
Programm-Home-Verzeichnis – Bin (der Pfad, in dem sich die Anwendung befindet)
-Db (Pfad zur lokalen Datenbank)
-Doc (Pfad, in dem sich das Dokument befindet)
-Hlp (Pfad zur Hilfedatei)
-Backup (Sicherungspfad)
-Tmp (temporärer Dateipfad)
3.7.1.2 Benennung
Die Projektdatei muss einen aussagekräftigen Namen haben. Beispiel: Die Projektdatei mit Systeminformationen in Delphi heißt SysInfo.dpr.
3.7.2 Formulardatei
3.7.2.1 Benennung
Stimmt mit dem Namen des Formulars überein: Beispiel: Wenn der Name des Formulars FormMain lautet, lautet der Name der Formulardatei FormMain.frm.
3.7.3 Datenmoduldatei
3.7.3.1 Benennung
Datenmoduldateien sollten aussagekräftig benannt und mit dem Präfix „DM“ versehen werden. Beispiel: Das Benutzerdatenmodul heißt „DMCustomers.dfm“.
3.7.4 Dateien des Remote-Datenmoduls
3.7.4.1 Benennung
Die Remote-Datenmoduldatei sollte einen aussagekräftigen Namen haben und „RDM“ als Präfix verwenden. Beispiel: Das Remote-Datenmodul des Benutzers heißt „RDMCustomers.dfm“.
3.7.5 Unit-Datei
3.7.5.1 Gewöhnliche Einheit
3.7.5.1.1 Benennung von Unit-Dateien
Unit-Dateien sollten aussagekräftig benannt werden und „unit“ als Präfix verwenden. Beispiel: Eine allgemeine Einheit heißt „UnitGeneral“.
3.7.5.2 Einheiten bilden
3.7.5.2.1 Benennung
Der Name der Formulareinheitsdatei muss mit dem Namen des Formulars übereinstimmen. Beispiel: Wenn das Hauptformular FormMain.pas heißt, lautet der Name der Formulareinheitsdatei: UnitFormMain.
3.7.5.3 Datenmoduleinheiten
3.7.5.3.1 Benennung
Der Name der Datenmodul-Einheitsdatei muss mit dem Namen des Datenmoduls übereinstimmen. Beispiel: Wenn das Hauptdatenmodul DMMain.pas heißt, lautet der Name der Datenmodul-Unit-Datei: UnitDMMain.
3.7.5.4 Dateikopf
Der Zweck, der Autor, das Datum sowie die Ein- und Ausgabe der Datei sollten an der Spitze aller Dateien stehen. Zum Beispiel:
{
Änderungsdatum:
Autor:
verwenden:
Der Aufbau dieses Moduls besteht aus:
}
3.7.6 Formulare und Datenmodulformulare
3.7.6.1 Formularklasse
1. Bilden Sie Standards für die Benennung von Klassen
Formularklassen sollten aussagekräftig benannt und mit dem Präfix „TForm“ versehen werden. Beispiel: Der Name der About Form-Klasse lautet:
TAboutForm = class(TForm)
Der Name des Hauptformulars ist
TMainForm = Klasse(TForm)
2. Benennungsstandards für Form-Klasseninstanzen
Der Name der Form-Klasseninstanz sollte mit dem Namen der Form-Klasse übereinstimmen, wobei das „T“ entfernt wurde. Zum Beispiel:
Geben Sie den Namen ein
Instanzname
AboutForm
AboutForm
TmainForm
Hauptform
TCustomerEntryForm
CustomerEntryForm
3.7.6.2 Formular „Datenmodule“.
3.7.6.2.1. Benennungsstandard für Datenmodulformulare
Datenmodul-Formularklassen sollten aussagekräftig benannt werden und „TDM“ als Präfix verwenden. Zum Beispiel:
TDMCustomer = class(TDataModule)
TDMOrders = class(TDataModule)
3.7.6.2.2. Benennungsstandards für Datenmodulinstanzen
Der Name der Instanz der Data Module Form-Klasse sollte mit dem Namen der Data Module Form-Klasse übereinstimmen, wobei das „T“ weggelassen wird. Zum Beispiel:
Geben Sie den Namen ein
Instanzname
TCustomerDataModule
CustomerDataModule
TordersDataModule
OrdersDataModule
3.8 Kontrollen
3.8.1 Benennung von Kontrollinstanzen
Instanzen eines Steuerelements sollten den Namen der Steuerelementklasse ohne das „T“ voranstellen, zum Beispiel:
Der Name von Tedit, in dem der Benutzername eingegeben wird, lautet: EditUserName.
3.8.2 Abkürzung für Kontrolle
Die folgenden Abkürzungen können für den Namen des Steuerelements verwendet werden, die verwendete Abkürzung wird jedoch mit „_“ zwischen den Steuerelementnamen hinzugefügt:
3.8.2.1 Standard-Tab
mm TMainMenu
pm TPopupMenu
mmiTMainMenuItem
pmiTPopupMenuItem
lblTLabel
edt TEdit
mem TMemo
btn TButton
cb TCheckBox
rb TRadioButton
lb TListBox
cb TComboBox
scbTScrollBar
gb TGroupBox
rg TRadioGroup
pnlTPanel
cl TCommandList
3.8.2.2 Zusätzliche Registerkarten
bbtn TBitBtn
sbTSpeedButton
ich TMaskEdit
sg TStringGrid
dgTDrawGrid
imgTImage
shp TShape
bvl
sbxTScrollBox
clb TCheckListbox
spl TSplitter
stx TStaticText
cht TChart
3.8.2.3 Win32-Registerkarte
tbcTTabControl
pgcTPageControl
ilTImageList
zu TRichEdit
tbr TTrackBar
prb TProgressBar
ud TUpDown
hk THotKey
ani TAnimate
dtpTDateTimePicker
tvTTreeView
lv TListView
hdrTHeaderControl
stb TStatusBar
tlb TToolBar
clbTCoolBar
3.8.2.4 Registerkarte „System“.
tm TTimer
pb TPaintBox
mpTMediaPlayer
olec TOleContainer
ddccTDDEClientConv
ddciTDDEClientItem
ddscTDDEServerConv
ddsiTDDEServerItem
3.8.2.5 Registerkarte „Internet“.
cskTClientSocket
sskTServerSocket
wbd TWebDispatcher
pp TPageProducer
tp TQueryTableProducer
dstp TDataSetTableProducer
nmdt TNMDayTime
ang TNMEcho
nf TNMFinger
nftpTNMFtp
nhttpTNMHttp
nMsg TNMMsg
nmsgTNMMSGServ
nntp TNMNNTP
npop TNMPop3
nuup TNMUUPProcessor
smtp TNMSMTP
nst TNMStrm
nsts TNMStrmServ
ntm TNMTime
nudpTNMUdp
psk TPowerSock
ngs TNMGeneralServer
htmlTHtml
URLTNMUrl
smlTSimpleMail
3.8.2.6 Datenzugriff Tab
dsTDataSource
tbl TTable
qry TQuery
spTStoredProc
dbTDataBase
ssn Tsession
bmTBatchMove
usql TUpdateSQL
3.8.2.7 Registerkarte „Datenkontrollen“.
dbgTDBGrid
dbn TDBNavigator
dbtTDBText
dbeTDBEdit
dbm TDBMemo
dbiTDBImage
dblb TDBListBox
dbcb TDBComboBox
dbch TDBCheckBox
dbrg TDBRadioGroup
dbll TDBLookupListBox
dblc TDBLookupComboBox
dbreTDBRichEdit
dbcgTDBCtrlGrid
dbchTDDBChart
3.8.2.8 Registerkarte „Entscheidungswürfel“.
dcb TDecisionCube
dcq TDecisionQuery
dcs TDecisionSource
dcp TDecisionPivot
dcg TDecisionGrid
dcgr TDecisionGraph
3.8.2.9 QReport-Registerkarte
qr TQuickReport
qrsd TQRSubDetail
qrb TQRBand
qrcb TQRChildBand
qrg TQRGroup
qrl TQRLabel
qrtTQRText
qre TQRExpr
qrs TQRSysData
qrm TQRMemo
qrrt TQRRichText
qrdr TQRDBRichText
qrsh TQRShape
qri TQRImage
qrdi TQRDBMImage
qrcr TQRCompositeReport
qrp TQRPreview
qrch TQRChart
3.8.2.10 Registerkarte „Dialoge“.
OpenDialog TOpenDialog
SaveDialog TSaveDialog
OpenPictureDialog TOpenPictureDialog
SavePictureDialog TSavePictureDialog
FontDialog TFontDialog
ColorDialog TColorDialog
PrintDialog TPrintDialog
PrinterSetupDialog TPrintSetupDialog
FindDialog TFindDialog
ErsetzenDialog TReplaceDialog
3.8.2.11 Win31-Registerkarte
dbll TDBLookupList
dblc TDBLookupCombo
tsTTabSet
ol TOutline
tnb TTabbedNoteBook
Hinweis: TNoteBook
hdrTHeader
flbTFileListBox
dlb TDirectoryListBox
dcb TDriveComboBox
fcb TFilterComboBox
3.8.2.12 Registerkarte „Beispiele“.
gg TGauge
cg TColorGrid
spb TSpinButton
speTSpinEdit
dol TDirectoryOutline
calTCalendar
ibea TIBEventAlerter
3.8.2.13 ActiveX-Registerkarte
cfx TChartFX
vspTVSSpell
f1bTF1Book
vtc TVTCart
grp TGraph
3.8.2.14 Midas-Tab
prvTProvider
cdsTClientDataSet
qcds TQueryClientDataSet
dcomTDCOMConnection
oleeTOleEnterpriseConnection
sckTSocketConnection
rms TRemoteServer
Mitte TmidasConnection
4. Spezifikationen ändern
Die Bestimmungen dieser Regel gelten nur für Programme, die in das Konfigurationsmanagement einbezogen wurden. Bei dieser Art von Änderung ist es erforderlich, den Inhalt vor der Änderung beizubehalten und den geänderten und neuen Inhalt zu identifizieren. Fügen Sie dem Dateikopf die erforderlichen Informationen wie Modifikator, Änderungsdatum, Änderungsbeschreibung usw. hinzu.
4.1 Verlaufsdatensätze ändern
Wenn genehmigte Änderungen an einer Quelldatei vorgenommen werden, sollte der Modifikator ein Änderungsverlaufselement zum Programmdatei-Header hinzufügen. Für jede weitere Änderung muss der Modifikator die folgenden Informationen in das Element eintragen:
Modifikator
Änderungszeit
Grund für die Änderung
In den Änderungsanweisungen erfahren Sie, wie Sie Änderungen vornehmen
4.2 Neue Codezeilen hinzufügen
Neuen Codezeilen sollten Kommentarzeilen vorangestellt und gefolgt werden.
// Modifikator, Änderungszeit, Änderungsbeschreibung
Fügen Sie eine neue Codezeile hinzu
// Ende der Änderung
4.3 Codezeilen löschen
Verwenden Sie Kommentarzeilen vor und nach dem Löschen von Codezeilen.
//Modifikator, Änderungszeit, Änderungsbeschreibung
//Zu löschende Codezeile (kommentieren Sie die zu löschende Anweisung)
//Ende der Änderung
4.4 Codezeilen ändern
Ändern Sie die Codezeile, indem Sie die Codezeile löschen und dann eine neue Codezeile hinzufügen.
//Modifikator, Änderungszeit, Änderungsbeschreibung
//Codezeile vor der Änderung
//Ende der Änderung
//Geänderte Codezeile
Geänderte Codezeile
//Ende der Änderung