SlideShare una empresa de Scribd logo
Buenas prácticas
para la construcción de software
Introducción

Índice de contenidos
   1. Definición.
   2. ¿Porqué se desarrolla mal?
   3.¿Porqué debo seguir buenas prácticas?
   4. Principios de la buena programación.
   5. Buenas prácticas en código.
   6. Consejos generales.
   7. Ejemplos basados en Java, pero aplicables a
   “cualquier” lenguaje de programación.
Introducción

Definición
 Por buenas prácticas se entiende un conjunto
 coherente de acciones que han rendido buen o incluso
 excelente servicio en un determinado contexto y que
 se espera que, en contextos similares, rindan similares
 resultados.
 Éstas dependen de las épocas, de las modas y hasta
 de la empresa consultora o del autor que las preconiza.
 No es de extrañar que algunas sean incluso
 contradictorias entre ellas.
                                              (Fuente: wikipedia)
Introducción

¿Porqué se desarrolla mal?
    Falta de tiempo.
    Falta de conocimiento.
    Falta de motivación.
    Acudir a las fuentes equivocadas.
    Fallos en las etapas iniciales de desarrollo de
   software (análisis, requisitos, etc.).
    Etc.
Introducción

¿Porqué buenas prácticas?
    Establece reglas y convenios.
    Aporta higiene al código.
    Estandariza el desarrollo.
    Fácil lectura = Fácil mantenimiento.
    Facilita la escalabilidad del código.
    Facilita la reutilización y la integración de manera
   homogénea.
Principios de buena programación

The Principles of Good Programming
by Christopher Diggins
Principios de buena programación

Listado de los principios
    DRY - Don’t repeat yourself .
    Abstraction Principle.
    KISS (Keep it simple, stupid!) .
    Avoid Creating a YAGNI (You aren’t going to need it).
    Do the simplest thing that could possibly work.
    Don’t make me think.
    Open/Closed Principle.
Principios de buena programación

Listado de los principios
    Write Code for the Maintainer.
    Principle of least astonishment.
    Single Responsibility Principle.
    Minimize Coupling.
    Maximize Cohesion.
    Hide Implementation Details.
    Law of Demeter.
Principios de buena programación

Listado de los principios
    Avoid Premature Optimization.
    Code Reuse is Good.
    Separation of Concerns.
    Embrace Change.
Principios de buena programación

DRY (Don’t repeat yourself)
    No repetirse a sí mismo → evitar la repetición.
Principios de buena programación

DRY (Don’t repeat yourself)
    Evitar la repetición en todas sus posibilidades:
       • No repetir código: funciones, métodos, clases,
       etc. → Reutilizar.
       • No repetir librerías.
       • No repetir documentación.
    En general: NO REPETIR CONOCIMIENTO.
Principios de buena programación

Abstraction Principle
    Principio de abstracción. “Cada pieza de
   funcionalidad significativa en un programa debe ser
   implementada en un sólo lugar del código fuente”
Principios de buena programación

    Abstraction Principle
 class Airplane implements Aircraft {          class Helicopter implements Aircraft {
     public void takeoff() {                       public void takeoff() {
       // algorithm taking off                       // algorithm taking off a helicopter
     }                                             }
     public void fly() {                           public void fly() {
       // algorithm flying an airplane               // algorithm flying a helicopter
     }                                             }
     public void land() {                          public void land() {
       // algorithm landing an airplane              // algorithm landing a helicopter
     }                                             }
 }                                             }

Implementa
                                                   class Pilot {
                        Implementa                    private Aircraft myShip;
                                                      public void setMyShip(Aircraft ship) {
 interface Aircraft {                                    myShip = ship;
     void takeoff();             Un piloto puede      }
     void fly();                                      public void flyMyShip() {
     void land();                pilotar tanto           myShip.takeoff();
 }                               Airplane como           myShip.fly();
                                 Helicopter              myShip.land();
                                                      }
                                                   }
Principios de buena programación

KISS (Keep it simple, stupid!)
    Manténgalo simple, ¡estúpido!. La mejor solución
   a un problema es la más simple.
   Menos código → menos bugs.
Principios de buena programación

KISS (Keep it simple, stupid!)
    Comentar código:
     for( i = 0, j = 100; i < j; i++, j--)   // count to 49
       System.out.println(i);                for( i = 0, j = 100; i < j; i++, j--)
                                               System.out.println(i);

    Hacer test unitarios.
    Nombres (variables, métodos, etc.) descriptivos.

     Date date1;                             Date birthday;
     Date date2;                             Date currentDate;
     Integer myInteger;                      Integer difference;
Principios de buena programación

Avoid Creating a YAGNI
    YAGNI (You aren’t going to need it) – Evitar crear
   algo que no vamos a necesitar. Es común tratar de
   ver el futuro y comenzar a crear abstracciones que
   todavía no estamos usando.
Principios de buena programación

Avoid Creating a YAGNI
    Se pierde tiempo al añadir, probar y documentar la
   funcionalidad no necesaria.
    Si la nueva característica no está bien definida,
   puede que no funcione correctamente, aunque con el
   tiempo sea necesaria.
    El software se hace más grande y más complicado
   innecesariamente.
Principios de buena programación

Avoid Creating a YAGNI
    A menos que existan especificaciones y control de
   revisiones, la funcionalidad no debería ser conocida
   por los programadores ya que podrían hacer uso de
   ella.
    Añadir una nueva característica innecesaria puede
   sugerir añadir otras nuevas características
   innecesarias.
Principios de buena programación

Do the simplest thing that ...
    Do the simplest thing that could possibly work.
   Haga lo más simple que funcione.
Principios de buena programación

Don’t make me think
    No me haga pensar. Evitar la pregunta ¿y ahora,
   cómo lo hago? Los nombres de las funciones,
   variables, etc. deben declarar claramente lo que
   hacen.
Principios de buena programación

Don’t make me think

public void print(String str1, Date date1, List myList) {

      // Algorithm ...
}




public void printBirthdayPartyInfo(String userName,
    Date birthday, List<Guest> guestsList) {

      // Algorithm...
}
Principios de buena programación

Open/Closed Principle
    Principio Abierto/Cerrado. Clases, módulos,
   funciones, etc. deben estar abiertas a la extensión.
   Escribir clases, no para que otros las modifiquen,
   sino para que se usen y extiendan.
Principios de buena programación

Open/Closed Principle
    Beneficios del principio Open/Closed:
       • Robustez → No se modifican las clases ya
       probadas.
       • Flexibilidad → Se facilita la implementación de
       nuevos requisitos o cambios en ellos.
       • Facilita las pruebas → menos propenso a
       errores.
Principios de buena programación

