Procedimentos e Funções 1. Nomenclatura e Formato (1) Os nomes dos procedimentos devem começar com uma letra maiúscula e as letras maiúsculas e minúsculas devem ser escalonadas para aumentar a legibilidade. A seguir está uma maneira incorreta de escrever: PRocedure thisisapoorlyformattedroutinename; altere-o para isto: procedure ThisIsMuchMoreReadableRoutineName (2) O nome do processo deve ser significativo. Uma rotina que executa uma ação é melhor prefixada ao seu nome com o verbo que representa a ação. Por exemplo: procedure FormatHardDrive; O nome da rotina que define o valor do parâmetro de entrada deve ser prefixado com Set, por exemplo: procedure SetUserName; O nome da rotina que obtém o valor deve ser prefixado com Get, por exemplo: function GetUserName: string 2. Parâmetros formais (1) Formato: Sempre que possível, os parâmetros formais do mesmo tipo devem ser agrupados. Por exemplo: procedimento ProcedureName (Param1, Param2, Param3: Integer; Param4: string); (2) Nomenclatura: Os nomes de todos os parâmetros formais devem expressar sua finalidade; Se apropriado, os nomes formais dos parâmetros devem ser prefixados com a letra A. Por exemplo: procedimento ProcedureName (AUserName: string; AUserAge: inteiro); Quando o nome do parâmetro tiver o mesmo nome de um atributo de classe ou campo, o prefixo A é necessário. (3) Ordem dos parâmetros: A ordem dos parâmetros formais depende principalmente das regras de chamada de registro. O parâmetro mais comumente utilizado deve ser o primeiro parâmetro, organizado da esquerda para a direita em ordem de frequência de uso. Os parâmetros de entrada precedem os parâmetros de saída. Parâmetros com intervalo grande devem ser colocados antes dos parâmetros com intervalo pequeno. Por exemplo: procedimento ProcedureName (APlanet, AContinent, ACountry, AState, ACity Alguns são exceções). Por exemplo: Durante o processamento de eventos, o parâmetro Sender do tipo TObject geralmente é o primeiro parâmetro a ser passado. (4) Parâmetros constantes: Para evitar que parâmetros de registro, array, string curta ou tipo de interface sejam modificados pela rotina, os parâmetros formais devem ser marcados como Const. Desta forma, o compilador irá gerar o código da forma mais eficiente, garantindo que os parâmetros passados sejam imutáveis. Se não se espera que outros tipos de parâmetros sejam modificados pela rotina, eles também podem ser marcados com C onst. Embora isso não tenha impacto na eficiência, fornece mais informações ao chamador da rotina. (5) Conflito de nomenclatura: Quando duas unidades contêm rotinas com o mesmo nome, se a rotina for chamada, a rotina da unidade que aparece posteriormente na cláusula Uses é na verdade chamada. Para evitar esta situação, você pode adicionar o nome da unidade desejada antes do nome do método, por exemplo: SysUtils.FindClose (SR);Windows.FindClose(Handle);3. Variáveis (1) Nomeação e formato das variáveis: O nome de uma variável deve ser capaz de expressar a sua finalidade. Variáveis de controle de loop geralmente são letras únicas, como I, J ou K. Você também pode usar um nome mais significativo, como UserIndex. Os nomes de variáveis booleanas devem indicar claramente o significado dos valores True e False. (2) Variáveis locais: Variáveis locais são usadas dentro de rotinas e seguem as regras de nomenclatura de outras variáveis. Se necessário, as variáveis deverão ser inicializadas imediatamente na entrada da rotina. As variáveis locais do tipo AnsiString são inicializadas automaticamente para strings vazias da interface local e as variáveis do tipo dispinterface são automaticamente inicializadas para nil; as variáveis locais do tipo Variant e OleVariant são automaticamente inicializadas para Unassigned. (3) Variáveis globais: O uso de variáveis globais é geralmente desencorajado. No entanto, às vezes é necessário. Mesmo assim, as variáveis globais devem ser restritas aos ambientes onde são necessárias. Variáveis globais podem ser globais apenas na parte de implementação dos dados globais, se forem usados por muitas unidades, devem ser movidos para uma unidade comum e usados por todos os objetos globais podem ser inicializados diretamente com um valor quando declarados; . (Observe que todas as variáveis globais são automaticamente inicializadas com zero, portanto, não inicialize variáveis globais com valores nulos, como 0, nil ou Não atribuído. Variáveis globais inicializadas com zero não ocupam espaço no arquivo .EXE. Inicializadas com zero os dados são salvos no segmento de dados virtuais, o segmento de dados virtuais aloca memória apenas quando o aplicativo é iniciado. Dados globais inicializados diferentes de zero ocupam espaço no arquivo . Regras de maiúsculas e minúsculas de tipo (1): identificadores de tipo são palavras reservadas e devem estar todos em letras minúsculas. Os tipos de API Win32 geralmente são todos em letras maiúsculas e seguem regras para nomes de tipos específicos, como Windows.pas ou outras unidades de API. Para outros nomes de variáveis, a primeira letra deve ser maiúscula e as demais letras devem ser alternadas. Por exemplo: varMyString: string; // Palavra reservada WindowsHandle: HWND; // API Win32 tipo I: Integer; // Identificador de tipo introduzido na unidade do sistema (2) Tipo de ponto flutuante: O uso do tipo Real é desencorajado porque é apenas Reservado para compatibilidade com código Pascal mais antigo. Normalmente, Double deve ser usado para números de ponto flutuante. Double pode ser otimizado pelo processador e é um formato de dados padrão definido pelo IEEE. Extend pode ser usado quando um intervalo maior do que o Double fornece é necessário. Extend é um tipo específico da Intel e não é compatível com Java. Quando o número físico de bytes da variável de ponto flutuante for importante (talvez usando uma linguagem diferente para escrever a DLL), Single deverá ser usado. (3) Tipo de enumeração: O nome do tipo de enumeração deve representar o propósito da enumeração. O caractere T deve ser prefixado antes do nome para indicar que este é um tipo de dados. O prefixo da lista de identificadores do tipo enumeração deve conter de 2 a 3 caracteres minúsculos para serem associados entre si. Por exemplo: TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB); O nome da instância da variável do tipo de enumeração é igual ao tipo, mas sem o prefixo T. Você também pode dar um valor maior à variável. nome especial, como: FavoriteSongTpe1, FavoriteSongTpe2, etc. (4)Variant e OleVariant: Geralmente não é recomendado usar Variant e OleVariant. Entretanto, esses dois tipos são necessários para programação quando o tipo de dados é conhecido apenas em tempo de execução (geralmente em aplicativos COM e de banco de dados). Ao fazer programação COM, como automatizar controles ActiveX, você deve usar OleVariant; para programação não COM, você deve usar Variant; Isso ocorre porque o Variant pode salvar efetivamente as strings nativas do Delphi, enquanto o OleVariant converte todas as strings em strings OLE (ou seja, strings Wide Char) sem contagem de referência. 5. Tipo construído (1) Tipo array: O nome do tipo array deve expressar a finalidade do array. Os nomes dos tipos devem ser prefixados com a letra T. Se você deseja declarar um ponteiro para um tipo de array, você deve prefixá-lo com a letra P e declará-lo antes da declaração do tipo. Por exemplo: typePCycleArray = ^TCycleArray; TCycleArray=array [1..100] de número inteiro Na verdade, a instância da variável do tipo array tem o mesmo nome do tipo, mas sem o prefixo T; (2) Tipo de registro: O nome do tipo de registro deve expressar a finalidade do registro. Os nomes dos tipos devem ser prefixados com a letra T. Se quiser declarar um ponteiro para um tipo de registro, você deve prefixá-lo com a letra P e declará-lo antes da declaração do tipo. Por exemplo: typePStudent = ^ TStudent;TStudent = recordStudentName: string;StudentAge: Double;6. Classes (1) Nomenclatura e Formato O nome de uma classe deve expressar o propósito da classe. A letra T é adicionada antes do nome da classe para indicar que se trata de um tipo. Por exemplo: typeTStudent= class (TObject); O nome da instância da classe é igual ao nome da classe, mas sem o prefixo T. varStudent: TStudent Observe que em relação à nomenclatura dos componentes, consulte a Seção 6.6 "Componentes". (2) Nomenclatura e formato dos campos: A nomenclatura dos campos segue as mesmas regras das variáveis, exceto que o prefixo F é adicionado para indicar que se trata de um campo. Visibilidade: Todos os campos devem ser privados. Se quiser acessar um campo fora do escopo de uma classe, você pode fazer isso com a ajuda dos atributos da classe. (3) Nomenclatura e formato de métodos: A nomenclatura de métodos segue as mesmas regras de procedimentos e funções. Métodos estáticos: métodos estáticos devem ser usados quando você não deseja que um método seja substituído por classes derivadas. Métodos virtuais versus métodos dinâmicos: quando você deseja que um método seja substituído por uma classe derivada, você deve usar métodos virtuais. Se um método de classe for usado direta ou indiretamente por múltiplas classes derivadas, métodos dinâmicos deverão ser usados. Por exemplo, se uma classe contiver um método frequentemente substituído e tiver 100 classes derivadas, o método deverá ser definido como dinâmico, o que pode reduzir a sobrecarga de memória. Métodos abstratos: se uma classe criar instâncias, não use métodos abstratos. Métodos abstratos só podem ser usados em classes base que nunca criam instâncias. Métodos de acesso à propriedade: Todos os métodos de acesso à propriedade devem ser definidos na parte privada ou protegida da classe. Os métodos de acesso à propriedade seguem as mesmas regras dos procedimentos e funções. O método utilizado para leitura deve ser prefixado com Get, e o método utilizado para escrita deve ser prefixado com Set, e possuir um parâmetro chamado Value cujo tipo é igual ao tipo do atributo. Por exemplo: TStudent = class (TObject)privateFName: string;protectedfunction GetName: string;procedure SetName (Value: string);publicproperty Name: string read GetName write SetName;end;(4) As propriedades da propriedade servem como acessadoras para campos privados e seguem o mesmo Os campos têm as mesmas regras de nomenclatura, mas sem o prefixo F. Os nomes das propriedades devem ser substantivos, não verbos. Propriedades são dados e métodos são ações. Os nomes das propriedades da matriz devem ser plurais, enquanto as propriedades gerais devem ser singulares. (5) Embora o uso de métodos de acesso não seja obrigatório, é recomendável usar métodos de acesso de gravação para acessar propriedades que representam campos privados.