1. Introdução às especificações
Esta especificação estipula principalmente as regras e precauções que devem ser seguidas durante o processo de escrita de programas fonte Delphi. O objetivo de escrever esta especificação é tornar consistentes os hábitos de escrita de código-fonte dos desenvolvedores de software da empresa. Isso permite que cada membro da equipe entenda o código dos demais membros da equipe, o que facilita a manutenção do sistema secundário de memória de desenvolvimento do código-fonte.
2. Especificações gerais de formato
2.1 Recuo
O recuo são dois espaços expostos para aumentar a legibilidade quando o nível do programa de origem muda. A regra de recuo é de dois espaços por nível. Guia não é permitida. Porque Tab produzirá efeitos diferentes devido às diferentes configurações feitas pelo usuário. Ao encontrar julgamento de início ou entrada, loop, tratamento de exceção, instrução with, declaração de tipo de registro, declaração de classe, etc., aumente um nível Ao encontrar julgamento final ou de saída, loop, tratamento de exceção, instrução with, declaração de tipo de registro, A classe. a declaração é reduzida em um nível durante a espera. Por exemplo:
se TmpInt <> 100 então
TmpInt := 100;
2.2 Início..Fim
A instrução inicial e a instrução final devem ocupar uma linha no programa fonte, por exemplo:
for I := 0 a 10 do start //Uso incorreto
fim;
for I := 0 a 10 do //Uso correto
começar
fim;
2,3 espaços
Adicione espaços em ambas as extremidades dos operadores e símbolos de julgamento lógico, como: I := I + 1;, aeb, etc., mas nenhum espaço é necessário ao adicionar parênteses. Por exemplo: if ( a > b ) then //uso errado
Se (a > b) então //Uso correto
Outro exemplo: PRocedure Test(Param1: inteiro; Param3: string);
3. Especificação do formato de escrita da sintaxe Object Pascal
3.1 Palavras reservadas
Palavras ou palavras-chave reservadas na linguagem Object Pascal devem ser escritas em letras minúsculas.
3.2 Procedimentos e funções
3.2.1 Nomenclatura e formato
Os nomes de procedimentos e funções devem consistir em todas as palavras significativas e a primeira letra de todas as palavras deve ser maiúscula. Por exemplo:
formato do procedimentoharddisk;//nome incorreto
procedimento FormatHardDisk;//Nomeação correta
Procedimentos e funções que definem o conteúdo das variáveis devem ser prefixados com Set, por exemplo:
procedimento SetUserName;
Procedimentos e funções que leem o conteúdo de variáveis devem usar Get como prefixo, por exemplo:
função GetUserName: string;
3.2.2 Parâmetros de procedimentos e funções
3.2.2.1 Nomenclatura
Parâmetros do mesmo tipo são escritos na mesma frase:
procedimento Foo (Param1, Param2, Param3: Inteiro; Param4: string);
3.2.2.2 Nomenclatura
Todos os parâmetros devem ser significativos e quando o nome do parâmetro for igual ao nome de outros atributos, adicione um prefixo 'A', por exemplo:
procedimento SomeProc(AUserName: string; AUserAge: inteiro);
3.2.2.3 Conflito de nomenclatura
Quando duas unidades usadas incluem uma função ou procedimento com o mesmo nome, quando você faz referência a essa função ou procedimento, a função ou procedimento na unidade declarada posteriormente na cláusula use será executada. Para evitar essa 'dependência de cláusula de uso', você precisa escrever a fonte completa da função ou procedimento ao referenciá-la. Por exemplo:
SysUtils.FindClose(SR);
Windows.FindClose(Alça);
3.3 Variáveis
3.3.1 Nomeação e formato de variáveis
Primeiro, todas as variáveis devem ter nomes significativos para que outros membros da equipe possam entender facilmente o significado das variáveis. A nomenclatura das variáveis pode usar nomes em inglês sinônimos. Várias palavras em inglês podem ser usadas, mas a primeira letra de cada palavra deve ser maiúscula. Por exemplo:
var
WriteFormat::string;
Ao mesmo tempo, certas abreviaturas podem ser usadas para alguns tipos específicos, como segue:
tipo de ponteiro
P
tipo de registro
Rec.
tipo de matriz
Arr
tipo
Aula
Variáveis de controle de loop geralmente usam um único caractere, como: i, j ou k. Também é permitido usar um nome significativo como UserIndex.
3.3.2 Variáveis locais
O uso de variáveis locais em um procedimento segue as regras de nomenclatura para todas as outras variáveis.
3.3.3 Variáveis globais
Tente não usar variáveis globais. Se você precisar usar variáveis globais, deverá adicionar o prefixo 'g' e o tipo da variável deverá ser refletido no nome da variável. Por exemplo:
gprecUserCount: point;//Variável global chamada UserCount, seu tipo é um ponteiro para uma estrutura
Mas variáveis globais podem ser usadas dentro de módulos. Todas as variáveis globais dentro do módulo devem ser prefixadas com 'F'. Se for necessário trocar dados entre vários módulos, isso deverá ser conseguido através da declaração de atributos. Por exemplo:
tipo
TFormOverdraftReturn = class(TForm)
privado
{Declarações privadas}
NomeFuser: string;
Contagem de fusores: inteiro;
Procedimento SetUserName(Valor: string);
Função GetUserName: string;
público
{Declarações públicas}
propriedade UserName: string lida GetUserName escreve SetUserName;
propriedade UserCount: leitura inteira FuserCount gravação FuserCount;
fim;
3.4 Tipo
3.4.1 Protocolo do caso
Os nomes de tipo para palavras reservadas devem estar todos em letras minúsculas. Os tipos de API Win32 geralmente são todos maiúsculos. Para outros tipos, a primeira letra é maiúscula e as letras restantes são minúsculas.
var
MinhaString: string; // Palavra reservada
WindowHandle: HWND; // Tipo de API Win32
I: Integer; // identificador de tipo introduzido na unidade do sistema
3.4.2 Tipos de ponto flutuante
Tente não usar o tipo Real. É apenas para compatibilidade com o antigo código Pascal. O tipo Double é otimizado para processadores e barramentos de dados e é uma estrutura de dados padrão definida pelo IEEE. Quando o valor exceder o intervalo Double, use Extended. Mas Extended não é compatível com Java. No entanto, o tipo Single pode ser usado ao usar DLLs escritas em outras linguagens.
3.4.3 Tipos de enumeração
O nome do tipo de enumeração deve ser significativo e o nome do tipo deve ser prefixado com 'T'. O nome do conteúdo do tipo de enumeração deve conter a abreviatura do nome do tipo de enumeração, por exemplo:
TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
3.4.4 Tipos de array
O nome do tipo de array deve ser significativo e o nome do tipo deve ser prefixado com 'T'. Se você declarar um ponteiro para um tipo de array você deve prefixar o nome do tipo com 'P', por exemplo:
tipo
PCycleArray = ^TCycleArray;
TCycleArray = array[1..100] de inteiro;
3.4.5 Tipos de registros
O nome do tipo de registro deve ser significativo e o nome do tipo deve ser prefixado com 'T'. Se você declarar um ponteiro para um tipo de array você deve prefixar o nome do tipo com 'P', por exemplo:
tipo
PEFuncionário = ^TEFuncionário;
TEFuncionário=registro
NomeDoFuncionário: string
Taxa de Funcionário: Duplo;
fim;
Categoria 3.5
3.5.1 Nomenclatura e formato
Os nomes das classes devem ser significativos e os nomes dos tipos devem ser prefixados com 'T'. Por exemplo:
tipo
TCliente = classe(TObject)
O nome de uma instância de classe geralmente é o nome da classe menos o 'T'. Por exemplo:
var
Cliente: TCliente;
3.5.2 Variáveis nas classes
3.5.2.1 Nomenclatura e formato
Os nomes das classes devem ser significativos e os nomes dos tipos devem ser prefixados com 'F'. Todas as variáveis devem ser quadridimensionais. Se você precisar acessar esta variável de fora, você precisa declarar um atributo
3.5.3 Método
3.5.3.1 Nomenclatura e formato
Mesma nomenclatura e formato para funções e procedimentos.
3.5.3.2 Métodos de acesso à propriedade
Todos os métodos de acesso à propriedade devem aparecer em privado ou protegido. A nomenclatura dos métodos de acesso aos atributos é a mesma das funções e procedimentos. Além disso, o método leitor deve usar o prefixo 'Get'. O método escritor deve usar o prefixo 'Set'. O parâmetro do método write deve ser denominado 'Valor', e seu tipo deve ser consistente com a propriedade a ser escrita. Por exemplo:
TSomeClass = classe(TObject)
privado
fsomeField: Inteiro;
protegido
função GetSomeField: Inteiro;
procedimento SetSomeField(Valor: Inteiro);
público
propriedade SomeField: Integer read GetSomeField write SetSomeField;
fim;
3.6 Propriedades
3.6.1 Nomenclatura e formato
Consistente com o nome da variável de classe prefixada com 'F' na qual ela é usada para operar.
3.7 Documentação
3.7.1 Arquivos de projeto
3.7.1.1 Estrutura de diretórios do projeto
Diretório inicial do programa - Bin (o caminho onde o aplicativo está localizado)
-Db (caminho para o banco de dados local)
-Doc (caminho onde o documento está localizado)
-Hlp (caminho para o arquivo de ajuda)
-Backup (caminho de backup)
-Tmp (caminho do arquivo temporário)
3.7.1.2 Nomenclatura
O arquivo do projeto deve ter um nome significativo. Por exemplo: O arquivo de projeto para informações do sistema em Delphi é denominado SysInfo.dpr.
3.7.2 Arquivo de formulário
3.7.2.1 Nomenclatura
Consistente com o nome do Formulário: Por exemplo: se o nome do Formulário for FormMain, o nome do arquivo Form será FormMain.frm.
3.7.3 Arquivo do Módulo de Dados
3.7.3.1 Nomenclatura
Os arquivos do módulo de dados devem ser nomeados de forma significativa e prefixados com 'DM'. Por exemplo: O módulo de dados do usuário é denominado 'DMCustomers.dfm'.
3.7.4 Arquivos do Módulo de Dados Remotos
3.7.4.1 Nomenclatura
O arquivo do módulo de dados remoto deve ter um nome significativo e usar 'RDM' como prefixo. Por exemplo: o módulo de dados remoto do usuário é denominado 'RDMCustomers.dfm'.
3.7.5 Arquivo de unidade
3.7.5.1 Unidade Ordinária
3.7.5.1.1 Nomenclatura de arquivos de unidade
Os arquivos de unidade devem ser nomeados de forma significativa e usar 'unidade' como prefixo. Por exemplo: Uma unidade geral é denominada 'UnitGeneral'.
3.7.5.2 Unidades de formulário
3.7.5.2.1 Nomenclatura
O nome do arquivo da unidade do Formulário deve ser consistente com o nome do Formulário. Por exemplo: se o formulário principal se chama FormMain.pas, então o nome do arquivo Form Unit é: UnitFormMain.
3.7.5.3 Unidades do Módulo de Dados
3.7.5.3.1 Nomenclatura
O nome do arquivo da unidade do Data Module deve ser consistente com o nome do Data Module. Por exemplo: se o Módulo de Dados principal for chamado DMMain.pas, então o nome do arquivo da Unidade do Módulo de Dados será: UnitDMMain.
3.7.5.4 Cabeçalho do arquivo
A finalidade, autor, data, entrada e saída do arquivo devem ser escritas no cabeçalho de todos os arquivos. Por exemplo:
{
Data de modificação:
autor:
usar:
A estrutura deste módulo consiste em:
}
3.7.6 Formulários e Módulos de Dados Formulários
3.7.6.1 Classe de formulário
1. Forme padrões de nomenclatura de classe
As classes de formulários devem ser nomeadas de forma significativa e prefixadas com 'TForm'. Por exemplo: O nome da classe About Form é:
TAsobreForm = classe(TForm)
O nome do formulário principal é
TMainForm = classe(TForm)
2. Padrões de nomenclatura para instâncias de classe Form
O nome da instância da classe Form deve ser consistente com o nome da classe Form com o 'T' removido. Por exemplo:
Nome do tipo
Nome da instância
SobreFormulário
SobreFormulário
TmainForm
Formulário Principal
TCustomerEntryForm
Formulário de entrada do cliente
3.7.6.2 Formulário de Módulos de Dados
3.7.6.2.1 Padrão de nomenclatura de formulário de módulo de dados.
Módulos de dados As classes de formulários devem ser nomeadas de forma significativa e usar 'TDM' como prefixo. Por exemplo:
TDMCustomer = classe(TDataModule)
PedidosTDMS = classe(TDataModule)
3.7.6.2.2 Padrões de nomenclatura de instâncias do Módulo de Dados.
O nome da instância da classe Data Module Form deve ser consistente com o nome da classe Data Module Form com o 'T' omitido. Por exemplo:
Nome do tipo
Nome da instância
TCustomerDataModule
Módulo de dados do cliente
TordersDataModule
Módulo de dados de pedidos
3.8 Controles
3.8.1 Nomenclatura de instâncias de controle
As instâncias de um controle devem ser prefixadas com o nome da classe de controle menos o 'T', por exemplo:
O nome do Tedit onde o nome de usuário é inserido é: EditUserName.
3.8.2 Abreviatura de controle
As seguintes abreviações podem ser usadas para o nome do controle, mas a abreviatura usada é adicionada com '_' entre os nomes dos controles:
3.8.2.1 Guia Padrão
mm TPrincipalMenu
pm TPopupMenu
mmiTMainMenuItem
pmiTPopupMenuItem
lblTLabel
edt T
mem TMemo
btn TButton
cb TCheckBox
rb TRadioButton
lb TListBox
cb TComboBox
scbTScrollBar
gb TGroupBox
rg TRadioGroup
pnlTPanel
cl TCommandList
3.8.2.2 Guias Adicionais
bbtn TBitBtn
sbTSpeedButton
eu TMask
sg TStringGrid
dgTDrawGrid
imgTImage
shp TShape
bvl
sbxTScrollBox
clb TCheckListbox
spl TSplitter
stx TStaticText
cht TChart
3.8.2.3 Guia Win32
tbcTTabControl
pgcTPageControl
ilTImageList
re TRich
tbr TTrackBar
prb TProgressBar
ud TUpDown
hk THotKey
ani TAnimate
dtpTDateTimePicker
tvTTreeView
lv TListView
hdrTHeaderControl
stb TStatusBar
tlb TToolBar
clbTCoolBar
3.8.2.4 Guia Sistema
tm TTimer
pb TPaintBox
mpTMediaPlayer
olec TOleContainer
ddccTDDEClientConv
ddciTDDEClientItem
ddscTDDEServerConv
ddsiTDDEServerItem
3.8.2.5 Guia Internet
cskTClientSocket
sskTServerSocket
wbdTWebDispatcher
pp TPageProdutor
tpTQueryTableProdutor
dstp TDataSetTableProducer
nmdt TNMDayTime
ne 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 Guia Acesso a dados
dsTDataSource
tbl TTable
qryTQuery
spTStoredProc
dbTDataBase
sessão ssn
bmTBatchMove
usql TUpdateSQL
3.8.2.7 Guia Controles de Dados
dbgTDBGrid
dbn TDBNavigator
dbtTDBText
dbeTDB
dbm TDBMemo
dbiTDBImage
dblb TDBListBox
dbcb TDBComboBox
dbch TDBCheckBox
dbrg TDBRadioGroup
dbll TDBLookupListBox
dblc TDBLookupComboBox
dbreTDBRich
dbcgTDBCtrlGrid
dbchTDDBChart
3.8.2.8 Guia Cubo de Decisão
dcb TDecisionCube
dcq TDecisionQuery
dcs TDecisionSource
dcp TDecisionPivot
dcg TDecisionGrid
dcgr TDecisionGraph
3.8.2.9 Guia QReport
qr TQuickReport
qrsd TQRSubDetail
qrb TQRBand
qrcb TQRChildBand
qrg Grupo TQRG
qrl TQRLabel
qrtTQRTexto
qre TQRExpr
qrs TQRSysData
qrm TQRMemo
qrrt TQRRichText
qrdr TQRDBRichText
qrsh TQRShape
qri TQRImage
qrdi TQRDBMImage
qrcr TQRCompositeReport
qrp TQRPrevisão
qrch Gráfico TQRC
3.8.2.10 Guia Diálogos
OpenDialog TOpenDialog
SalvarDialog TSaveDialog
OpenPictureDialog TOpenPictureDialog
SalvarPictureDialog TSavePictureDialog
FontDialog TFontDialog
ColorDialogTColorDialog
PrintDialog TPrintDialog
PrinterSetupDialog TPrintSetupDialog
FindDialog TFindDialog
SubstituaDialog TReplaceDialog
3.8.2.11 Guia Win31
dbll TDBLookupList
dblc TDBLookupCombo
tsTTabSet
ol TOutline
tnb TTabbedNoteBook
nb TNoteBook
hdrTHeader
flbTFileListBox
dlb TDirectoryListBox
dcb TDriveComboBox
fcb TFilterComboBox
3.8.2.12 Guia Amostras
gg TGauge
cg TColorGrid
spb TSpinButton
speTSpin
dol TDirectoryOutline
calTCalendar
ibea TIBEventAlerter
3.8.2.13 Guia ActiveX
cfxTChartFX
vspTVSSpell
f1bTF1Livro
vtc TVTChart
grp TGraph
3.8.2.14 Aba Midas
prvTProvider
cdsTClientDataSet
qcdsTQueryClientDataSet
dcomTDCOMConexão
oleeTOleEnterpriseConnection
sckTSocketConnection
rms TRemoteServer
meio TmidasConnection
4. Modificar especificações
As disposições desta regra aplicam-se apenas a programas que foram incluídos no gerenciamento de configuração. Neste tipo de modificação, é necessário reter o conteúdo antes da modificação e identificar o conteúdo modificado e o novo. E adicione as informações necessárias, como modificador, data de modificação, descrição da modificação, etc., ao cabeçalho do arquivo.
4.1 Modificar registros históricos
Ao fazer modificações aprovadas em um arquivo de origem, o modificador deve adicionar um item do histórico de modificações ao cabeçalho do arquivo de programa. Para cada modificação subsequente, o modificador deverá preencher as seguintes informações no item:
Modificador
hora da modificação
Motivo da modificação
As instruções de modificação são como modificar
4.2 Adicione novas linhas de código
Novas linhas de código devem ser precedidas e seguidas por linhas de comentários.
// Modificador, hora da modificação, descrição da modificação
Adicione nova linha de código
//Fim da modificação
4.3 Excluir linhas de código
Use linhas de comentários antes e depois de excluir linhas de código.
//Modificador, hora da modificação, descrição da modificação
//Linha de código a ser excluída (comente a instrução a ser excluída)
//Fim da modificação
4.4 Modifique linhas de código
Modifique a linha de código excluindo a linha de código e adicionando uma nova linha de código.
//Modificador, hora da modificação, descrição da modificação
//Linha de código antes da modificação
//Fim da modificação
//Linha de código modificada
Linha de código modificada
//Fim da modificação