Procedimientos y funciones 1. Denominación y formato (1) Los nombres de los procedimientos deben comenzar con una letra mayúscula y las letras mayúsculas y minúsculas deben estar escalonadas para aumentar la legibilidad. La siguiente es una forma incorrecta de escribir: PRocedure thisispoorlyformattedroutinename; cámbielo a esto: procedimiento ThisIsMuchMoreReadableRoutineName (2) El nombre del proceso debe ser significativo; Es mejor anteponer a su nombre una rutina que realiza una acción con el verbo que representa la acción. Por ejemplo: procedimiento FormatHardDrive; el nombre de la rutina que establece el valor del parámetro de entrada debe tener el prefijo Set, por ejemplo: procedimiento SetUserName; el nombre de la rutina que obtiene el valor debe tener el prefijo Get, por ejemplo: función GetUserName: cadena 2. Parámetros formales (1) Formato: Siempre que sea posible, los parámetros formales del mismo tipo deben agruparse. Por ejemplo: procedimiento NombreProcedimiento (Param1, Param2, Param3: Entero; Param4: cadena); (2) Denominación: Los nombres de todos los parámetros formales deben expresar su propósito. Si corresponde, los nombres formales de los parámetros deben tener como prefijo la letra A. Por ejemplo: procedimiento NombreDeProcedimiento (AUserName: cadena; AUserAge: entero). Cuando el nombre del parámetro tiene el mismo nombre que un atributo o campo de clase, el prefijo A es necesario. (3) Orden de los parámetros: el orden de los parámetros formales depende principalmente de las reglas de llamada del registro. El parámetro más utilizado debe ser el primer parámetro, ordenado de izquierda a derecha según la frecuencia de uso. Los parámetros de entrada preceden a los parámetros de salida. Los parámetros con un rango grande deben colocarse antes que los parámetros con un rango pequeño. Por ejemplo: procedimiento Nombre del procedimiento (APlanet, AContinent, ACountry, AState, ACity). Algunas son excepciones. Por ejemplo: durante el procesamiento de eventos, el parámetro Remitente de tipo TObject suele ser el primer parámetro que se pasa. (4) Parámetros constantes: para evitar que la rutina modifique los parámetros de registro, matriz, cadena corta o tipo de interfaz, los parámetros formales deben marcarse como Const. De esta forma, el compilador generará código de la forma más eficiente, asegurando que los parámetros pasados sean inmutables. Si no se espera que la rutina modifique otros tipos de parámetros, también se pueden marcar con C onst. Aunque esto no tiene ningún impacto en la eficiencia, proporciona más información a quien llama a la rutina. (5) Conflicto de nombres: cuando dos unidades contienen rutinas con el mismo nombre, si se llama a la rutina, en realidad se llama a la rutina en la unidad que aparece más adelante en la cláusula Usos. Para evitar esta situación, puede agregar el nombre de la unidad deseada antes del nombre del método, por ejemplo: SysUtils.FindClose (SR);Windows.FindClose(Handle);3. Variables (1) Denominación y formato de las variables: el nombre de una variable debe poder expresar su propósito. Las variables de control de bucle suelen ser letras individuales como I, J o K. También puede utilizar un nombre más significativo, como UserIndex; los nombres de variables booleanas deben indicar claramente el significado de los valores Verdadero y Falso. (2) Variables locales: las variables locales se utilizan dentro de rutinas y siguen las reglas de nomenclatura de otras variables. Si es necesario, las variables deben inicializarse inmediatamente al ingresar a la rutina. Las variables de tipo AnsiString locales se inicializan automáticamente en cadenas vacías de interfaz local y las variables de tipo dispinterface se inicializan automáticamente a cero; las variables de tipo Variant y OleVariant locales se inicializan automáticamente en Sin asignar. (3) Variables globales: generalmente se desaconseja el uso de variables globales. Sin embargo, a veces es necesario. Aun así, las variables globales deberían restringirse a los entornos donde se necesitan. Las variables globales pueden ser globales solo en la parte de implementación de la unidad; los datos globales, si serán utilizados por muchas unidades, deben trasladarse a una unidad común y ser utilizados por todos los objetos pueden inicializarse directamente a un valor cuando se declaran; . (Tenga en cuenta que todas las variables globales se inicializan automáticamente a cero, por lo tanto, no inicialice las variables globales a valores nulos como 0, nulo o Sin asignar. Las variables globales inicializadas a cero no ocupan espacio en el archivo .EXE. Inicializadas a cero los datos se guardan en el segmento de datos virtuales, el segmento de datos virtuales solo asigna memoria cuando se inicia la aplicación. Los datos globales inicializados distintos de cero ocupan espacio en el archivo .EXE. Reglas de casos de tipo (1): los identificadores de tipo son palabras reservadas y deben estar todos en minúsculas. Los tipos de API de Win32 suelen estar completamente en mayúsculas y siguen reglas para nombres de tipos específicos, como Windows.pas u otras unidades de API. Para otros nombres de variables, la primera letra debe estar en mayúscula y las demás letras deben estar en mayúsculas y minúsculas alternas. Por ejemplo: varMyString: string; // Palabra reservada WindowsHandle: HWND; // Win32 API tipo I: Integer; // Identificador de tipo introducido en la unidad del sistema (2) Tipo de punto flotante: se desaconseja el uso del tipo Real porque es solo Reservado por compatibilidad con códigos Pascal anteriores. Normalmente, Double debería usarse para números de coma flotante. El procesador puede optimizar Double y es un formato de datos estándar definido por IEEE. Extender se puede utilizar cuando se requiere un rango mayor que el que proporciona Double. Extend es un tipo específico de Intel y no es compatible con Java. Cuando el número físico de bytes de la variable de punto flotante es importante (quizás usando un lenguaje diferente para escribir la DLL), se debe usar Single. (3) Tipo de enumeración: el nombre del tipo de enumeración debe representar el propósito de la enumeración. El carácter T debe ir precedido del nombre para indicar que se trata de un tipo de datos. El prefijo de la lista de identificadores del tipo de enumeración debe contener de 2 a 3 caracteres en minúscula para asociarlos entre sí. Por ejemplo: TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB) El nombre de la instancia de la variable del tipo de enumeración es el mismo que el tipo, pero sin el prefijo T. También puedes darle a la variable un more; nombre especial, como: FavoriteSongTpe1, FavoriteSongTpe2, etc. espere. (4) Variant y OleVariant: generalmente no se recomienda utilizar Variant y OleVariant. Sin embargo, estos dos tipos son necesarios para la programación cuando el tipo de datos se conoce sólo en tiempo de ejecución (a menudo en aplicaciones COM y de bases de datos). Al realizar programación COM, como automatizar controles ActiveX, debe usar OleVariant; para programación que no sea COM, debe usar Variant. Esto se debe a que Variant puede guardar efectivamente las cadenas nativas de Delphi, mientras que OleVariant convierte todas las cadenas en cadenas OLE (es decir, cadenas Wide Char) sin contar las referencias. 5. Tipo construido (1) Tipo de matriz: el nombre del tipo de matriz debe expresar el propósito de la matriz. Los nombres de los tipos deben tener como prefijo la letra T. Si desea declarar un puntero a un tipo de matriz, debe anteponerle la letra P y declararlo antes de la declaración de tipo. Por ejemplo: typePCycleArray = ^TCicleArray; TCycleArray=array [1..100] of integer; de hecho, la instancia de variable del tipo de matriz tiene el mismo nombre que el tipo, pero sin el prefijo T. (2) Tipo de registro: el nombre del tipo de registro debe expresar el propósito del registro. Los nombres de los tipos deben tener como prefijo la letra T. Si desea declarar un puntero a un tipo de registro, debe anteponerle la letra P y declararlo antes de la declaración de tipo. Por ejemplo: tipoPStudent = ^ TStudent;TStudent = recordStudentName: string;StudentEge: Double;6. Clases (1) Denominación y formato El nombre de una clase debe expresar el propósito de la clase. La letra T se agrega antes del nombre de la clase para indicar que es un tipo. Por ejemplo: typeTStudent= clase (TObject); el nombre de instancia de la clase es el mismo que el nombre de la clase, pero sin el prefijo T. varStudent: TStudent; tenga en cuenta que con respecto a la denominación de los componentes, consulte la Sección 6.6 "Componentes". (2) Denominación y formato de campos: la denominación de campos sigue las mismas reglas que las variables, excepto que se agrega el prefijo F para indicar que se trata de un campo. Visibilidad: Todos los campos deben ser privados. Si desea acceder a un campo fuera del alcance de una clase, puede hacerlo con la ayuda de los atributos de clase. (3) Denominación y formato de métodos: la denominación de métodos sigue las mismas reglas que los procedimientos y funciones. Métodos estáticos: los métodos estáticos deben usarse cuando no desea que las clases derivadas anulen un método. Métodos virtuales frente a métodos dinámicos: cuando desee que una clase derivada anule un método, debe utilizar métodos virtuales. Si un método de clase va a ser utilizado directa o indirectamente por varias clases derivadas, se deben utilizar métodos dinámicos. Por ejemplo, si una clase contiene un método que se reemplaza con frecuencia y tiene 100 clases derivadas, el método debe definirse como dinámico, lo que puede reducir la sobrecarga de memoria. Métodos abstractos: si una clase va a crear instancias, no utilice métodos abstractos. Los métodos abstractos sólo se pueden utilizar en clases base que nunca crean instancias. Métodos de acceso a la propiedad: todos los métodos de acceso a la propiedad deben definirse en la parte privada o protegida de la clase. Los métodos de acceso a la propiedad siguen las mismas reglas que los procedimientos y funciones. El método utilizado para la lectura debe tener el prefijo Get, y el método utilizado para la escritura debe tener el prefijo Set y tener un parámetro llamado Valor cuyo tipo sea el mismo que el tipo del atributo. Por ejemplo: TStudent = clase (TObject)privateFName: cadena;protectedfunction GetName: cadena;procedimiento SetName (Valor: cadena);publicproperty Nombre: cadena leer GetName escribir SetName;end;(4) Las propiedades de propiedad sirven como acceso a campos privados y siguen iguales Los campos tienen las mismas reglas de nomenclatura, pero sin el prefijo F. Los nombres de las propiedades deben ser sustantivos, no verbos. Las propiedades son datos y los métodos son acciones. Los nombres de las propiedades de la matriz deben ser plurales, mientras que las propiedades generales deben ser singulares. (5) Aunque no se requiere el uso de métodos de acceso, se recomienda utilizar métodos de acceso de escritura para acceder a las propiedades que representan campos privados.