Laboratorio de Programación Estilo Dpto. de Ingeniería de Sistemas Telemáticos http://www.lab.dit.upm.es/~lprg/ Introducción La sintaxis de un lenguaje de programación determina qué código es posible escribir (es decir, que compila). El estilo dice cómo debe ser el código que se debe escribir para que este sea comprensible y sea, además: fácilmente mantenible robusto con pocos “bugs” febrero 2010 Estilo de programación 2 1 Principios Generales (I) Software bueno y software elegante Todo software bueno debe funcionar bien El software “elegante”, con estilo, es predecible, robusto, mantenible y extensible Sigue el estilo original Si se modifica software ajeno, es preferible seguir el estilo original (es más difícil de mantener un programa con mezcla de estilos) Reescribir el código para mejorar el estilo puede introducir errores imprevisibles Estilo de programación febrero 2010 3 Principios Generales (II) Evita sorpresas en el código. Para ello, sigue estos principios: Simplicidad: clases y métodos simples Claridad: cada interfaz, clase, método, variable y objeto debe tener un propósito claro Completitud: el programa debe proporcionar la funcionalidad mínima esperada por el usuario y debe estar documentada Robustez: hay que documentar el comportamiento esperado ante errores y excepciones. No se deben ocultar errores (y que otros acaben detectándolos) febrero 2010 Estilo de programación 4 2 Principios Generales (III) Hazlo a la primera No vivas con “ventanas rotas” Documenta cualquier desviación del estándar Si te saltas una regla, documenta por qué febrero 2010 Estilo de programación 5 Convenciones de formato (I) Sangra el código anidado public class Robot { ..private int numFilas; ..void busca(Posicion posicion){ ....for (int i = 0; i <= numFilas; i++){ ......switch(i){ ........case 0: ..........System.ou.t.println(i); ..........break; .......//... ......} ....} ..} } febrero 2010 Estilo de programación 6 3 Convenciones de formato (II) Divide las líneas muy largas (máximo 80 caracteres) No pongas en una línea varias órdenes double x = Math.random(); double y = Math.random(); Divídelas en varias líneas Si una línea es muy larga porque tiene una expresión compleja, divide la expresión en varias subexpresiones: double longitud = Math.sqrt(Math.pow(Math.random(), 2.0) + Math.pow(Math.random(), 2.0)); (*) double xCuadrado = Math.pow(Math.random(), 2.0); double yCuadrado = Math.pow(Math.random(), 2.0); double longitud = Math.sqrt (xCuadrado + yCuadrado) Estilo de programación febrero 2010 7 Convenciones de formato (III) Si hay que partir una línea en dos, aprovecha un espacio Si hay una coma, la coma debe quedar en la primera línea Si hay un operador, este debe comenzar la segunda línea return buscaSalida (posicion.getFila(), posicion.getColumna()); return ((this.fila == fila) && (this.columna == columna)) febrero 2010 Estilo de programación 8 4 Convenciones de formato (IV) Incluye espacios en blanco entre la palabra clave y el paréntesis, y entre el paréntesis y la llave: for (…) { } while (…) { } if (…) { } else if (…) { } febrero 2010 Estilo de programación 9 Convenciones de nomenclatura (I) Emplea nombres con significado if (a < 65) y = 65 – a; } else { y = 0; } if (edad < EDAD_JUBILACION) anosParaJubilarse = EDAD_JUBILACION – edad; } else { anosParaJubilarse = 0; } febrero 2010 Estilo de programación 10 5 Convenciones de nomenclatura (II) Evita nombres muy largos Usa el dominio inverso de tu empresa/organización para los paquetes: com.sun.* Si tienes dos versiones incompatibles, haz paquetes diferentes com.xyz.server.v1 com.xyz.server.v2 Los paquetes van en minúsculas (io), las clases/interfaces en mayúsculas (ClienteEmpresa), los métodos minúscula-mayúscula (getNombre) y las constantes en mayúscula-subrayado (LIMITE_EDAD) Usa los métodos set-, get-, isfebrero 2010 Estilo de programación 11 Convenciones de programación (I) Define clases pequeñas con pocos métodos Declara todos los atributos privados “out of sight, out of mind” facilita cambios Utiliza bloques en vez de expresiones en expresiones de control pon {} en los if/else/for/while… aunque sean sólo de una orden Clarifica el orden de los operadores con paréntesis Usa paréntesis para que no haya dudas de cómo se agrupan las expresiones Usa siempre break en el último case de un switch, incluso si es un default Usa equals() en vez de == para compara objetos febrero 2010 Estilo de programación 12 6 Convenciones de programación (II) Haz constructores que construyan los objetos en un estado válido Anida constructores para eliminar código redundante Cuenta (String nombre, double balance) { this.nombre = nombre; this.balance = balance; } // mejorable Cuenta (String nombre) { this.nombre = nombre; this.balance = BALANCE_POR_DEFECTO; } Cuenta (String nombre) { this (nombre, BALANCE_POR_DEFECTO); } febrero 2010 Estilo de programación 13 Convenciones de programación (III) Usa excepciones no comprobables para casos excepcionales, inesperados y serios, que indican un error en la lógica del programa Usa excepciones capturables para casos que puedan ocurrir normalmente y ser subsanados febrero 2010 Estilo de programación 14 7 Convenciones de programación (IV) Convierte excepciones (de una clase de excepción a otra) sólo para añadir información try { for (int i = v.size(); --i <= 0) { ostream.println(v.elementAt(i)); } catch (ArrayOutOfBounds e) { //no debería hacerse esto throw new UnexpectedExceptionError(e); } febrero 2010 Estilo de programación 15 8