Laboratorio de Programación

Anuncio
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
Descargar