• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Clean code
 

Clean code

on

  • 657 views

Resumen de Libro Clean Code por Robert C. Martin

Resumen de Libro Clean Code por Robert C. Martin

Statistics

Views

Total Views
657
Views on SlideShare
639
Embed Views
18

Actions

Likes
2
Downloads
10
Comments
1

1 Embed 18

https://twitter.com 18

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Clean code Clean code Presentation Transcript

    • Clean CodeRaybert Paredes
    • http://www.lostechies.com/blogs/derickbailey/archive/2009/02/11/solid-development-principles-in-motivational-pictures.aspx
    • Que pasa cuando nos toca modificar código?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
    • Nosotroshttp://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: Tío Bob
    • Bueno, manos a la ubre!! Perdón, a la obra…. ;)
    • Entonces, ¿Por qué debería interesarme escribir mejor mi código?http://www.websoftwareqa.com/wp-content/uploads/2010/07/Computer-Code.jpg
    • http://www.osnews.com/story/19266/WTFs_m
    • Pasamos mas tiempo leyendo códigohttp://3.bp.blogspot.com/_gP9GcIrRlbg/TDw7pXAfmeI/AAAAAAAAB-8/EDZjyqptYFE/s400/frustrated-computer-scream-entrepenuer.jpg
    • Y a veces nos damos cuenta que fuimosnosotros mismos los que escribimos eseDESASTRE!!!! http://photos.pcpro.co.uk/blogs/wp-content/uploads/2010/10/frustrated.jpg
    • Clean Code
    • Leer código debería ser como leer una novela… Grady Booch
    • Costo de Poseer código no mantenible
    • El Arte de escribir código entendible ¡¡Actitud!!“Escribir código que entienda la computadora esuna técnica, escribir código que entienda un ser humano es un Arte”
    • The Boy scout Rule
    • Nombres Significativos
    • Preferir Nombres claros a cometariosint d; // Tiempo transcurrido en díasint tiempoTranscurridoEnDias;int diasTranscurridosDesdeCreacion;
    • Usar nombres que revelen su intenciónpublic 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 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?
    • Usar nombres que revelen su intenciónpublic List<Celda> obtenerCeldasConBanderas(){ List<Celda> celdasConBanderas = new ArrayList<Cell>(); foreach (Celda celda in tableroJuego) if (celda.estaConBandera()) celdasConBanderas.add(celda); return celdasConBanderas;}
    • Evitar la desinformación 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 pequeñasDeberían ser entre 20 y 30 líneas por función Hacer una sola cosa Single Responsibility Principle
    • 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
    • Switch Evitarlo, rompe la regla de solamente una cosa Argumentos Uno es bueno, Cero es mejor EscribirArchivoEnDisco(archivo) FlagEs preferible usar polimorfismo, o crear nuevas funciones Mostrar(true) mostrarEnDesarrollo() mostrarEnPruebas()
    • Comentarios“Un código bien escrito no debería requerir comentarios”
    • “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"
    • Explíca todo en código// Verifica si el empleado es candidato a// obtener beneficios socialesif ((empleado.tipoEmpleado = EMPLEADO_PLANILLAS) && (empleado.edad > 65))óif (empleado.esCandidatoBeneficiosSociales())
    • Buenos ComentariosLegal:// Derechos reservados por Seriva Inc. 2012// Lanzado bajo GNU General Public License version 2.Informativos:// format matched kk:mm:ss EEE, MMM dd, yyyyPattern 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.
    • Buenos ComentariosClarificación:assertTrue(a.compareTo(a) == 0); // a == aassertTrue(a.compareTo(b) != 0); // a != bAdvertencias de consecuencias:// No correr este test a menos que// tengas bastante tiempo (Demora).TODO:// TODO: Tarea a realizarAmpliar información// Indica más información relevante
    • Malos comentariosRedundancia:// Declaro una variable “x” del tipo enteroint x;Comentario erróneo:Puede introducir erroresComentarios mandatorios:Tienden a que el se utilice de manera inadecuadaComentarios tipo Diario:Existen repositorios de código fuente para hacer esta tarea
    • Malos comentariosRuido:/* Constructor por defecto */protected AnnualDateRule()Marcadores de posición:/******************************Al cerrar una llave:} // if, Si las funciones son cortas no es necesarioCódigo comentado:// if (prueba == true) { }
    • Formato“El código es escrito por desarrolladores no por personas excedidas en alcohol”
    • Formato verticalCódigo como Periódico
    • 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 VerticalComentarios innecesarios suman líneas verticalesDistancia verticalConceptos ligados deben ir verticalmente cercaDeclaración de variables¿Al inicio?, ¿Al final?Variables de instanciaSiempre en un mismo lugarFunciones dependientesDeben estar cerca
    • Formato vertical
    • 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;Identacionpublic CommentWidget(string text){ super(text); } Reglas de Equipo
    • Estructuras de Datos
    • Abstracciónpublic interface Vehiculo{ double obtenerCapacidadEnGalones(); double ontenerGalonesDeGasolina();}public interface Vehiculo{ double obtenerPorcentajeDeCombustibleRestante();}
    • Abstracciónpublic 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 / ObjetosCódigo procedural, (usando estructura de datos) hace fáciladicionar nuevas funciones sin cambiar las estructuras dedatos existentes. La orientación a objetos, por otro lado,hace fácil adicionar nuevas clases sin tener que cambiarfunciones.El código procedural hace difícil adicionar nuevasestructuras de datos porque todas las funciones debencambiar. La orientación a objetos hace difícil agregarnuevas funciones porque todas las clases deben cambiar.OO: El comportamiento esta en las clases hijasEstructurado: 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 extraños.• Solo hablar con sus amigos inmediatos.
    • Manejo de excepciones
    • Usar exepciones en vez de codigos de errorpublic 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 errorpublic 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 código deterceros
    • • Método 1 Interface • FDDFGRR• Método 2 • Función • Function133 • Método Uso API
    • Usando código de que no existe
    • Interface ¿¿¿¿???Software ¿API?
    • Learning Test
    • Pruebas Unitarias
    • Primera Regla: Solo puede escribir elcódigo de producción solamente si se haescrito su respectivo código de prueba.Segunda Regla: Solo puede escribir elcódigo de prueba mínimo necesario quehaga que el código de producción falle.Tercera Regla: Solo puede escribir elcódigo de producción necesario parahacer que éste pase su código deprueba.
    • • Fast (Rápido)• Independent (Independiente)• Repeteable (Repetible)• Self validating (Autovalidación)• Timely (Oportuno)
    • Clases
    • Las clases debenser pequeñas Las clases deben tener solamente una responsabilidad (SRP) “Solo una razon para cambiar”
    • Acoplamiento yCohesión
    • Sistemas
    • Construir esdiferente aUsar
    • ¿Arquitecturasobredimensionada?
    • Emerger
    • 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!!!
    • Concurrencia
    • Copias desolo lectura
    • Si no es necesario bloquear, no lo hagas