Clean code

79
Clean Code Raybert Paredes

description

Resumen de Libro Clean Code por Robert C. Martin

Transcript of Clean code

Page 1: Clean code

Clean Code Raybert Paredes

Page 2: Clean code

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

Page 3: Clean code

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

Que pasa cuando nos toca modificar código?

Page 4: Clean code

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

Da miedo…

Page 5: Clean code

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

Page 6: Clean code

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

Quien nos podrá ayudar?

Pues….

Page 7: Clean code

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

Page 8: Clean code

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

Nosotros

Page 9: Clean code

Pero como??

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

Page 10: Clean code

Etc…

Aprendiendo un poco de…

Page 11: Clean code

En donde???

Y otros mas…

Page 12: Clean code

Veremos un poco de…

Escrito por: Tío Bob

Craftsmanship

Page 13: Clean code

Bueno, manos a la ubre!!

Perdón, a la obra…. ;)

Page 14: Clean code

Entonces, ¿Por qué debería interesarme

escribir mejor mi código?

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

Page 15: Clean code
Page 16: Clean code

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

Page 17: Clean code

Pasamos mas tiempo leyendo código

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

Page 18: Clean code

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

Page 19: Clean code

Clean Code

Page 20: Clean code

Leer código debería ser como leer una novela… Grady Booch

Page 21: Clean code

Costo de Poseer código no mantenible

Page 22: Clean code

El Arte de escribir código entendible

“Escribir código que entienda la computadora es una técnica, escribir código que entienda un ser

humano es un Arte”

¡¡Actitud!!

Page 23: Clean code

The Boy scout Rule

Page 24: Clean code

Nombres Significativos

Page 25: Clean code

int d; // Tiempo transcurrido en días int tiempoTranscurridoEnDias; int diasTranscurridosDesdeCreacion;

Preferir Nombres claros a cometarios

Page 26: Clean code

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 intención

Page 27: Clean code

Usar nombres que revelen su intención

1. ¿Qué tipos de cosas se almacenan en laLista? 2. ¿Cual es el significado del item “CERO”? 3. ¿Cuál es el significado del valor 4? 4. ¿Para que se utiliza la lista que retorna ese método?

Page 28: Clean code

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

Usar nombres que revelen su intención

Page 29: Clean code

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

Evitar la desinformación

Page 30: Clean code

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"; }

Page 31: Clean code

Funciones

Page 32: Clean code

Funciones pequeñas Deberían ser entre 20 y 30 líneas por función

Hacer una sola cosa Single Responsibility Principle

Page 33: Clean code

Un solo nivel de abstracción por función

ingresarOperacionRescate(Operacion operacion); calcularIGV(Operacion operacion);

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

Leer de Arriba hacia abajo

Como un periódico

Page 34: Clean code

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()

Page 35: Clean code

Comentarios

“Un código bien escrito no debería requerir comentarios”

Page 36: Clean code
Page 37: Clean code

“No comentes un mal código, REESCRÍBELO”

private string REGEXP_FORMATO_FECHA =

"[LMJVSD][a-z]{2}\\,\\s[0-9]{2}\\s[EFMAJSOND][a-z]{2}\\s"+ "[0-9]{4}\\s[0-9]{2}\\:[0-9]{2}\\:[0-9]{2}\\sGMT";

private Cliente cliente; private Operacion operacion; private FileStream archivoGrabar; private date fechaLocal; // Ejemplo: "Lun, 02 Apr 2003 22:18:49 GMT"

Page 38: Clean code

Explíca todo en código // Verifica si el empleado es candidato a // obtener beneficios sociales if ((empleado.tipoEmpleado = EMPLEADO_PLANILLAS) && (empleado.edad > 65)) ó if (empleado.esCandidatoBeneficiosSociales())

Page 39: Clean code

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*");

Explicación de una intención: // Este es nuestro mejor intento de obtener una // condición de un gran numero de hilos.

Page 40: Clean code

Buenos Comentarios Clarificación: 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 información // Indica más información relevante

Page 41: Clean code

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

Comentario erróneo: Puede introducir errores Comentarios mandatorios: Tienden a que el se utilice de manera inadecuada Comentarios tipo Diario: Existen repositorios de código fuente para hacer esta tarea