Open/Closed Principle
 class Student {
     String name;
     double percentage;
     int uid;
     [...]

 class StudentBatch {
     private List<Student> studentList;
     [...]
     public void getSutdentMarkMap(HashMap<Integer, Double> studentMarkMap) {
         for (Student student : studentList) {
             studentMarkMap.put(student.uid, student.percentage);
         }
     }
     [...]


 public void getSutdentMarkMap(Map<Integer, Double> studentMarkMap) {
     for (Student student : studentList) {
         studentMarkMap.put(student.uid, student.percentage);
     }
 }
Principios de buena programación

Write Code for the Maintainer
    Escriba código pensando en el que va a
   mantenerlo. “Escriba el código como si el que tuviera que
   mantenerlo fuera un psicópata asesino que conoce donde
   vives”.
Principios de buena programación

Principle of least astonishment
    Principio del menor asombro. Ejemplo: el
   nombre de una función debería corresponder con lo
   que hace.
Principios de buena programación

Principle of least astonishment
 public void addInstance(String className) {
     try {
         Class clazz = Class.forName(className);
         objectSet.add(clazz.newInstance());
     }catch (Exception ex) {
         throw new RuntimeException(ex);                Este método hace más
     }                                                  de lo que debería.
 }
                                                        Además de añadir una
                                                        instancia, también la
                                                        crea.
                                                        Se debería cambiar de
 public void createAndAddInstance(String className) {   nombre o crear dos
     try {
         Class clazz = Class.forName(className);        métodos.
         objectSet.add(clazz.newInstance());
     }catch (Exception ex) {
         throw new RuntimeException(ex);
     }
 }
Principios de buena programación

Single Responsibility Principle
     Principio de responsabilidad única. Un
    componente de código debe ejecutar una única y
    bien definida tarea.
Principios de buena programación

Single Responsibility Principle
 public void insertUser(User user){ … }
 public void deleteUser(User user){ … }
 public void updateUser(User user){ … }




                                                       ¿ QUÉ HACEN
 public void updateUser(User user) {
     //Se actualiza el propio usuario
                                                       ESTAS LLAMADAS
     userManager.update();                             AQUÍ ?
     //Se actualizan estadisticas para el usuario
     updateStatistics(user);

     //Se eliminan los ficheros asociados al usuario
     removeFiles(user);
 }
Principios de buena programación

Minimize Coupling
    Minimizar el acoplamiento. Cada componente
   (bloque de código, clase, función, etc.) debe
   minimizar las dependencias de otros componentes.
Principios de buena programación

Maximize Cohesion
    Maximizar cohesión. Evitar implementar en un
   componente dos funcionalidades que no están
   relacionadas, cumpliendo tareas que no tienen
   relación.
Principios de buena programación

      Maximize Cohesion
public class CoffeeCup {                        Public class CoffeeCup {
  private int innerCoffee;                        private int innerCoffee;
  public void add(int amount) {                   public void add(int amount) {
    innerCoffee += amount;                            innerCoffee += amount;
  }                                               }
  public int remove(boolean all, int amount){     public int releaseOneSip(int sipSize){
      int returnValue = 0;                            int sip = sipSize;
      if (all) {                                      if (innerCoffee < sipSize) {
          int allCoffee = innerCoffee;                    sip = innerCoffee;
          innerCoffee = 0;                            }
          returnValue = allCoffee;                    innerCoffee -= sip;
      } else {                                        return sip;
          int sip = amount;                       }
          if (innerCoffee < amount) {             public int spillEntireContents() {
               sip = innerCoffee;                     int all = innerCoffee;
      }                                               innerCoffee = 0;
          innerCoffee -= sip;                         return all;

                                                                        Hi cohesion
          returnValue = sip;                      }
      }                                         }
      return returnValue;

                           Low cohesion
  }
}
Principios de buena programación

Hide Implementation Details
    Ocultar detalles de implementación. En C# o Java
   → Interfaces. Usar correctamente modificadores de
   acceso: public, private y protected.
Principios de buena programación

Hide Implementation Details

ArrayList<String> users = new ArrayList<String>();


         Usar interfaces en vez de implementaciones.
         Se ocultan detalles de implementación y se
         deja libertad para elegir (ArrayList, LinkedList,
         etc.)
List<String> users = new ArrayList<String>();
Principios de buena programación

Avoid Premature Optimization
    Evitar la optimización prematura. Evitar pensar
   optimizar código, si apenas lo estamos armando. Ir
   armando el código de tal forma que podamos
   refactorizarlo.
Principios de buena programación

Code Reuse is Good
    La reutilización de código es buena. En Java →
   Apache Commons.
Principios de buena programación

Code Reuse is Good

     Necesito un método que
     abrevie un string en función
     de un tamaño determinado...




                     Apache Commons nos lo proporciona
                     public static String abbreviate(String str,
                     int maxWidth)

                     //Ejemplo:
                     StringUtils.abbreviate("abcd", 2) = "ab..."
Principios de buena programación

Embrace Change
    Abraza el cambio. El cambio es inevitable en el
   desarrollo de software. No hay que luchar contra el
   cambio, sino trabajar para estar preparado para él →
   Programación ágil, integración continua, Scrum, etc.
Buenas prácticas en código

Code conventions ¿para qué?
    Alto % del coste del software → mantenimiento.
    Casi ningún software se mantiene durante toda su
   vida por el autor original.
    Mejora la legibilidad del software, permitiendo a los
   ingenieros a entender el nuevo código con mayor
   rapidez y en profundidad.
    Código fuente es igual que cualquier otro producto
   → asegurarse de que está tan bien empaquetado y
   limpio como cualquier otro producto.
Buenas prácticas en código

Java Code conventions
    Convenciones estándar de Sun (Oracle) para
   seguir y recomendar que otros sigan.
    Cubre los nombres de archivo, organización de
   archivos, sangría, comentarios, declaraciones,
   sentencias, espacios en blanco e incluye un ejemplo
   de código.
 codeconventions-150003.pdf
Ejemplos Code conventions

Indentación
 //DON’T USE THIS INDENTATION
 if ((condition1 && condition2)
             || (condition3 && condition4)
             ||!(condition5 && condition6)) { //BAD WRAPS
             doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS
 }
 //USE THIS INDENTATION INSTEAD
 if ((condition1 && condition2)
                         || (condition3 && condition4)
                         ||!(condition5 && condition6)) {
             doSomethingAboutIt();
 }
 //OR USE THIS
 if ((condition1 && condition2) || (condition3 && condition4)
                         ||!(condition5 && condition6)) {
             doSomethingAboutIt();
 }
Ejemplos Code conventions

Comentarios
   Cuatro tipos de comentarios:
      • Block
      • Single-line
      • Trailing
      • End-of-line
Ejemplos Code conventions

Clases e Interfaces
    Para programar Clases e Interfaces en Java:
       • Sin espacios entre el nombre de un método y
       el paréntesis “(“.
       • La llave “{” debe aparecer al final de la línea y
       en la misma línea que la declaración.
       • La llave “}” empieza una línea por sí misma,
       indentada con la línea que contiene la llave “{”.
Ejemplos Code conventions

Clases e Interfaces
  class Sample extends Object {
          int ivar1;
          int ivar2;

         Sample(int i, int j) {
                ivar1 = i;
                ivar2 = j;
         }

         int emptyMethod() {}

         ...
  }
Ejemplos Code conventions

Excepciones
   No dejar bloques “catch” vacíos.
   Los bloques de excepciones seguirán el siguiente
  formato:
      try {
              statements;
      } catch (ExceptionClass e) {
              statements;
      }
Buenas prácticas en código

Herramientas Java
    Checkstyle: Herramienta para ayudar a escribir
   código que siga estándares. Plugin para Eclipse.
    PMD: Analiza y busca potenciales problemas en el
   código. Plugin para Eclipse.
       • Sentencias vacías try/catch, etc.
       • Variables, parámetros, etc. no usados
       • Mal uso de String/StringBuffer
       • Sentencias "if" innecesarias, for → while, etc.
       • Código copiado y pegado.
Buenas prácticas

Recursos Java
    Libro “Effective Java” (Joshua Bloch)
    Java Best Practices: http://www.javapractices.com/
    J2EE Best Practices: http://www.precisejava.com/
Buenas prácticas

Programación: Errores comunes
    Fiabilidad de los parámetros de entrada: No
   asegurarse de que los parámetros recibidos son los
   que esperamos.
    Fiabilidad de los valores: No comprobar si un
   elemento tiene valor antes de acceder a él.
    Elementos en colecciones: No asegurar se de
   que un array o colección tenga valor y contenga
   elementos antes de acceder a ellos.
    No comentar. (Sin comentarios...).
Buenas prácticas

Programación: Errores comunes
    Acceso a colecciones: No comprobar si existe
   elemento para un índice antes de acceder a él en
   una colección indexada.
    No liberar recursos adecuadamente.
    Recursividad: El método recursivo infinito.
    Malas prácticas: Utilizar incorrectamente técnicas
   conocidas.
Programación: Errores comunes

  Fiabilidad de parámetros de entrada
          Los parámetros recibidos por un método «público»,
         es decir expuesto al mundo exterior, nunca son
         confiables.
public static double metodoExpuesto(int nuncaMenorQue4, int nunca0){
    return nuncaMenorQue4 / nunca0 ;
}
public static void main(String... args){
    StaticDemo.metodoExpuesto(2, 0);
    //El metodo fallara despues de ejecutarse
}


public void publicarNoticia(Noticia noticia, int importancia){
    if (noticia== null){
        throw new ArgumentNullException("Parametro noticia no puede ser null");
    }
    //A partir de aqui, ira el codigo para publicar la noticia...
}
Programación: Errores comunes

 Fiabilidad de los valores
         Acceder a los elementos sin antes comprobar si
        tienen un valor.
Bar foo = getFooBar();
foo.ToString();

//Acceder a metodos de "foo" sin comprobar, puede fallar si getFooBar
devuelve null




Bar foo = getFooBar();
if(foo != null) {
    foo.ToString();
}
Programación: Errores comunes

 Elementos en colecciones
         No asegurarse de que un array o colección tenga
        valor y contenga elementos antes de acceder a ellos.
List<MiNumero> numeros= obtenerNumeros();
txtNumero1.text = numeros[0].toString();
txtNumero2.text = numeros[1].toString();

//Si numeros es null o numeros no tiene elementos este codigo fallara



List<MiNumero> numeros= obtenerNumeros();
if (numeros != null && numeros.size() > 0) {
    txtNumero1.text = numeros.get(0).toString();
    txtNumero2.text = numeros.get(1).toString();
}
Programación: Errores comunes

No comentar
   Comentar el código también es programar,pero se
  debe comentar con criterio.
Programación: Errores comunes

    Acceso a colecciones
         Antes de acceder a un elemento de una colección
         indexada se debe comprobar si la colección tiene al
         menos el número de elementos que necesitamos.
for (int i = 0; i < cargarEmpresas().size(); i++) {

     if (cargarEmpresas().get(i) == ""){
         gridView.rows[i].cells[7].visible = false;
     }                                                        ¡HORROR!
}


for (int i = 0; i < empresasSize; i++) {
    if (gridView.rows.count > i && "".equals(empresas.get(i))){
        gridView.rows[i].cells[7].visible = false;
    }
}
Programación: Errores comunes

 No liberar recursos
         Grave error no liberar recursos adecuadamente.
public void saveData() {
    Connection cnn;
    try{
         cnn = new SqlConnection(cnnString);
         cnn.open();
    } catch (Exception e) {
         System.out.println("Se ha producido un erro de base de datos");
         e.printStackTrace();
    }
    finally {
         if (cnn != null) {
             cnn.close();
          }
    }
}
Programación: Errores comunes

    Recursividad
          El típico fallo al utilizar recursividad es no poner un
         límite a las llamadas recursivas.
static long LastFibonacciNumber(long anterior1, long anterior2) {

     long numero = anterior1 + anterior2;
     Console.write(numero + " ");
     numero = lastFibonacciNumber(anterior2, numero);
     return numero;
}

          Para evitar el conocido error de "stack overflow" →
         utilizar líneas de control que permitan dar fin al
         anidamiento de llamadas recursivas.
Programación: Errores comunes

Malas prácticas
   Utilizar incorrectamente técnicas conocidas.
   Habitualmente se implementa mal una técnica o
  patrón conocidos.
   Avoid basic style errors → javapractices.
   Common Java Mistakes → javaprogrammingforums
   Java Anti-Patterns → www.odi.ch
Buenas prácticas




Ejemplos
Buenas prácticas

Consejos generales
    Seguir estándares.
    Seguir patrones de diseño.
    Reutilizar código → No reinventar la rueda.
    Usar librerías “reconocidas”, documentadas, etc.
   Ejemplo: Apache Commons
    Test unitarios.
    Conocer bien nuestro entorno de desarrollo (IDE):
   shortcuts, plugins, etc.
Buenas prácticas

Consejos generales
    Refactorización: Técnica de ingeniería de
   software para reestructurar código fuente, alterando
   su estructura interna sin cambiar su comportamiento
   externo.
    Comentar de forma completa pero no excesiva.
    Seguir “buenas prácticas” del Framework elegido.
    Nombrar “con sentido” las clases, variables, etc.
Buenas prácticas

Consejos generales
    Leer código ajeno. Que otros lean tú código.
    Pautas para leer código de una manera efectiva:
Buenas prácticas

Consejos generales
    Tener en cuenta el rendimiento: El rendimiento
   de nuestras aplicaciones es tan importante como
   otros criterios de aceptación. Criterios a tener en
   cuenta para medir el rendimiento:
       • Recursos hardware del cliente.
       • Realizar pruebas de rendimiento en un entorno
       que simule el hardware mínimo aceptado.
       • Hacer pruebas REALES.
Buenas prácticas

Consejos generales
  Buena gestión de logs: Los logs son las trazas o
 rastros que deja una aplicación. Nos brindarán
 información valiosa sobre qué está ocurriendo en
 nuestro sistema y dónde aplicar las mejoras más
 inmediatas.
Buenas prácticas

Consejos generales
    Organiza el desarrollo:
       • Define una sintaxis de programación común
       para tu equipo de trabajo.
       • Define una estructura de directorios basada
       en la separación de conceptos:
              • Código fuente.
              • Documentación.
              • Recursos.
              • Productos finales.
              • Divide proyectos en librerías.
Buenas prácticas

Consejos generales
    Usa sistemas de control de versiones para
   compartir el trabajo con el equipo. Usándolos se
   aprende a usarlos.
   Libro gratuito → http://www.ericsink.com/vcbe/
    Usa herramientas o prepara scripts que te permitan
   automatizar procesos productivos. → ANT, Maven
   etc.
    Nightly builds → Generar productos finales
   “frescos” todos los días.
Buenas prácticas

Consejos generales
    Comparte conocimiento. Wiki, blogs, reuniones,
   charlas, etc.
Buenas prácticas

Consejos generales
    Cobertura TDD: Test Driven Development →
   http://cobertura.sourceforge.net/
    Integración continua →
   http://continuum.apache.org/
    Software para la gestión de tareas/bugs →
   http://www.redmine.org/, http://www.mantisbt.org/,
   http://trac.edgewall.org/, etc.
Material extra


Buenas prácticas
  en el uso de
  repositorios
Buenas prácticas

Referencias
    Principios de buena programación: The Principles
   of Good Programming, Christopher Diggins.
    Java Code Conventions:
   http://www.oracle.com/technetwork/java/codeconvent
   ions-150003.pdf
    Effective Java. Joshua Bloch.
    MasterDISS_DesignPatterns, Iker Jamardo.
Buenas prácticas

Referencias
    Imágenes
       • DRY: http://www.dreamstime.com/royalty-free-stock-photo-don
       %27t-repeat-yourself-acronym-image20103645
       • Abstraction Principle: http://www.danpontefract.com/give-
       piece-a-chance/
       • Open/Closed Principle:
       http://www.vitalygorn.com/blog/image.axd?picture=Open-Closed.jpg
       • YAGNI: http://blog.thescrumster.com/?tag=yagni
       • Don't make me think:
       http://riyajs.files.wordpress.com/2011/03/usability_testing.jpg
       • KISS: http://milldesk.com.br/en/k-i-s-s-keep-it-simple-stupid/
       • Write Code for the Maintainer:
       http://notio.com.ar/adjuntos/imagenes/000/102/0000102304.jpg
Buenas prácticas

Referencias
    Imágenes
       • YAGNI: http://blog.thescrumster.com/?tag=yagni
       • Don't make me think:
       http://riyajs.files.wordpress.com/2011/03/usability_testing.jpg
       • KISS: http://milldesk.com.br/en/k-i-s-s-keep-it-simple-stupid/
       • Write Code for the Maintainer:
       http://notio.com.ar/adjuntos/imagenes/000/102/0000102304.jpg
       • Single Responsibility Principle:
       http://www.colourbox.com/preview/1995285-118643-3d-
       illustration-of-one-selected-target-with-three-arrows-right-target-
       concept.jpg
Buenas prácticas

Referencias
    Imágenes
       • Maximize Cohesion: http://vision2030.bwd.public-
       i.tv/viewfinder_core/public/images/uploaded/l_1259326852_cohe
       sion.png
       • Hide Implementation Details: http://geek.pe /wp-
       content/uploads/2010/04/como-ocultar-tu-ip-al-enviar-un-correo-
       gmail-hotmail.jpg
       • Avoid Premature Optimization:
       http://rlv.zcache.es/la_optimizacion_prematura_es_la_raiz_de_to
       do_el_ma_im%C3%A1n-p147403910183181037en878_210.jpg
       • Code Reuse is Good:
       http://www.alexanderinteractive.com/blog/reuse-code.jpg
Buenas prácticas

Referencias
    Imágenes
       • Embrace Change: http://static.eharmony.com/dating-
       advice/wp-content/uploads/images/are-you-caught-in-the-
       comfort-zone-trap-learning-to-embrace-change-large.jpg
       • Minimize Coupling:
       http://lh3.ggpht.com/_huul_BKMb4M/S2wKiTapibI/AAAAAAAAG
       ek/h9Qs-AKcGa8/tuerca.gif
Buenas prácticas
para la construcción de software


           FIN
                              Iker Canarias
                       iker.canarias (gmail)

Más contenido relacionado

La actualidad más candente

無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享
Win Yu
 
Dependency injection ppt
Dependency injection pptDependency injection ppt
Dependency injection ppt
Swati Srivastava
 
Infografia Excepciones y aserciones
Infografia Excepciones y asercionesInfografia Excepciones y aserciones
Infografia Excepciones y aserciones
Benjamín Joaquín Martínez
 
Diseño de WebApps
Diseño de WebAppsDiseño de WebApps
Diseño de WebApps
Ramiro Estigarribia Canese
 
Cypress en un mundo lleno de Selenium
Cypress en un mundo lleno de SeleniumCypress en un mundo lleno de Selenium
Cypress en un mundo lleno de Selenium
Software Guru
 
Asp .net
Asp .netAsp .net
Asp .net
mellcv
 
TDD (Test-Driven Development)
TDD (Test-Driven Development)TDD (Test-Driven Development)
TDD (Test-Driven Development)
Senior Dev
 
SCRUM Desarrollo ágil
SCRUM Desarrollo ágilSCRUM Desarrollo ágil
SCRUM Desarrollo ágil
ricardoroldan
 
Introducción a PHP
Introducción a PHPIntroducción a PHP
Introducción a PHP
Jose Emilio Labra Gayo
 
Alice 3
Alice 3Alice 3
TypeScript Introduction
TypeScript IntroductionTypeScript Introduction
TypeScript Introduction
Dmitry Sheiko
 
Refactorización de Aplicaciones Orientadas a Objetos a Aspectos
Refactorización de Aplicaciones Orientadas a Objetos a AspectosRefactorización de Aplicaciones Orientadas a Objetos a Aspectos
Refactorización de Aplicaciones Orientadas a Objetos a Aspectos
Juan Carlos Olivares Rojas
 
Ciclo de vida del software
Ciclo de vida del softwareCiclo de vida del software
Ciclo de vida del software
masferrer1998
 
Flex (fast lexical analyzer generator )
Flex (fast lexical analyzer generator )Flex (fast lexical analyzer generator )
Flex (fast lexical analyzer generator )
Sandip Basnet
 
El proceso unificado introduccion
El proceso unificado   introduccionEl proceso unificado   introduccion
El proceso unificado introduccion
Jose Diaz Silva
 
5. Interacción con el usuario: eventos y formularios
5. Interacción con el usuario: eventos y formularios5. Interacción con el usuario: eventos y formularios
5. Interacción con el usuario: eventos y formularios
Laura Folgado Galache
 
Herencia
HerenciaHerencia
Pruebas Unitarias
Pruebas Unitarias Pruebas Unitarias
Pruebas Unitarias
Emerson Garay
 
2. Manejo de la sintaxis del lenguaje
2. Manejo de la sintaxis del lenguaje2. Manejo de la sintaxis del lenguaje
2. Manejo de la sintaxis del lenguaje
Laura Folgado Galache
 
Testing Angular
Testing AngularTesting Angular
Testing Angular
Lilia Sfaxi
 

La actualidad más candente (20)

無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享
 
Dependency injection ppt
Dependency injection pptDependency injection ppt
Dependency injection ppt
 
Infografia Excepciones y aserciones
Infografia Excepciones y asercionesInfografia Excepciones y aserciones
Infografia Excepciones y aserciones
 
Diseño de WebApps
Diseño de WebAppsDiseño de WebApps
Diseño de WebApps
 
Cypress en un mundo lleno de Selenium
Cypress en un mundo lleno de SeleniumCypress en un mundo lleno de Selenium
Cypress en un mundo lleno de Selenium
 
Asp .net
Asp .netAsp .net
Asp .net
 
TDD (Test-Driven Development)
TDD (Test-Driven Development)TDD (Test-Driven Development)
TDD (Test-Driven Development)
 
SCRUM Desarrollo ágil
SCRUM Desarrollo ágilSCRUM Desarrollo ágil
SCRUM Desarrollo ágil
 
Introducción a PHP
Introducción a PHPIntroducción a PHP
Introducción a PHP
 
Alice 3
Alice 3Alice 3
Alice 3
 
TypeScript Introduction
TypeScript IntroductionTypeScript Introduction
TypeScript Introduction
 
Refactorización de Aplicaciones Orientadas a Objetos a Aspectos
Refactorización de Aplicaciones Orientadas a Objetos a AspectosRefactorización de Aplicaciones Orientadas a Objetos a Aspectos
Refactorización de Aplicaciones Orientadas a Objetos a Aspectos
 
Ciclo de vida del software
Ciclo de vida del softwareCiclo de vida del software
Ciclo de vida del software
 
Flex (fast lexical analyzer generator )
Flex (fast lexical analyzer generator )Flex (fast lexical analyzer generator )
Flex (fast lexical analyzer generator )
 
El proceso unificado introduccion
El proceso unificado   introduccionEl proceso unificado   introduccion
El proceso unificado introduccion
 
5. Interacción con el usuario: eventos y formularios
5. Interacción con el usuario: eventos y formularios5. Interacción con el usuario: eventos y formularios
5. Interacción con el usuario: eventos y formularios
 
Herencia
HerenciaHerencia
Herencia
 
Pruebas Unitarias
Pruebas Unitarias Pruebas Unitarias
Pruebas Unitarias
 
2. Manejo de la sintaxis del lenguaje
2. Manejo de la sintaxis del lenguaje2. Manejo de la sintaxis del lenguaje
2. Manejo de la sintaxis del lenguaje
 
Testing Angular
Testing AngularTesting Angular
Testing Angular
 

Similar a Buenas prácticas para la construcción de software

Buenasprcticas
BuenasprcticasBuenasprcticas
Buenasprcticas
Juan Baudazio Sanchez
 
Informatica
InformaticaInformatica
Tap04 poo
Tap04 pooTap04 poo
Clean Code (Presentacion interna en Virtual Software)
Clean Code (Presentacion interna en Virtual Software)Clean Code (Presentacion interna en Virtual Software)
Clean Code (Presentacion interna en Virtual Software)
jmiguel rodriguez
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
jaircazarin
 
PRUEBA OFIMATICA WEB
PRUEBA OFIMATICA WEBPRUEBA OFIMATICA WEB
PRUEBA OFIMATICA WEB
Yeison11020
 
Adapter pattern easy
Adapter pattern easyAdapter pattern easy
Adapter pattern easy
Laura Gonzalez Fernandez
 
Jordan solis (1)
Jordan solis (1)Jordan solis (1)
Jordan solis (1)
giovanni ascencio
 
Lenguaje c ++ guía para programadores
Lenguaje c ++  guía para programadoresLenguaje c ++  guía para programadores
Lenguaje c ++ guía para programadores
Aldo Hernán Zanabria Gálvez
 
Cuestionario
CuestionarioCuestionario
Cuestionario
Leonardo Moctezuma
 
Cuestionario
CuestionarioCuestionario
Cuestionario
Jose Nava
 
Guia practica secuenciales eclipse java 01
Guia practica secuenciales eclipse java 01Guia practica secuenciales eclipse java 01
Guia practica secuenciales eclipse java 01
Emerson Garay
 
Met2 07 01-introduccion_poo
Met2 07 01-introduccion_pooMet2 07 01-introduccion_poo
Met2 07 01-introduccion_poo
Aldo Hernán Zanabria Gálvez
 
Junit y Jmock
Junit y JmockJunit y Jmock
Junit y Jmock
kaolong
 
Introducción a Unit Testing y TDD
Introducción a Unit Testing y TDDIntroducción a Unit Testing y TDD
Introducción a Unit Testing y TDD
Fernando Perez
 
01 fundamentos-java
01 fundamentos-java01 fundamentos-java
01 fundamentos-java
JAVIER CAJAHUAMAN MALLCCO
 
Tc2 301403 21
Tc2 301403 21Tc2 301403 21
Tc2 301403 21
Emerson Quintero
 
Segundo laboratorio de Android
Segundo laboratorio de AndroidSegundo laboratorio de Android
Segundo laboratorio de Android
GDG Cali
 
Greenfoot 6
Greenfoot 6Greenfoot 6
Greenfoot 6
Christian Medina
 
Javascript OOP
Javascript OOPJavascript OOP
Javascript OOP
Gabriel Chertok
 

Similar a Buenas prácticas para la construcción de software (20)

Buenasprcticas
BuenasprcticasBuenasprcticas
Buenasprcticas
 
Informatica
InformaticaInformatica
Informatica
 
Tap04 poo
Tap04 pooTap04 poo
Tap04 poo
 
Clean Code (Presentacion interna en Virtual Software)
Clean Code (Presentacion interna en Virtual Software)Clean Code (Presentacion interna en Virtual Software)
Clean Code (Presentacion interna en Virtual Software)
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
 
PRUEBA OFIMATICA WEB
PRUEBA OFIMATICA WEBPRUEBA OFIMATICA WEB
PRUEBA OFIMATICA WEB
 
Adapter pattern easy
Adapter pattern easyAdapter pattern easy
Adapter pattern easy
 
Jordan solis (1)
Jordan solis (1)Jordan solis (1)
Jordan solis (1)
 
Lenguaje c ++ guía para programadores
Lenguaje c ++  guía para programadoresLenguaje c ++  guía para programadores
Lenguaje c ++ guía para programadores
 
Cuestionario
CuestionarioCuestionario
Cuestionario
 
Cuestionario
CuestionarioCuestionario
Cuestionario
 
Guia practica secuenciales eclipse java 01
Guia practica secuenciales eclipse java 01Guia practica secuenciales eclipse java 01
Guia practica secuenciales eclipse java 01
 
Met2 07 01-introduccion_poo
Met2 07 01-introduccion_pooMet2 07 01-introduccion_poo
Met2 07 01-introduccion_poo
 
Junit y Jmock
Junit y JmockJunit y Jmock
Junit y Jmock
 
Introducción a Unit Testing y TDD
Introducción a Unit Testing y TDDIntroducción a Unit Testing y TDD
Introducción a Unit Testing y TDD
 
01 fundamentos-java
01 fundamentos-java01 fundamentos-java
01 fundamentos-java
 
Tc2 301403 21
Tc2 301403 21Tc2 301403 21
Tc2 301403 21
 
Segundo laboratorio de Android
Segundo laboratorio de AndroidSegundo laboratorio de Android
Segundo laboratorio de Android
 
Greenfoot 6
Greenfoot 6Greenfoot 6
Greenfoot 6
 
Javascript OOP
Javascript OOPJavascript OOP
Javascript OOP
 

Más de Iker Canarias

Patrones de diseño de software
Patrones de diseño de softwarePatrones de diseño de software
Patrones de diseño de software
Iker Canarias
 
Subversion - buenas prácticas
Subversion - buenas prácticasSubversion - buenas prácticas
Subversion - buenas prácticas
Iker Canarias
 
Breve introducción a Apache Ant
Breve introducción a Apache AntBreve introducción a Apache Ant
Breve introducción a Apache Ant
Iker Canarias
 
Introducción a JUnit
Introducción a JUnitIntroducción a JUnit
Introducción a JUnit
Iker Canarias
 
Integración de aplicaciones Java
Integración de aplicaciones JavaIntegración de aplicaciones Java
Integración de aplicaciones Java
Iker Canarias
 
Frameworks J2EE
Frameworks J2EEFrameworks J2EE
Frameworks J2EE
Iker Canarias
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en Java
Iker Canarias
 
Introducción a JEE
Introducción a JEEIntroducción a JEE
Introducción a JEE
Iker Canarias
 
Introducción a Tomcat
Introducción a TomcatIntroducción a Tomcat
Introducción a Tomcat
Iker Canarias
 
Introducción a JBoss
Introducción a JBossIntroducción a JBoss
Introducción a JBoss
Iker Canarias
 
Introducción a Servidor HTTP Apache
Introducción a Servidor HTTP ApacheIntroducción a Servidor HTTP Apache
Introducción a Servidor HTTP Apache
Iker Canarias
 

Más de Iker Canarias (11)

Patrones de diseño de software
Patrones de diseño de softwarePatrones de diseño de software
Patrones de diseño de software
 
Subversion - buenas prácticas
Subversion - buenas prácticasSubversion - buenas prácticas
Subversion - buenas prácticas
 
Breve introducción a Apache Ant
Breve introducción a Apache AntBreve introducción a Apache Ant
Breve introducción a Apache Ant
 
Introducción a JUnit
Introducción a JUnitIntroducción a JUnit
Introducción a JUnit
 
Integración de aplicaciones Java
Integración de aplicaciones JavaIntegración de aplicaciones Java
Integración de aplicaciones Java
 
Frameworks J2EE
Frameworks J2EEFrameworks J2EE
Frameworks J2EE
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en Java
 
Introducción a JEE
Introducción a JEEIntroducción a JEE
Introducción a JEE
 
Introducción a Tomcat
Introducción a TomcatIntroducción a Tomcat
Introducción a Tomcat
 
Introducción a JBoss
Introducción a JBossIntroducción a JBoss
Introducción a JBoss
 
Introducción a Servidor HTTP Apache
Introducción a Servidor HTTP ApacheIntroducción a Servidor HTTP Apache
Introducción a Servidor HTTP Apache
 

Último

aplicaciones de sistema de informacion geografico
aplicaciones de sistema de informacion geograficoaplicaciones de sistema de informacion geografico
aplicaciones de sistema de informacion geografico
cyberquiximies
 
Informe_mc_bombas_Warman_001-WEIR vulco.pdf
Informe_mc_bombas_Warman_001-WEIR vulco.pdfInforme_mc_bombas_Warman_001-WEIR vulco.pdf
Informe_mc_bombas_Warman_001-WEIR vulco.pdf
Rubén Cortes Zavala
 
FORMATO DE de Instrucción Clínica.pdf
FORMATO DE  de Instrucción Clínica.pdfFORMATO DE  de Instrucción Clínica.pdf
FORMATO DE de Instrucción Clínica.pdf
HenrySalinas17
 
_Manejo de Riesgos en el Laboratorio.pdf
_Manejo de Riesgos en el Laboratorio.pdf_Manejo de Riesgos en el Laboratorio.pdf
_Manejo de Riesgos en el Laboratorio.pdf
correodetareas
 
11. Legislación Aplicada a la Informática.pdf
11. Legislación Aplicada a la Informática.pdf11. Legislación Aplicada a la Informática.pdf
11. Legislación Aplicada a la Informática.pdf
PanchoChangue
 
Catalogo-Voxtech- accesorios radios RF.pdf
Catalogo-Voxtech- accesorios radios RF.pdfCatalogo-Voxtech- accesorios radios RF.pdf
Catalogo-Voxtech- accesorios radios RF.pdf
walter729637
 
Evolución, características, aplicación, ventajas y desventajas de las TIC
Evolución, características, aplicación, ventajas y desventajas de las TICEvolución, características, aplicación, ventajas y desventajas de las TIC
Evolución, características, aplicación, ventajas y desventajas de las TIC
Henry W. Zavala
 
El uso de las TIC en la vida cotidiana.pptx
El uso de las TIC en la vida cotidiana.pptxEl uso de las TIC en la vida cotidiana.pptx
El uso de las TIC en la vida cotidiana.pptx
Katia Reyes
 
Presentación Redes Sociales Moderno Morado.pdf
Presentación Redes Sociales Moderno Morado.pdfPresentación Redes Sociales Moderno Morado.pdf
Presentación Redes Sociales Moderno Morado.pdf
anniehuanhuayo80
 
Generaciones de Computadoras .
Generaciones de Computadoras                 .Generaciones de Computadoras                 .
Generaciones de Computadoras .
gregory760891
 
BIOSENSORES BASADOS EN NANOTECNOLOGÍA.pdf
BIOSENSORES BASADOS EN NANOTECNOLOGÍA.pdfBIOSENSORES BASADOS EN NANOTECNOLOGÍA.pdf
BIOSENSORES BASADOS EN NANOTECNOLOGÍA.pdf
sunwndniel
 
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
241578066
 
DN Consultores | Una mirada al mercado de fibra en Perú
DN Consultores | Una mirada al mercado de fibra en PerúDN Consultores | Una mirada al mercado de fibra en Perú
DN Consultores | Una mirada al mercado de fibra en Perú
estudios22
 
Reconocimiento del Secuenciador de nanoporos (Nanopore sequencing) MinIon Mk1...
Reconocimiento del Secuenciador de nanoporos (Nanopore sequencing) MinIon Mk1...Reconocimiento del Secuenciador de nanoporos (Nanopore sequencing) MinIon Mk1...
Reconocimiento del Secuenciador de nanoporos (Nanopore sequencing) MinIon Mk1...
sunwndniel
 
PRESENTACION_TRANSFRENIA DE EMBRIONES _2019_MANAZO.pdf
PRESENTACION_TRANSFRENIA DE EMBRIONES _2019_MANAZO.pdfPRESENTACION_TRANSFRENIA DE EMBRIONES _2019_MANAZO.pdf
PRESENTACION_TRANSFRENIA DE EMBRIONES _2019_MANAZO.pdf
MARCOMARCAVILLACA1
 
Informe de electroforesis del ADN MEDIANTE EL MinION Mk1C.pdf
Informe de electroforesis del ADN MEDIANTE EL MinION Mk1C.pdfInforme de electroforesis del ADN MEDIANTE EL MinION Mk1C.pdf
Informe de electroforesis del ADN MEDIANTE EL MinION Mk1C.pdf
KEVINYOICIAQUINOSORI
 
2 FIBRA OPTICA COMO MEDIO DE RED DE ACCESO.pptx
2 FIBRA OPTICA COMO MEDIO DE RED DE ACCESO.pptx2 FIBRA OPTICA COMO MEDIO DE RED DE ACCESO.pptx
2 FIBRA OPTICA COMO MEDIO DE RED DE ACCESO.pptx
bellomiguelangel68
 
MATERIAL BASE D A T O S .docx
MATERIAL BASE    D A T O S              .docxMATERIAL BASE    D A T O S              .docx
MATERIAL BASE D A T O S .docx
CarlosAndresLoaizaRe
 
TESisssssssss de yhnnjuuhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj...
TESisssssssss de yhnnjuuhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj...TESisssssssss de yhnnjuuhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj...
TESisssssssss de yhnnjuuhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj...
MenaOlortinYherlyEli
 

Último (19)

aplicaciones de sistema de informacion geografico
aplicaciones de sistema de informacion geograficoaplicaciones de sistema de informacion geografico
aplicaciones de sistema de informacion geografico
 
Informe_mc_bombas_Warman_001-WEIR vulco.pdf
Informe_mc_bombas_Warman_001-WEIR vulco.pdfInforme_mc_bombas_Warman_001-WEIR vulco.pdf
Informe_mc_bombas_Warman_001-WEIR vulco.pdf
 
FORMATO DE de Instrucción Clínica.pdf
FORMATO DE  de Instrucción Clínica.pdfFORMATO DE  de Instrucción Clínica.pdf
FORMATO DE de Instrucción Clínica.pdf
 
_Manejo de Riesgos en el Laboratorio.pdf
_Manejo de Riesgos en el Laboratorio.pdf_Manejo de Riesgos en el Laboratorio.pdf
_Manejo de Riesgos en el Laboratorio.pdf
 
11. Legislación Aplicada a la Informática.pdf
11. Legislación Aplicada a la Informática.pdf11. Legislación Aplicada a la Informática.pdf
11. Legislación Aplicada a la Informática.pdf
 
Catalogo-Voxtech- accesorios radios RF.pdf
Catalogo-Voxtech- accesorios radios RF.pdfCatalogo-Voxtech- accesorios radios RF.pdf
Catalogo-Voxtech- accesorios radios RF.pdf
 
Evolución, características, aplicación, ventajas y desventajas de las TIC
Evolución, características, aplicación, ventajas y desventajas de las TICEvolución, características, aplicación, ventajas y desventajas de las TIC
Evolución, características, aplicación, ventajas y desventajas de las TIC
 
El uso de las TIC en la vida cotidiana.pptx
El uso de las TIC en la vida cotidiana.pptxEl uso de las TIC en la vida cotidiana.pptx
El uso de las TIC en la vida cotidiana.pptx
 
Presentación Redes Sociales Moderno Morado.pdf
Presentación Redes Sociales Moderno Morado.pdfPresentación Redes Sociales Moderno Morado.pdf
Presentación Redes Sociales Moderno Morado.pdf
 
Generaciones de Computadoras .
Generaciones de Computadoras                 .Generaciones de Computadoras                 .
Generaciones de Computadoras .
 
BIOSENSORES BASADOS EN NANOTECNOLOGÍA.pdf
BIOSENSORES BASADOS EN NANOTECNOLOGÍA.pdfBIOSENSORES BASADOS EN NANOTECNOLOGÍA.pdf
BIOSENSORES BASADOS EN NANOTECNOLOGÍA.pdf
 
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
 
DN Consultores | Una mirada al mercado de fibra en Perú
DN Consultores | Una mirada al mercado de fibra en PerúDN Consultores | Una mirada al mercado de fibra en Perú
DN Consultores | Una mirada al mercado de fibra en Perú
 
Reconocimiento del Secuenciador de nanoporos (Nanopore sequencing) MinIon Mk1...
Reconocimiento del Secuenciador de nanoporos (Nanopore sequencing) MinIon Mk1...Reconocimiento del Secuenciador de nanoporos (Nanopore sequencing) MinIon Mk1...
Reconocimiento del Secuenciador de nanoporos (Nanopore sequencing) MinIon Mk1...
 
PRESENTACION_TRANSFRENIA DE EMBRIONES _2019_MANAZO.pdf
PRESENTACION_TRANSFRENIA DE EMBRIONES _2019_MANAZO.pdfPRESENTACION_TRANSFRENIA DE EMBRIONES _2019_MANAZO.pdf
PRESENTACION_TRANSFRENIA DE EMBRIONES _2019_MANAZO.pdf
 
Informe de electroforesis del ADN MEDIANTE EL MinION Mk1C.pdf
Informe de electroforesis del ADN MEDIANTE EL MinION Mk1C.pdfInforme de electroforesis del ADN MEDIANTE EL MinION Mk1C.pdf
Informe de electroforesis del ADN MEDIANTE EL MinION Mk1C.pdf
 
2 FIBRA OPTICA COMO MEDIO DE RED DE ACCESO.pptx
2 FIBRA OPTICA COMO MEDIO DE RED DE ACCESO.pptx2 FIBRA OPTICA COMO MEDIO DE RED DE ACCESO.pptx
2 FIBRA OPTICA COMO MEDIO DE RED DE ACCESO.pptx
 
MATERIAL BASE D A T O S .docx
MATERIAL BASE    D A T O S              .docxMATERIAL BASE    D A T O S              .docx
MATERIAL BASE D A T O S .docx
 
TESisssssssss de yhnnjuuhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj...
TESisssssssss de yhnnjuuhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj...TESisssssssss de yhnnjuuhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj...
TESisssssssss de yhnnjuuhjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj...
 

Buenas prácticas para la construcción de software

  • 1. Buenas prácticas para la construcción de software
  • 2. Introducción Índice de contenidos 1. Definición. 2. ¿Porqué se desarrolla mal? 3.¿Porqué debo seguir buenas prácticas? 4. Principios de la buena programación. 5. Buenas prácticas en código. 6. Consejos generales. 7. Ejemplos basados en Java, pero aplicables a “cualquier” lenguaje de programación.
  • 3. Introducción Definición Por buenas prácticas se entiende un conjunto coherente de acciones que han rendido buen o incluso excelente servicio en un determinado contexto y que se espera que, en contextos similares, rindan similares resultados. Éstas dependen de las épocas, de las modas y hasta de la empresa consultora o del autor que las preconiza. No es de extrañar que algunas sean incluso contradictorias entre ellas. (Fuente: wikipedia)
  • 4. Introducción ¿Porqué se desarrolla mal?  Falta de tiempo.  Falta de conocimiento.  Falta de motivación.  Acudir a las fuentes equivocadas.  Fallos en las etapas iniciales de desarrollo de software (análisis, requisitos, etc.).  Etc.
  • 5. Introducción ¿Porqué buenas prácticas?  Establece reglas y convenios.  Aporta higiene al código.  Estandariza el desarrollo.  Fácil lectura = Fácil mantenimiento.  Facilita la escalabilidad del código.  Facilita la reutilización y la integración de manera homogénea.
  • 6. Principios de buena programación The Principles of Good Programming by Christopher Diggins
  • 7. Principios de buena programación Listado de los principios  DRY - Don’t repeat yourself .  Abstraction Principle.  KISS (Keep it simple, stupid!) .  Avoid Creating a YAGNI (You aren’t going to need it).  Do the simplest thing that could possibly work.  Don’t make me think.  Open/Closed Principle.
  • 8. Principios de buena programación Listado de los principios  Write Code for the Maintainer.  Principle of least astonishment.  Single Responsibility Principle.  Minimize Coupling.  Maximize Cohesion.  Hide Implementation Details.  Law of Demeter.
  • 9. Principios de buena programación Listado de los principios  Avoid Premature Optimization.  Code Reuse is Good.  Separation of Concerns.  Embrace Change.
  • 10. Principios de buena programación DRY (Don’t repeat yourself)  No repetirse a sí mismo → evitar la repetición.
  • 11. Principios de buena programación DRY (Don’t repeat yourself)  Evitar la repetición en todas sus posibilidades: • No repetir código: funciones, métodos, clases, etc. → Reutilizar. • No repetir librerías. • No repetir documentación.  En general: NO REPETIR CONOCIMIENTO.
  • 12. Principios de buena programación Abstraction Principle  Principio de abstracción. “Cada pieza de funcionalidad significativa en un programa debe ser implementada en un sólo lugar del código fuente”
  • 13. Principios de buena programación Abstraction Principle class Airplane implements Aircraft { class Helicopter implements Aircraft { public void takeoff() { public void takeoff() { // algorithm taking off // algorithm taking off a helicopter } } public void fly() { public void fly() { // algorithm flying an airplane // algorithm flying a helicopter } } public void land() { public void land() { // algorithm landing an airplane // algorithm landing a helicopter } } } } Implementa class Pilot { Implementa private Aircraft myShip; public void setMyShip(Aircraft ship) { interface Aircraft { myShip = ship; void takeoff(); Un piloto puede } void fly(); public void flyMyShip() { void land(); pilotar tanto myShip.takeoff(); } Airplane como myShip.fly(); Helicopter myShip.land(); } }
  • 14. Principios de buena programación KISS (Keep it simple, stupid!)  Manténgalo simple, ¡estúpido!. La mejor solución a un problema es la más simple. Menos código → menos bugs.
  • 15. Principios de buena programación KISS (Keep it simple, stupid!)  Comentar código: for( i = 0, j = 100; i < j; i++, j--) // count to 49 System.out.println(i); for( i = 0, j = 100; i < j; i++, j--) System.out.println(i);  Hacer test unitarios.  Nombres (variables, métodos, etc.) descriptivos. Date date1; Date birthday; Date date2; Date currentDate; Integer myInteger; Integer difference;
  • 16. Principios de buena programación Avoid Creating a YAGNI  YAGNI (You aren’t going to need it) – Evitar crear algo que no vamos a necesitar. Es común tratar de ver el futuro y comenzar a crear abstracciones que todavía no estamos usando.
  • 17. Principios de buena programación Avoid Creating a YAGNI  Se pierde tiempo al añadir, probar y documentar la funcionalidad no necesaria.  Si la nueva característica no está bien definida, puede que no funcione correctamente, aunque con el tiempo sea necesaria.  El software se hace más grande y más complicado innecesariamente.
  • 18. Principios de buena programación Avoid Creating a YAGNI  A menos que existan especificaciones y control de revisiones, la funcionalidad no debería ser conocida por los programadores ya que podrían hacer uso de ella.  Añadir una nueva característica innecesaria puede sugerir añadir otras nuevas características innecesarias.
  • 19. Principios de buena programación Do the simplest thing that ...  Do the simplest thing that could possibly work. Haga lo más simple que funcione.
  • 20. Principios de buena programación Don’t make me think  No me haga pensar. Evitar la pregunta ¿y ahora, cómo lo hago? Los nombres de las funciones, variables, etc. deben declarar claramente lo que hacen.
  • 21. Principios de buena programación Don’t make me think public void print(String str1, Date date1, List myList) { // Algorithm ... } public void printBirthdayPartyInfo(String userName, Date birthday, List<Guest> guestsList) { // Algorithm... }
  • 22. Principios de buena programación Open/Closed Principle  Principio Abierto/Cerrado. Clases, módulos, funciones, etc. deben estar abiertas a la extensión. Escribir clases, no para que otros las modifiquen, sino para que se usen y extiendan.
  • 23. Principios de buena programación Open/Closed Principle  Beneficios del principio Open/Closed: • Robustez → No se modifican las clases ya probadas. • Flexibilidad → Se facilita la implementación de nuevos requisitos o cambios en ellos. • Facilita las pruebas → menos propenso a errores.
  • 24. Principios de buena programación Open/Closed Principle class Student { String name; double percentage; int uid; [...] class StudentBatch { private List<Student> studentList; [...] public void getSutdentMarkMap(HashMap<Integer, Double> studentMarkMap) { for (Student student : studentList) { studentMarkMap.put(student.uid, student.percentage); } } [...] public void getSutdentMarkMap(Map<Integer, Double> studentMarkMap) { for (Student student : studentList) { studentMarkMap.put(student.uid, student.percentage); } }
  • 25. Principios de buena programación Write Code for the Maintainer  Escriba código pensando en el que va a mantenerlo. “Escriba el código como si el que tuviera que mantenerlo fuera un psicópata asesino que conoce donde vives”.
  • 26. Principios de buena programación Principle of least astonishment  Principio del menor asombro. Ejemplo: el nombre de una función debería corresponder con lo que hace.
  • 27. Principios de buena programación Principle of least astonishment public void addInstance(String className) { try { Class clazz = Class.forName(className); objectSet.add(clazz.newInstance()); }catch (Exception ex) { throw new RuntimeException(ex); Este método hace más } de lo que debería. } Además de añadir una instancia, también la crea. Se debería cambiar de public void createAndAddInstance(String className) { nombre o crear dos try { Class clazz = Class.forName(className); métodos. objectSet.add(clazz.newInstance()); }catch (Exception ex) { throw new RuntimeException(ex); } }
  • 28. Principios de buena programación Single Responsibility Principle  Principio de responsabilidad única. Un componente de código debe ejecutar una única y bien definida tarea.
  • 29. Principios de buena programación Single Responsibility Principle public void insertUser(User user){ … } public void deleteUser(User user){ … } public void updateUser(User user){ … } ¿ QUÉ HACEN public void updateUser(User user) { //Se actualiza el propio usuario ESTAS LLAMADAS userManager.update(); AQUÍ ? //Se actualizan estadisticas para el usuario updateStatistics(user); //Se eliminan los ficheros asociados al usuario removeFiles(user); }
  • 30. Principios de buena programación Minimize Coupling  Minimizar el acoplamiento. Cada componente (bloque de código, clase, función, etc.) debe minimizar las dependencias de otros componentes.
  • 31. Principios de buena programación Maximize Cohesion  Maximizar cohesión. Evitar implementar en un componente dos funcionalidades que no están relacionadas, cumpliendo tareas que no tienen relación.
  • 32. Principios de buena programación Maximize Cohesion public class CoffeeCup { Public class CoffeeCup { private int innerCoffee; private int innerCoffee; public void add(int amount) { public void add(int amount) { innerCoffee += amount; innerCoffee += amount; } } public int remove(boolean all, int amount){ public int releaseOneSip(int sipSize){ int returnValue = 0; int sip = sipSize; if (all) { if (innerCoffee < sipSize) { int allCoffee = innerCoffee; sip = innerCoffee; innerCoffee = 0; } returnValue = allCoffee; innerCoffee -= sip; } else { return sip; int sip = amount; } if (innerCoffee < amount) { public int spillEntireContents() { sip = innerCoffee; int all = innerCoffee; } innerCoffee = 0; innerCoffee -= sip; return all; Hi cohesion returnValue = sip; } } } return returnValue; Low cohesion } }
  • 33. Principios de buena programación Hide Implementation Details  Ocultar detalles de implementación. En C# o Java → Interfaces. Usar correctamente modificadores de acceso: public, private y protected.
  • 34. Principios de buena programación Hide Implementation Details ArrayList<String> users = new ArrayList<String>(); Usar interfaces en vez de implementaciones. Se ocultan detalles de implementación y se deja libertad para elegir (ArrayList, LinkedList, etc.) List<String> users = new ArrayList<String>();
  • 35. Principios de buena programación Avoid Premature Optimization  Evitar la optimización prematura. Evitar pensar optimizar código, si apenas lo estamos armando. Ir armando el código de tal forma que podamos refactorizarlo.
  • 36. Principios de buena programación Code Reuse is Good  La reutilización de código es buena. En Java → Apache Commons.
  • 37. Principios de buena programación Code Reuse is Good Necesito un método que abrevie un string en función de un tamaño determinado... Apache Commons nos lo proporciona public static String abbreviate(String str, int maxWidth) //Ejemplo: StringUtils.abbreviate("abcd", 2) = "ab..."
  • 38. Principios de buena programación Embrace Change  Abraza el cambio. El cambio es inevitable en el desarrollo de software. No hay que luchar contra el cambio, sino trabajar para estar preparado para él → Programación ágil, integración continua, Scrum, etc.
  • 39. Buenas prácticas en código Code conventions ¿para qué?  Alto % del coste del software → mantenimiento.  Casi ningún software se mantiene durante toda su vida por el autor original.  Mejora la legibilidad del software, permitiendo a los ingenieros a entender el nuevo código con mayor rapidez y en profundidad.  Código fuente es igual que cualquier otro producto → asegurarse de que está tan bien empaquetado y limpio como cualquier otro producto.
  • 40. Buenas prácticas en código Java Code conventions  Convenciones estándar de Sun (Oracle) para seguir y recomendar que otros sigan.  Cubre los nombres de archivo, organización de archivos, sangría, comentarios, declaraciones, sentencias, espacios en blanco e incluye un ejemplo de código. codeconventions-150003.pdf
  • 41. Ejemplos Code conventions Indentación //DON’T USE THIS INDENTATION if ((condition1 && condition2) || (condition3 && condition4) ||!(condition5 && condition6)) { //BAD WRAPS doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS } //USE THIS INDENTATION INSTEAD if ((condition1 && condition2) || (condition3 && condition4) ||!(condition5 && condition6)) { doSomethingAboutIt(); } //OR USE THIS if ((condition1 && condition2) || (condition3 && condition4) ||!(condition5 && condition6)) { doSomethingAboutIt(); }
  • 42. Ejemplos Code conventions Comentarios  Cuatro tipos de comentarios: • Block • Single-line • Trailing • End-of-line
  • 43. Ejemplos Code conventions Clases e Interfaces  Para programar Clases e Interfaces en Java: • Sin espacios entre el nombre de un método y el paréntesis “(“. • La llave “{” debe aparecer al final de la línea y en la misma línea que la declaración. • La llave “}” empieza una línea por sí misma, indentada con la línea que contiene la llave “{”.
  • 44. Ejemplos Code conventions Clases e Interfaces class Sample extends Object { int ivar1; int ivar2; Sample(int i, int j) { ivar1 = i; ivar2 = j; } int emptyMethod() {} ... }
  • 45. Ejemplos Code conventions Excepciones  No dejar bloques “catch” vacíos.  Los bloques de excepciones seguirán el siguiente formato: try { statements; } catch (ExceptionClass e) { statements; }
  • 46. Buenas prácticas en código Herramientas Java  Checkstyle: Herramienta para ayudar a escribir código que siga estándares. Plugin para Eclipse.  PMD: Analiza y busca potenciales problemas en el código. Plugin para Eclipse. • Sentencias vacías try/catch, etc. • Variables, parámetros, etc. no usados • Mal uso de String/StringBuffer • Sentencias "if" innecesarias, for → while, etc. • Código copiado y pegado.
  • 47. Buenas prácticas Recursos Java  Libro “Effective Java” (Joshua Bloch)  Java Best Practices: http://www.javapractices.com/  J2EE Best Practices: http://www.precisejava.com/
  • 48. Buenas prácticas Programación: Errores comunes  Fiabilidad de los parámetros de entrada: No asegurarse de que los parámetros recibidos son los que esperamos.  Fiabilidad de los valores: No comprobar si un elemento tiene valor antes de acceder a él.  Elementos en colecciones: No asegurar se de que un array o colección tenga valor y contenga elementos antes de acceder a ellos.  No comentar. (Sin comentarios...).
  • 49. Buenas prácticas Programación: Errores comunes  Acceso a colecciones: No comprobar si existe elemento para un índice antes de acceder a él en una colección indexada.  No liberar recursos adecuadamente.  Recursividad: El método recursivo infinito.  Malas prácticas: Utilizar incorrectamente técnicas conocidas.
  • 50. Programación: Errores comunes Fiabilidad de parámetros de entrada  Los parámetros recibidos por un método «público», es decir expuesto al mundo exterior, nunca son confiables. public static double metodoExpuesto(int nuncaMenorQue4, int nunca0){ return nuncaMenorQue4 / nunca0 ; } public static void main(String... args){ StaticDemo.metodoExpuesto(2, 0); //El metodo fallara despues de ejecutarse } public void publicarNoticia(Noticia noticia, int importancia){ if (noticia== null){ throw new ArgumentNullException("Parametro noticia no puede ser null"); } //A partir de aqui, ira el codigo para publicar la noticia... }
  • 51. Programación: Errores comunes Fiabilidad de los valores  Acceder a los elementos sin antes comprobar si tienen un valor. Bar foo = getFooBar(); foo.ToString(); //Acceder a metodos de "foo" sin comprobar, puede fallar si getFooBar devuelve null Bar foo = getFooBar(); if(foo != null) { foo.ToString(); }
  • 52. Programación: Errores comunes Elementos en colecciones  No asegurarse de que un array o colección tenga valor y contenga elementos antes de acceder a ellos. List<MiNumero> numeros= obtenerNumeros(); txtNumero1.text = numeros[0].toString(); txtNumero2.text = numeros[1].toString(); //Si numeros es null o numeros no tiene elementos este codigo fallara List<MiNumero> numeros= obtenerNumeros(); if (numeros != null && numeros.size() > 0) { txtNumero1.text = numeros.get(0).toString(); txtNumero2.text = numeros.get(1).toString(); }
  • 53. Programación: Errores comunes No comentar  Comentar el código también es programar,pero se debe comentar con criterio.
  • 54. Programación: Errores comunes Acceso a colecciones Antes de acceder a un elemento de una colección indexada se debe comprobar si la colección tiene al menos el número de elementos que necesitamos. for (int i = 0; i < cargarEmpresas().size(); i++) { if (cargarEmpresas().get(i) == ""){ gridView.rows[i].cells[7].visible = false; } ¡HORROR! } for (int i = 0; i < empresasSize; i++) { if (gridView.rows.count > i && "".equals(empresas.get(i))){ gridView.rows[i].cells[7].visible = false; } }
  • 55. Programación: Errores comunes No liberar recursos  Grave error no liberar recursos adecuadamente. public void saveData() { Connection cnn; try{ cnn = new SqlConnection(cnnString); cnn.open(); } catch (Exception e) { System.out.println("Se ha producido un erro de base de datos"); e.printStackTrace(); } finally { if (cnn != null) { cnn.close(); } } }
  • 56. Programación: Errores comunes Recursividad  El típico fallo al utilizar recursividad es no poner un límite a las llamadas recursivas. static long LastFibonacciNumber(long anterior1, long anterior2) { long numero = anterior1 + anterior2; Console.write(numero + " "); numero = lastFibonacciNumber(anterior2, numero); return numero; }  Para evitar el conocido error de "stack overflow" → utilizar líneas de control que permitan dar fin al anidamiento de llamadas recursivas.
  • 57. Programación: Errores comunes Malas prácticas  Utilizar incorrectamente técnicas conocidas.  Habitualmente se implementa mal una técnica o patrón conocidos.  Avoid basic style errors → javapractices.  Common Java Mistakes → javaprogrammingforums  Java Anti-Patterns → www.odi.ch
  • 59. Buenas prácticas Consejos generales  Seguir estándares.  Seguir patrones de diseño.  Reutilizar código → No reinventar la rueda.  Usar librerías “reconocidas”, documentadas, etc. Ejemplo: Apache Commons  Test unitarios.  Conocer bien nuestro entorno de desarrollo (IDE): shortcuts, plugins, etc.
  • 60. Buenas prácticas Consejos generales  Refactorización: Técnica de ingeniería de software para reestructurar código fuente, alterando su estructura interna sin cambiar su comportamiento externo.  Comentar de forma completa pero no excesiva.  Seguir “buenas prácticas” del Framework elegido.  Nombrar “con sentido” las clases, variables, etc.
  • 61. Buenas prácticas Consejos generales  Leer código ajeno. Que otros lean tú código.  Pautas para leer código de una manera efectiva:
  • 62. Buenas prácticas Consejos generales  Tener en cuenta el rendimiento: El rendimiento de nuestras aplicaciones es tan importante como otros criterios de aceptación. Criterios a tener en cuenta para medir el rendimiento: • Recursos hardware del cliente. • Realizar pruebas de rendimiento en un entorno que simule el hardware mínimo aceptado. • Hacer pruebas REALES.
  • 63. Buenas prácticas Consejos generales Buena gestión de logs: Los logs son las trazas o rastros que deja una aplicación. Nos brindarán información valiosa sobre qué está ocurriendo en nuestro sistema y dónde aplicar las mejoras más inmediatas.
  • 64. Buenas prácticas Consejos generales  Organiza el desarrollo: • Define una sintaxis de programación común para tu equipo de trabajo. • Define una estructura de directorios basada en la separación de conceptos: • Código fuente. • Documentación. • Recursos. • Productos finales. • Divide proyectos en librerías.
  • 65. Buenas prácticas Consejos generales  Usa sistemas de control de versiones para compartir el trabajo con el equipo. Usándolos se aprende a usarlos. Libro gratuito → http://www.ericsink.com/vcbe/  Usa herramientas o prepara scripts que te permitan automatizar procesos productivos. → ANT, Maven etc.  Nightly builds → Generar productos finales “frescos” todos los días.
  • 66. Buenas prácticas Consejos generales  Comparte conocimiento. Wiki, blogs, reuniones, charlas, etc.
  • 67. Buenas prácticas Consejos generales  Cobertura TDD: Test Driven Development → http://cobertura.sourceforge.net/  Integración continua → http://continuum.apache.org/  Software para la gestión de tareas/bugs → http://www.redmine.org/, http://www.mantisbt.org/, http://trac.edgewall.org/, etc.
  • 68. Material extra Buenas prácticas en el uso de repositorios
  • 69. Buenas prácticas Referencias  Principios de buena programación: The Principles of Good Programming, Christopher Diggins.  Java Code Conventions: http://www.oracle.com/technetwork/java/codeconvent ions-150003.pdf  Effective Java. Joshua Bloch.  MasterDISS_DesignPatterns, Iker Jamardo.
  • 70. Buenas prácticas Referencias  Imágenes • DRY: http://www.dreamstime.com/royalty-free-stock-photo-don %27t-repeat-yourself-acronym-image20103645 • Abstraction Principle: http://www.danpontefract.com/give- piece-a-chance/ • Open/Closed Principle: http://www.vitalygorn.com/blog/image.axd?picture=Open-Closed.jpg • YAGNI: http://blog.thescrumster.com/?tag=yagni • Don't make me think: http://riyajs.files.wordpress.com/2011/03/usability_testing.jpg • KISS: http://milldesk.com.br/en/k-i-s-s-keep-it-simple-stupid/ • Write Code for the Maintainer: http://notio.com.ar/adjuntos/imagenes/000/102/0000102304.jpg
  • 71. Buenas prácticas Referencias  Imágenes • YAGNI: http://blog.thescrumster.com/?tag=yagni • Don't make me think: http://riyajs.files.wordpress.com/2011/03/usability_testing.jpg • KISS: http://milldesk.com.br/en/k-i-s-s-keep-it-simple-stupid/ • Write Code for the Maintainer: http://notio.com.ar/adjuntos/imagenes/000/102/0000102304.jpg • Single Responsibility Principle: http://www.colourbox.com/preview/1995285-118643-3d- illustration-of-one-selected-target-with-three-arrows-right-target- concept.jpg
  • 72. Buenas prácticas Referencias  Imágenes • Maximize Cohesion: http://vision2030.bwd.public- i.tv/viewfinder_core/public/images/uploaded/l_1259326852_cohe sion.png • Hide Implementation Details: http://geek.pe /wp- content/uploads/2010/04/como-ocultar-tu-ip-al-enviar-un-correo- gmail-hotmail.jpg • Avoid Premature Optimization: http://rlv.zcache.es/la_optimizacion_prematura_es_la_raiz_de_to do_el_ma_im%C3%A1n-p147403910183181037en878_210.jpg • Code Reuse is Good: http://www.alexanderinteractive.com/blog/reuse-code.jpg
  • 73. Buenas prácticas Referencias  Imágenes • Embrace Change: http://static.eharmony.com/dating- advice/wp-content/uploads/images/are-you-caught-in-the- comfort-zone-trap-learning-to-embrace-change-large.jpg • Minimize Coupling: http://lh3.ggpht.com/_huul_BKMb4M/S2wKiTapibI/AAAAAAAAG ek/h9Qs-AKcGa8/tuerca.gif
  • 74. Buenas prácticas para la construcción de software FIN Iker Canarias iker.canarias (gmail)