|
Recomendações
|
| Nesse capítulo torna-se necessário distinguir entre
identificadores e nomes. O nome é
aquela parte do identificador que revela seu significado.
Um identificador consiste de um prefixo, um nome e um sufixo, nesta ordem. O prefixo e o
sufixo são opcionais. O sufixo é usado apenas pelas ferramentas que geram código C++,
para evitar colisão com nomes definidos pelo usuário, por isso não se faz maiores
referências a sufixo neste documento. É recomendável que os identificadores não sejam extremamente longos, para evitar o risco de colisão de nomes quando se usa ferramentas que truncam identificadores longos. O UNIX trunca nomes de arquivos maiores que 15 caracteres. Cfront normalmente trunca identificadores maiores que 31 caracteres. O uso de dois caracteres underscore ( __ ) em identificadores é reservado para uso interno dos compiladores, de acordo com o padrão ANSI-C. O caracter underscore é normalmente usado em nomes de bibliotecas de funções, tais como _main e _exit. Para evitar colisão, não use nomes de identificadores começando com caracter underscore. Uma boa regra empírica a considerar é a de que um nome que não pode ser pronunciado não é um bom nome. Um nome longo é melhor que um nome curto, criptografado, mas os problemas relativos a truncagem de nomes muito longos devem ser considerados. Abreviaturas muitas vezes são mal compreendidas. Variáveis globais, funções e constantes devem ser nomes longos o suficiente para evitar conflitos, mas não tão longos. Classes devem ser denominadas como objeto.função, que são nomes fáceis de se ler e logicamente compreensíveis. Há várias bibliotecas de classe disponíveis para compra no mercado de software, e pode-se ter dezenas de milhares de classes em um projeto grande. Devido a isso, é importante ser criterioso na definição de nomes para que não ocorram colisões. Uma maneira de prevenir colisões é ter regras específicas para definição de nomes para classes que são visíveis globalmente, utilizando-se de prefixos. Dessa forma diferentes bibliotecas de classes podem ser utilizadas ao mesmo tempo. Nomes para os seguintes tipos de objetos devem ser prefixados:
O uso de prefixos pode algumas vezes ser evitado usando-se uma classe para limitar o escopo do nome. |
Exceções à regra
|
| Exemplo 9: Exceção quando usando nomes compostos. |
const char* functionTitle = "EUA_Special"; int currentIO_Stream = 1; // Last Character in currentIO is in uppercase!
| Exemplo 10: Escolha de nomes |
int groupID; // instead of grpID int nameLength; // instead of namLn PrinterStatus resetPrinter; // instead of rstprt
| Exemplo 11: Nomes ambíguos |
void termProcess(); // Terminate process or
// terminal process?
| Exemplo 12: Nomes contendo caracteres numéricos podem causar erros difíceis de se localizar. |
int I0 = 13; // Names with digits can be int IO = I0; // difficult to read.
| Exemplo 13: Definição de uma classe na biblioteca de classes Emc2. |
class Emc2Class
{
public:
Emc2Class(); // Default constructor
// ...
private:
int id;
// ...
};
| Exemplo 14: Um modo de evitar classes e funções globais. |
// Instead of declaring:
void Emc2_myFunc1();
void Emc2_myFunc2();
class Emc2MyClass { /* ... */ };
// Encapsulate the functions using an abstract class:
class Emc2
{
public:
static void myFunc1();
static void myFunc2();
class MyClass { /* ... */ };
private:
virtual dummy() = 0; // Trick to make the class abstract
};
// Now, functions and classes may be accessed by using the scope-operator:
Emc2::myFunc1();
Emc2::myFunc2();
Emc2::MyClass myObject;
| | Home | Bookmarks | Universidades | Para Saber mais | Universidades | WEB Directory | Mapa do site | | |