Anda di halaman 1dari 79

Clean Code

Raybert Paredes

http://www.lostechies.com/blogs/derickbailey/archive/2009/02/11/solid-development-principles-in-motivational-pictures.aspx

Que pasa cuando nos toca modificar cdigo?

http://www.albertelli.com/photoarchive/Random_2003/lawn_jenga0002.jpeg

Da miedo

http://blog.rwbenwick.com/wp-content/uploads/2009/12/Reason-For-Leaving-iStock_000008369823Medium.jpg

http://www.albertelli.com/photoarchive/Random_2003/lawn_jenga0002.jpeg

Quien nos podr ayudar?

Pues.
http://browse.deviantart.com/?qh=&section=&q=avengers#/d41k54l

Tampoco.
http://www.pharmatek.com/developers/developers.htm

Nosotros

http://www.catosplace.net/blogs/personal/wp-content/uploads/2011/04/developers.jpg

Pero como??

http://4.bp.blogspot.com/-wLWxI2BZTEo/TbP44yGHHXI/AAAAAAAACMA/ck1BVzrucHo/s1600/bg_doubt.jpg

Aprendiendo un poco de

Etc

En donde???

Y otros mas

Veremos un poco de

Craftsmanship

Escrito por: To Bob

Bueno, manos a la ubre!!

Perdn, a la obra. ;)

Entonces, Por qu debera interesarme escribir mejor mi cdigo?


http://www.websoftwareqa.com/wp-content/uploads/2010/07/Computer-Code.jpg

http://www.osnews.com/story/19266/WTFs_m

Pasamos mas tiempo leyendo cdigo

http://3.bp.blogspot.com/_gP9GcIrRlbg/TDw7pXAfmeI/AAAAAAAAB-8/EDZjyqptYFE/s400/frustrated-computer-scream-entrepenuer.jpg

Y a veces nos damos cuenta que fuimos nosotros mismos los que escribimos ese DESASTRE!!!!

http://photos.pcpro.co.uk/blogs/wp-content/uploads/2010/10/frustrated.jpg

Clean Code

Leer cdigo debera ser como leer una novela


Grady Booch

Costo de Poseer cdigo no mantenible

El Arte de escribir cdigo entendible

Actitud!!

Escribir cdigo que entienda la computadora es una tcnica, escribir cdigo que entienda un ser humano es un Arte

The Boy scout Rule

Nombres Significativos

Preferir Nombres claros a cometarios


int d; // Tiempo transcurrido en das

int tiempoTranscurridoEnDias; int diasTranscurridosDesdeCreacion;

Usar nombres que revelen su intencin


public List<int[]> obtener() { List<int[]> lista1 = new ArrayList<int[]>(); for (int[] x : laLista) if (x[0] == 4) lista1.add(x); return lista1; }

Usar nombres que revelen su intencin


1. 2. 3. 4. Qu tipos de cosas se almacenan en laLista? Cual es el significado del item CERO? Cul es el significado del valor 4? Para que se utiliza la lista que retorna ese mtodo?

Usar nombres que revelen su intencin


public List<Celda> obtenerCeldasConBanderas() { List<Celda> celdasConBanderas = new ArrayList<Cell>(); foreach (Celda celda in tableroJuego) if (celda.estaConBandera()) celdasConBanderas.add(celda); return celdasConBanderas;
}

Evitar la desinformacin
int a = l; if ( O == l ) a = O1; else l = 01;

Use nombres pronunciables


class DtaRcrd102 { private date credmahms; private date moddmahms; private string pszqint = "102"; }; class Cliente { private date fechaCreacion; private date fechaModificacion; private string clienteId = "102"; }

Funciones

Funciones pequeas
Deberan ser entre 20 y 30 lneas por funcin

Hacer una sola cosa


Single Responsibility Principle

Un solo nivel de abstraccin por funcin


