Download - Clean code
![Page 1: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/1.jpg)
Clean Code Raybert Paredes
![Page 2: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/2.jpg)
http://www.lostechies.com/blogs/derickbailey/archive/2009/02/11/solid-development-principles-in-motivational-pictures.aspx
![Page 3: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/3.jpg)
http://www.albertelli.com/photoarchive/Random_2003/lawn_jenga0002.jpeg
Que pasa cuando nos toca modificar código?
![Page 4: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/4.jpg)
http://blog.rwbenwick.com/wp-content/uploads/2009/12/Reason-For-Leaving-iStock_000008369823Medium.jpg
Da miedo…
![Page 5: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/5.jpg)
http://www.albertelli.com/photoarchive/Random_2003/lawn_jenga0002.jpeg
![Page 6: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/6.jpg)
http://browse.deviantart.com/?qh=§ion=&q=avengers#/d41k54l
Quien nos podrá ayudar?
Pues….
![Page 7: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/7.jpg)
Tampoco…. http://www.pharmatek.com/developers/developers.htm
![Page 8: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/8.jpg)
http://www.catosplace.net/blogs/personal/wp-content/uploads/2011/04/developers.jpg
Nosotros
![Page 9: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/9.jpg)
Pero como??
http://4.bp.blogspot.com/-wLWxI2BZTEo/TbP44yGHHXI/AAAAAAAACMA/ck1BVzrucHo/s1600/bg_doubt.jpg
![Page 10: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/10.jpg)
Etc…
Aprendiendo un poco de…
![Page 11: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/11.jpg)
En donde???
Y otros mas…
![Page 12: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/12.jpg)
Veremos un poco de…
Escrito por: Tío Bob
Craftsmanship
![Page 13: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/13.jpg)
Bueno, manos a la ubre!!
Perdón, a la obra…. ;)
![Page 14: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/15.jpg)
![Page 16: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/16.jpg)
http://www.osnews.com/story/19266/WTFs_m
![Page 17: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/18.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
![Page 19: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/19.jpg)
Clean Code
![Page 20: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/20.jpg)
Leer código debería ser como leer una novela… Grady Booch
![Page 21: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/21.jpg)
Costo de Poseer código no mantenible
![Page 22: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/23.jpg)
The Boy scout Rule
![Page 24: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/24.jpg)
Nombres Significativos
![Page 25: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/25.jpg)
int d; // Tiempo transcurrido en días int tiempoTranscurridoEnDias; int diasTranscurridosDesdeCreacion;
Preferir Nombres claros a cometarios
![Page 26: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/26.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/28.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/29.jpg)
int a = l; if ( O == l ) a = O1; else l = 01;
Evitar la desinformación
![Page 30: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/30.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/31.jpg)
Funciones
![Page 32: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/32.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/33.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/35.jpg)
Comentarios
“Un código bien escrito no debería requerir comentarios”
![Page 36: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/36.jpg)
![Page 37: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/37.jpg)
“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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/38.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/39.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/40.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/41.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/42.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/43.jpg)
Formato
“El código es escrito por desarrolladores no por personas excedidas en alcohol”
![Page 44: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/44.jpg)
Formato vertical
Código como Periódico
![Page 45: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/45.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/46.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/47.jpg)
Formato vertical
![Page 48: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/48.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/49.jpg)
Estructuras de Datos
![Page 50: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/50.jpg)
Abstracción
public interface Vehiculo { double obtenerCapacidadEnGalones(); double ontenerGalonesDeGasolina(); }
public interface Vehiculo { double obtenerPorcentajeDeCombustibleRestante(); }
![Page 51: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/51.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/52.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/53.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/54.jpg)
Manejo de excepciones
![Page 55: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/55.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/56.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/57.jpg)
¡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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/58.jpg)
Limites
![Page 59: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/59.jpg)
Usando código de terceros
![Page 60: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/60.jpg)
• Método 1
• Método 2
Uso
• Función
• Método
Interface • FDDFGRR
• Function133
API
![Page 61: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/61.jpg)
Usando código de que no existe
![Page 62: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/62.jpg)
¿¿¿¿???
¿API?
Interface
Software
![Page 63: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/63.jpg)
Learning Test
![Page 64: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/64.jpg)
Pruebas Unitarias
![Page 65: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/65.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/66.jpg)
• Fast (Rápido) • Independent (Independiente) • Repeteable (Repetible) • Self validating (Autovalidación) • Timely (Oportuno)
![Page 67: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/67.jpg)
Clases
![Page 68: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/68.jpg)
Las clases deben ser pequeñas
Las clases deben tener solamente una responsabilidad (SRP)
“Solo una razon para cambiar”
![Page 69: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/69.jpg)
Acoplamiento y Cohesión
![Page 70: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/70.jpg)
Sistemas
![Page 71: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/71.jpg)
Construir es diferente a Usar
![Page 72: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/72.jpg)
¿Arquitectura sobredimensionada?
![Page 73: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/73.jpg)
Emerger
![Page 74: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/74.jpg)
![Page 75: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/75.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/76.jpg)
Concurrencia
![Page 77: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/77.jpg)
Copias de solo lectura
![Page 78: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/78.jpg)
Si no es necesario bloquear, no lo hagas
![Page 79: Clean code](https://reader034.vdocuments.site/reader034/viewer/2022050904/54795454b4af9fcc458b461c/html5/thumbnails/79.jpg)