Page 42: Clean code

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

Marcadores de posición: /****************************** Al cerrar una llave: } // if, Si las funciones son cortas no es necesario Código comentado: // if (prueba == true) { }

Page 43: Clean code

Formato

“El código es escrito por desarrolladores no por personas excedidas en alcohol”

Page 44: Clean code

Formato vertical

Código como Periódico

Page 45: Clean code

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();

Page 46: Clean code

Densidad Vertical Comentarios innecesarios suman líneas verticales Distancia vertical Conceptos ligados deben ir verticalmente cerca Declaración de variables ¿Al inicio?, ¿Al final? Variables de instancia Siempre en un mismo lugar Funciones dependientes Deben estar cerca

Page 47: Clean code

Formato vertical

Page 48: Clean code

Densidad horizontal: Google,cuyo.sistema,Android funciona.en los,teléfonos; totalChars+=lineSize; lineWidthHistogram.addLine(lineSize,lineCount); return b*b - 4*a*c;

Alineación horizontal: private Socket socket; private OutputStream output;

private Socket socket; Identacion public CommentWidget(string text){ super(text); }

Reglas de Equipo

Page 49: Clean code

Estructuras de Datos

Page 50: Clean code

Abstracción

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

public interface Vehiculo { double obtenerPorcentajeDeCombustibleRestante(); }

Page 51: Clean code

Abstracción

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); }

Page 52: Clean code

Estructura de Datos / Objetos Código procedural, (usando estructura de datos) hace fácil adicionar nuevas funciones sin cambiar las estructuras de datos existentes. La orientación a objetos, por otro lado, hace fácil adicionar nuevas clases sin tener que cambiar funciones. El código procedural hace difícil adicionar nuevas estructuras de datos porque todas las funciones deben cambiar. La orientación a objetos hace difícil 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

Page 53: Clean code

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 extraños.

• Solo hablar con sus amigos inmediatos.

Page 54: Clean code

Manejo de excepciones

Page 55: Clean code

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) {

Page 56: Clean code

Usar exepciones en vez de codigos de error

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

Page 57: Clean code

¡No retornar NULL!

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

¡No enviar NULL!

Page 58: Clean code

Limites

Page 59: Clean code

Usando código de terceros

Page 60: Clean code

• Método 1

• Método 2

Uso

• Función

• Método

Interface • FDDFGRR

• Function133

API

Page 61: Clean code

Usando código de que no existe

Page 62: Clean code

¿¿¿¿???

¿API?

Interface

Software

Page 63: Clean code

Learning Test

Page 64: Clean code

Pruebas Unitarias

Page 65: Clean code

Primera Regla: Solo puede escribir el código de producción solamente si se ha escrito su respectivo código de prueba. Segunda Regla: Solo puede escribir el código de prueba mínimo necesario que haga que el código de producción falle. Tercera Regla: Solo puede escribir el código de producción necesario para hacer que éste pase su código de prueba.

Page 66: Clean code

• Fast (Rápido) • Independent (Independiente) • Repeteable (Repetible) • Self validating (Autovalidación) • Timely (Oportuno)

Page 67: Clean code

Clases

Page 68: Clean code

Las clases deben ser pequeñas

Las clases deben tener solamente una responsabilidad (SRP)

“Solo una razon para cambiar”

Page 69: Clean code

Acoplamiento y Cohesión

Page 70: Clean code

Sistemas

Page 71: Clean code

Construir es diferente a Usar

Page 72: Clean code

¿Arquitectura sobredimensionada?

Page 73: Clean code

Emerger

Page 74: Clean code
Page 75: Clean code

De acuerdo con Kent Beck un diseño es "simple“ si sigue las siguientes reglas: • Ejecutar todas las pruebas • No contener duplicación • Expresar la intensión del ptrogemador • Minimizar el numero de clases y

métodos

• REFACTORIZAR!!!

Page 76: Clean code

Concurrencia

Page 77: Clean code

Copias de solo lectura

Page 78: Clean code

Si no es necesario bloquear, no lo hagas

Page 79: Clean code