ingresarOperacionRescate(Operacion operacion); calcularIGV(Operacion operacion); //impuestoACobrar = operacion.Monto * impuesto.IGV contabilizarOperacion(Operacion operacion);

Leer de Arriba hacia abajo


Como un peridico

Switch
Evitarlo, rompe la regla de solamente una cosa

Argumentos
Uno es bueno, Cero es mejor EscribirArchivoEnDisco(archivo)

Flag
Es preferible usar polimorfismo, o crear nuevas funciones Mostrar(true) mostrarEnDesarrollo() mostrarEnPruebas()

Comentarios

Un cdigo bien escrito no debera requerir comentarios

No comentes un mal cdigo, REESCRBELO


private string REGEXP_FORMATO_FECHA = "[LMJVSD][a-z]{2}\\,\\s[09]{2}\\s[EFMAJSOND][a-z]{2}\\s"+ "[0-9]{4}\\s[0-9]{2}\\:[0-9]{2}\\:[09]{2}\\sGMT"; private Cliente cliente; private Operacion operacion; private FileStream archivoGrabar; private date fechaLocal; // Ejemplo: "Lun, 02 Apr 2003 22:18:49 GMT"

Explca todo en cdigo


// Verifica si el empleado es candidato a // obtener beneficios sociales if ((empleado.tipoEmpleado = EMPLEADO_PLANILLAS) && (empleado.edad > 65))

if (empleado.esCandidatoBeneficiosSociales())

Buenos Comentarios
Legal:
// Derechos reservados por Seriva Inc. 2012 // Lanzado bajo GNU General Public License version 2.

Informativos:
// format matched kk:mm:ss EEE, MMM dd, yyyy Pattern patronTiempo = Pattern.compile( "\\d*:\\d*:\\d* \\w*, \\w* \\d*, \\d*");

Explicacin de una intencin:


// Este es nuestro mejor intento de obtener una // condicin de un gran numero de hilos.

Buenos Comentarios
Clarificacin:
assertTrue(a.compareTo(a) == 0); // a == a assertTrue(a.compareTo(b) != 0); // a != b

Advertencias de consecuencias:
// No correr este test a menos que // tengas bastante tiempo (Demora).

TODO:
// TODO: Tarea a realizar

Ampliar informacin // Indica ms informacin relevante

Malos comentarios
Redundancia:
// Declaro una variable x del tipo entero int x;

Comentario errneo: Puede introducir errores Comentarios mandatorios: Tienden a que el se utilice de manera inadecuada Comentarios tipo Diario: Existen repositorios de cdigo fuente para hacer esta tarea

Malos comentarios
Ruido:
/* Constructor por defecto */ protected AnnualDateRule()

