A. Fabin Lpez Valencia Dpto. de Ingeniera de Sistemas y Automtica
Escuela Superior de Ingenieros (UPV/EHU)
Anexo A
Estilo de programacin 220 Anexo A: Estilo de programacin Dpto. de Ingeniera de Sistemas y Automtica A. Fabin Lpez Valencia Escuela Superior de Ingenieros (UPV/EHU) ESTILO DE PROGRAMACION Uno de los requisitos para el desarrollo del lenguaje de programacin Ada 1 fue el de que facilitara la escritura de programa legibles, al considerarse que los programa profesionales se leen muchas ms veces de las que se escriben. Sin embargo, la legibilidad de un programa no depende slo de las caractersticas del lenguaje de programacin, sino que es el estilo en que est escrito el que determina en gran medida su legbilidad. Uno de los principales aspectos en los que juega un papel muy importante la legibilidad de los programas es en el del mantenimiento del software, es decir la modificacin de los programas con la finalidad de corregir errores o aadir nuevas opciones o funcionalidades. Teniendo en cuenta, que la mayor parte del tiempo que dedica un programador al mantenimiento se emplea en estudiar el cdigo fuente del programa, se llega a la conclusin de que la claridad es vital para el adecuado desarrollo de una aplicacin informtica, especialmente cuando el trabajo se realiza en grupo. A diferencia de la sintaxis del lenguaje de programacin, que son reglas fijas que obligatoriamente hay que seguir, un estilo de programacin est constituido por directrices que ayudan a obtener programas ms legibles. Es por esto que, si bien no existen estilos de programacin absolutamente correctos o incorrectos, es aconsejable la adopcin, de una manera sistemtica, de un conjunto de normas para la escritura de programas. Y esto es as, no slo para el desarrollo de grandes proyectos de programacin, sino tambin para el de pequeos programas, que habitualmente constituyen el ncleo del aprendizaje de las tcnicas bsicas de programacin. Por ello, se proponen aqu algunas normas relativas a la denominacin de los objetos de los programas y de la estructuracin de stos, recordando que el objetivo fundamental de un estilo de programacin no es hacer que todos los programas sean iguales, sino que resulten fciles de leer, comprender y manipular tanto para el desarrollador inicial del programa como para quien tenga que realizar el mantenimiento del mismo.
1. IDENTIFICADORES Identificador es el nombre que asignamos a un objeto del programa (constante, tipo de dato, variable, funcin, procedimiento, ...) que representa alguna entidad del mundo real. La funcin de una entidad del mundo real se refleja en la funcin del objeto que la representa en el programa. Es por sto que los identificadores o nombres de los objetos de un programa deben ser coherentes con el significado de la entidades del mundo real que modelan, de tal manera que sean una descripcin clara y breve de las mismas. Nada contribuye tanto a la claridad y legibilidad de un programa como la eleccin de buenos nombres mnemotcnicos, teniendo siempre presente que el objetivo de la eleccin del identificador no es minimizar el nmero de pulsaciones si no maximizar la claridad del programa. Palabras reservadas Se utilizarn letras maysculas. Palabras reservadas de Pascal estndar: AND DIV FILE IN OF RECORD TYPE ARRAY DO FOR LABEL OR REPEAT UNTIL BEGIN DOWNTO FUNCTION MOD PACKED SET VAR CASE ELSE GOTO NIL PROCEDURE THEN WHILE CONST END IF NOT PROGRAM TO WITH
1 Lenguaje de alto nivel (basado en Pascal) patrocinado por el Ministerio de Defensa de los EE UU y desarrollado a partir de un estudio previo de los requisitos que deba satisfacer un lenguaje de programacin moderno: legibilidad, tipado fuerte, construccin de grandes programas, manejo de excepciones, abstraccin de datos , procesamiento paralelo, unidades genricas,... Es el primer lenguaje prctico que posee conjuntamente las distintas categoras de abstraccin de datos. Anexo A: Estilo de programacin 221 A. Fabin Lpez Valencia Dpto. de Ingeniera de Sistemas y Automtica Escuela Superior de Ingenieros (UPV/EHU) Palabras reservadas aadidas en Turbo Pascal: ASM CONSTRUCTOR DESTRUCTOR IMPLEMENTATION INLINE INTERFACE OBJECT SHL SHR STRING UNIT USES XOR Directivas de Turbo Pascal: ABSOLUTE ASSEMBLER EXTERNAL FAR FORWARD INTERRUPT NEAR PRIVATE PUBLIC VIRTUAL Identificadores de constantes predefinidas Se utilizarn letras maysculas. Ejemplos: MAXINT, MAXLONGINT Identificadores de tipos de datos, funciones y procedimientos predefinidos Se utilizarn letras minsculas, comenzando con maysculas cada una de las palabras que forman el identificador. Ejemplos: Integer, Char, Write, Read, WriteLn, ReadLn Identificadores de constantes definidas por el usuario Se escribirn en maysculas, con un prefijo en minsculas correspondiente a la notacin hngara, que se explicar ms adelante. Si el identificador de la constantes est formado por varias palabras, estas se separaran mediante el carcter subrayado. Ejemplos: cESPACIO, iMAX_FILAS, byMESES_ANYO Identificadores de tipos definidos por el usuario 2
Se utilizarn letras minsculas, comenzando cada palabra que componga el identificador con letras maysculas 3 . Se utilizar un prefijo en el identificador de acuerdo con la notacin hngara, comenzado siempre por la letra minscula t. Ejemplos: tsCadenas, trgPersonas, trgFechas Identificadores de variables y parametros Se utilizarn letras minsculas, comenzando cada palabra que componga el identificador con maysculas. Se utilizar un prefijo en el identificador de acuerdo con la notacin hngara. Ejemplos: iContador, iContPalabras, rPorcentaje, cUltimaLetra
2 En muchas ocasiones, se utiliza el plural para resaltar la idea de generalidad implcita en el concepto de tipo de dato, frente a la particularidad del concepto de variable. 3 Una opcin alternativa es separar las palabras que componen un identificador mediante el carcter de subrayado. Por ejemplo: iCont_Palabras, iUltima_letra, ... 222 Anexo A: Estilo de programacin Dpto. de Ingeniera de Sistemas y Automtica A. Fabin Lpez Valencia Escuela Superior de Ingenieros (UPV/EHU) Identificadores de procedimientos 4
Se utilizarn letras minsculas, comenzando cada palabra que componga el identificador con letras maysculas. Identificadores de funciones Se utilizarn letras minsculas, comenzando cada palabra que componga el identificador con letras maysculas. Se utilizar un prefijo en el identificador de acuerdo con la notacin hngara, comenzado siempre por las letras minsculas fn. 2. ESTRUCTURA DEL PROGRAMA 2.1 Utilizacin de elementos LOCALES y GLOBALES Utilizar siempre tipos y constantes con nombre Ser preferible, por claridad del programa y para facilitar el mantenimiento del mismo, la utilizacin de constantes con nombre, en lugar de constantes literales. Utilizar siempre variables locales Se utilizarn siempre variables locales a los subprogramas, para evitar los efectos laterales de las variables globales. No utilizar funciones o procedimientos locales No es aconsejable, para los ejercicios que se realizarn durante el curso, la utilizacin de procedimientos o funciones locales, puesto que, dada la poca complejidad de los ejercicios propuestos, el uso de subprograma locales dificultara la claridad de los programas, sin aadir ventajas apreciables. Utilizar tipos locales slo cuando est estrictamente justificado Siguiendo el mismo razozamiento de los procedimientos o funciones locales, se procurar no abusar del uso de tipos locales a subprogramas. No obstante, se tendr en cuenta que, en ocasiones muy especficas, su uso mejorar la claridad del programa. Siendo ms fcil encontrar justificacin al uso de tipos locales a un subprograma que al uso de funciones y procedimientos locales, incluso en ejercicios no muy complejos. 2.2 Estructura general de las partes del programa Cada una de las partes del programa comenzar en la primera columna, indentando o sangrando las lneas que componen cada una de las partes del programa. Se recomienda la utilizacin de sangrados de 4 o 5 espacios en blanco como mximo; utilizar uno ms grande (8 o ms espacios) da lugar a lneas de programa demasiado largas. Se separar cada una de las partes o bloques del programa (TYPE, VAR, ...) con una lnea en blanco.
4 Generalmente la primera palabra del identificador ser un verbo en infinitivo para resaltar la accin que realiza el procedimiento. Anexo A: Estilo de programacin 223 A. Fabin Lpez Valencia Dpto. de Ingeniera de Sistemas y Automtica Escuela Superior de Ingenieros (UPV/EHU) As mismo, se recomienda dejar un espacio en blanco antes de cada punto y coma ( ; ) utilizado para separar las sentencias de un programa. Ejemplo: TYPE < declaracin de tipo > ; < declaracin de tipo > ...
VAR < declaracin de variable > ; < declaracin de variable > ...
BEGIN < sentencia > ; < sentencia > ... END . 2.3 Estructura de las sentencias Declaracin de registro Declaracin de registro fijo o normal
= RECORD < campo > ; < campo > ... END Declaracin de registro variante
= RECORD < campo > ; < campo > ... CASE <campo> : < tipo > OF < etiqueta > : ( < campo > ... ) ; < etiqueta > : ( < campo > ... ) ; ... END Sentencia compuesta
BEGIN < sentencia > ; < sentencia > ... END Sentencia condicional simple ( IF )
224 Anexo A: Estilo de programacin Dpto. de Ingeniera de Sistemas y Automtica A. Fabin Lpez Valencia Escuela Superior de Ingenieros (UPV/EHU) IF < condicin > THEN < sentencia simple o computesta > Sentencia condicional compuesta ( IF ELSE )
IF < condicin > THEN < sentencia simple o compuesta > ELSE < sentencia simple o compuesta > Sentencia condicional mltiple ( IF ELSE IF )
IF < condicin 1 > THEN < sentencia simple o compuesta > ELSE IF < condicin 2 > THEN < sentencia simple o compuesta > ELSE IF < condicin 3 > THEN < sentencia simple o compuesta > ELSE < sentencia simple o compuesta > Sentencia condicional mltiple ( CASE )
CASE < condicin > OF < etiqueta > : < sentencia simple o compuesta > < etiqueta > : < sentencia simple o compuesta > ... ELSE < sentencia(s) > END Sentencia repetitiva con condicin de entrada ( WHILE )
WHILE < condicin > DO < sentencia simple o compuesta > Sentencia repetitiva con condicin de salida ( REPEAT UNTIL )
REPEAT < sentencia > ; < sentencia > ... UNTIL < condicin > Sentencia repetitiva con nmero predeterminado de iteraciones ( FOR )
Anexo A: Estilo de programacin 225 A. Fabin Lpez Valencia Dpto. de Ingeniera de Sistemas y Automtica Escuela Superior de Ingenieros (UPV/EHU) FOR < variable de control > := < inicial > TO < final > DO < sentencia simple o compuesta > Condiciones compuestas que no caben en una lnea Se procurar no escribir ninguna condicin simple a lo largo de varias lneas. Ejemplos de IF-THEN :
IF < condicin > AND < condicin > THEN < sentencia simple o compuesta >
IF < condicin > AND < condicin > THEN < sentencia simple o compuesta > 2.4 Comentarios y lneas en blanco 2.4.1 Comentarios generales de los programas, funciones y procedimientos Cada programa debe tener un comentario general, que debe aparecer cerca del comienzo del mismo. En general, este comentario debe contener la siguiente informacin: Un breve resumen de lo que hace el programa y del mtodo que para ello utiliza El nombre de los programadores La fecha en que fue escrito el programa Una referencia a los manuales tcnicos y de usuario que dan informacin adicional sobre el programa Una breve historia de todas las modificaciones realizadas, indicando el programador que las realizn y el motivo que las caus Cada subprograma debe tener un comentario general, que debe aparecer cerca del comienzo del mismo. En general, este comentario debe contener la siguiente informacin: Un breve resumen de lo que hace el subprograma y del mtodo que para ello utiliza Condiciones de entrada: Estado inicial del subprograma Parmetros que se le pasan Condiciones de salida: Parmetros que devuelve Cambios que se producen en el estado Enumeracin de los subprogramas que utiliza Enumeracin de los subprogramas que le utilizan 2.4.2 Comentarios dentro del cdigo de los programas Un programa no es una secuencia de sentencias sin relacin entre s; ms bien al contrario, se trata de una serie de acciones a realizar con un objetivo determinado. La realizacin de cada una de estas acciones se efecta generamente mediante varias sentencias o mediante un subprograma. Para mejorar la claridad del programa se remarcar adecuadamente cada una de estas acciones o bloques de cdigo, separndolas mediante lneas en blanco y precediendolas con comentarios que clarifiquen la accin que llevan a cabo. Se utilizarn comentarios para aclarar el significado de aquellas variables y constantes cuyo identificador no sea suficiente para entender su uso. No se deben aadir comentarios a sentencias evidentes: 226 Anexo A: Estilo de programacin Dpto. de Ingeniera de Sistemas y Automtica A. Fabin Lpez Valencia Escuela Superior de Ingenieros (UPV/EHU) Ejemplo: iCont := iCont + 1 ; { Incrementar contador } Cuando se produce un gran nivel de anidamiento de sentencias estructuradas, se pueden aadir comentarios en los cierres de bloques ( END ) para clarificar a qu sentencia de control pertenecen. Los comentarios deben ser breves y concisos, evitando las divagaciones: el cdigo nos debe indicar el cmo se realiza la operacin y el comentario debe informarnos sobre el qu y/o el por qu se realiza. Ejemplo: PROCEDURE MostrarModa ( CONST aiNumeros : taiVector; iLong : Integer ); VAR aiFrecuencias : taiVector ; { Contendr la "frecuencia" de cada valor de aiNumeros, desde su posicin en el array en adelante } rMayorFrecuencia : Real ; i, j : Integer ; { Indices para recorrer los arrays }
BEGIN { Calcular las "frecuencias" de los valores de aiNumeros } FOR i := 1 TO iLong - 1 DO BEGIN aiFrecuencias[i] := 1 ; FOR j = i + 1 TO iLong DO IF aiNumeros[j] = aiNumeros[i] THEN aiFrecuencias [i] := aiFrecuencias [i] + 1 END ;
{ Calcular la frecuencia mayor } rMayorFrecuencias := fnrCalcularValorMayor (aiFrecuencias,iLong) ;
{ Mostrar aquellos nmeros cuya frecuencias coincida con el valor mayor de la frecuencia } Writeln ('Valores que constituyen la Moda:') ; FOR i := 1 TO iLong DO IF aiFrecuencias[i] = rMayorNumeroFrecuencias THEN Writeln (aiNumeros[i]) END ; (* MostrarModa *) 2.4.3 Espacios en blanco en las sentencias Se utilizarn espacios en blanco dentro de las sentencias para separar los diferentes elementos o tokens que las componen: delante y detrs de un nombre de variable, de una constante, de una palabra reservada, de un operador, delante de los parntesis de la llamada a un subprogramas, ... Ejemplos: FOR i := 1 TO iLong - 1 DO BEGIN aiFrecuencias[i] := 1 ; ... aiFrecuencias [i] := aiFrecuencias [i] + 1 END ;
227 A. Fabin Lpez Valencia Dpto. de Ingeniera de Sistemas y Automtica Escuela Superior de Ingenieros (UPV/EHU)
Notacin hngara simplificada 228 Anexo A: Estilo de programacin. Notacin hngar simplificada Dpto. de Ingeniera de Sistemas y Automtica A. Fabin Lpez Valencia Escuela Superior de Ingenieros (UPV/EHU) NOTACION HUNGARA SIMPLIFICADA La notacin hngara se basa en la utilizacin de prefijos en los identificadores de tipos, constantes, variables, parmetros y funciones, que nos indiquen el tipo de dato que lo constituyen (tipos, constantes, variables, y parmetros) o el tipo de dato que devuelven (funciones). Los prefijos se escribirn en minsculas, y en el resto del identificador se comenzar con letra mayscula cada palabra que lo componga 5 . 1. PREFIJOS PARA TIPOS SIMPLES
i Integer lo LongInt sh ShortInt by Byte w Word
bo Boolean c Char r Real e Enumerado sc Subrango de Caracteres si Subrango de Enteros 2. PREFIJOS PARA TIPOS COMPUESTOS s Cadena de caracteres o String a Array
El prefijo estar formado por la letra a seguida del prefijo del tipo base del array.
Ejemplo:
ai Array de Integers ar Array de Reales arg Array de Registros
rg Registro
Los campos tendrn un prefijo, de modo similar a lo indicado para las variables.
fb Fichero o archivo binario
El prefijo estar formado por las letras fb seguidas del prefijo del tipo base del fichero.
Ejemplo:
fbi Fichero de Integers fbr Fichero de Reales fbrg Fichero de Registros
ft Fichero o archivo de texto
5 Una opcin alternativa es separar las palabras que componen un identificador mediante el carcter de subrayado. Por ejemplo: iCont_Palabras, iUltima_letra, ... Anexo A: Estilo de programacin. Notacin hngar simplificada 229 A. Fabin Lpez Valencia Dpto. de Ingeniera de Sistemas y Automtica Escuela Superior de Ingenieros (UPV/EHU) 3. PREFIJOS PARA PUNTEROS p Puntero
El prefijo estar formado por la letra p seguida del prefijo del tipo de datos al que apunta.
Ejemplo:
pr Puntero a Real prg Puntero a Registro pai Puntero a Array de Integers parg Puntero a Array de Registros
4. PREFIJOS PARA IDENTIFICADORES DE FUNCIONES fn Funcin
El prefijo estar formado por las letras fn seguidas del prefijo del tipo de datos que devuelve.
Ejemplo:
fni Funcin que retorna un Integer fns Funcin que retorna un String
5. PREFIJOS PARA IDENTIFICADORES DE TIPOS t Tipo
Los prefijos de tipos comenzarn con la letra t seguida del tipo de datos.
Ejemplos:
ts Tipo Cadena de caracteres o String tai Tipo Array de Integers trg Tipo Registro targ Tipo Array de Registros tprg Tipo Puntero a Registro tfbrg Tipo Fichero de Registros te Tipo Enumerado tsc Tipo Subrango de Caracteres tsi Tipo Subrango de Integers tse Tipo Subrango de enumerados 230 Anexo A: Estilo de programacin. Notacin hngar simplificada Dpto. de Ingeniera de Sistemas y Automtica A. Fabin Lpez Valencia Escuela Superior de Ingenieros (UPV/EHU)
Ejemplo de cdigo utilizando notacin hngara:
PROGRAM Hungara ;
CONST iLONGITUD = 20 ; iMAX_EMPLEADOS = 50 ;
TYPE
tsCadenas = String [iLONGITUD] ;
trgPersonas = RECORD sNombre : tsCadenas ; byEdad : Byte ; rSueldo : Real END ;
targNominas = ARRAY [1 .. iMAX_EMPLEADOS] OF trgPersonas ;
tprgPuntNodo = ^trgNodos ;
trgNodos = RECORD rgInformacion : trgPersonas ; prgSiguiente : tprgPuntNodo END ;