Marcadores de posicin: /****************************** Al cerrar una llave: } // if, Si las funciones son cortas no es necesario Cdigo comentado: // if (prueba == true) { }

Formato

El cdigo es escrito por desarrolladores no por personas excedidas en alcohol

Formato vertical

Cdigo como Peridico

package fitnesse.wikitext.widgets; import java.util.regex.*; public class BoldWidget extends ParentWidget { public static final String REGEXP = "'''.+?'''"; private static final Pattern pattern = Pattern.compile("'''(.+?)'''", Pattern.MULTILINE + Pattern.DOTALL); public BoldWidget(ParentWidget parent, String text) throws Exception { super(parent); Matcher match = pattern.matcher(text); match.find(); addChildWidgets(match.group(1));} public String render() throws Exception { StringBuffer html = new StringBuffer("<b>"); html.append(childHtml()).append("</b>"); return html.toString();

Densidad Vertical Comentarios innecesarios suman lneas verticales Distancia vertical Conceptos ligados deben ir verticalmente cerca Declaracin de variables Al inicio?, Al final? Variables de instancia Siempre en un mismo lugar

Funciones dependientes Deben estar cerca

Formato vertical

Densidad horizontal: Google,cuyo.sistema,Android funciona.en los,telfonos;


totalChars+=lineSize; lineWidthHistogram.addLine(lineSize,lineCount); return b*b - 4*a*c;

Alineacin horizontal:
private Socket private OutputStream private Socket socket; socket; output;

Identacion
public CommentWidget(string text){ super(text); }

Reglas de Equipo

Estructuras de Datos

Abstraccin
public interface Vehiculo { double obtenerCapacidadEnGalones(); double ontenerGalonesDeGasolina(); }

public interface Vehiculo { double obtenerPorcentajeDeCombustibleRestante(); }

Abstraccin
public class Punto { public double x; public double y; } public interface Punto { double obtenerX(); double obtenerY(); void establecerCoordenada(double x, double y); double obtenerR(); double obtenerTheta(); void establecerPolar(double r, double theta); }

Estructura de Datos / Objetos


Cdigo procedural, (usando estructura de datos) hace fcil adicionar nuevas funciones sin cambiar las estructuras de datos existentes. La orientacin a objetos, por otro lado, hace fcil adicionar nuevas clases sin tener que cambiar funciones. El cdigo procedural hace difcil adicionar nuevas estructuras de datos porque todas las funciones deben cambiar. La orientacin a objetos hace difcil agregar nuevas funciones porque todas las clases deben cambiar. OO: El comportamiento esta en las clases hijas Estructurado: El comportamiento esta en la clase padre

La ley de Demeter
Cada unidad debe tener un limitado conocimiento sobre otras unidades y solo conocer aquellas unidades estrechamente relacionadas a la unidad actual. Cada unidad debe hablar solo a sus amigos y no hablar con extraos. Solo hablar con sus amigos inmediatos.

Manejo de excepciones

Usar exepciones en vez de codigos de error


public class DispositivoCOntrolador{ ... public void enviarApagado() { DeviceHandle handle = getHandle(DEV1); // verifica el estado de device if (handle != DeviceHandle.INVALID) { // guarda el estadp retrieveDeviceRecord(handle); // si no esta suspendido if (record.getStatus() != DEVICE_SUSPENDED) {

Usar exepciones en vez de codigos de error


public class DeviceController { ... public void sendShutDown() { try { tryToShutDown(); } catch (DeviceShutDownError e) { logger.log(e); } } ...

No retornar NULL! No enviar NULL!


public void registrarProducto(Producto producto) { if (producto != null) { RegistroProducto registro = tienda.obtemerRegistroProducto(); if (registro != null) {

Limites

Usando cdigo de terceros

Mtodo 1 Mtodo 2

Interface
Funcin Mtodo

FDDFGRR Function133

Uso

API

Usando cdigo de que no existe

Interface

???

Software

API?

Learning Test

Pruebas Unitarias

Primera Regla: Solo puede escribir el cdigo de produccin solamente si se ha escrito su respectivo cdigo de prueba. Segunda Regla: Solo puede escribir el cdigo de prueba mnimo necesario que haga que el cdigo de produccin falle. Tercera Regla: Solo puede escribir el cdigo de produccin necesario para hacer que ste pase su cdigo de prueba.

Fast (Rpido) Independent (Independiente) Repeteable (Repetible) Self validating (Autovalidacin) Timely (Oportuno)

Clases

Las clases deben ser pequeas

Las clases deben tener solamente una responsabilidad (SRP)


Solo una razon para cambiar

Acoplamiento y Cohesin

Sistemas

Construir es diferente a Usar

Arquitectura sobredimensionada?

Emerger

De acuerdo con Kent Beck un diseo es "simple si sigue las siguientes reglas:

Ejecutar todas las pruebas No contener duplicacin Expresar la intensin del ptrogemador Minimizar el numero de clases y mtodos REFACTORIZAR!!!

Concurrencia

Copias de solo lectura

Si no es necesario bloquear, no lo hagas

Anda mungkin juga menyukai