Fluid Attacks logo
Contact Us
Young hacker smiling
Zero false positives

Expert intelligence + effective automation

Contact logo Contact Us
GET A DEMO

Evitar Código Duplicado en Java

Necesidad

Evitar código fuente duplicado en Java

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se está desarrollando una aplicación en Java.

  2. Se desea evitar código fuente duplicado en la aplicación.[1],[2]

Solución

Es común encontrar código duplicado en diferentes tipos de aplicaciones, esta duplicación representa trabajo, riesgo y complejidad adicional, por lo que evitar duplicar código fuente es importante para mantener la seguridad de la aplicación [3].

Esta solución presenta una manera de evitar duplicar código fuente en aplicaciones Java.

  1. Declaramos una nueva clase y una constante para depurar los mensajes.

    Reuse.java
    1
    2
    public class Reuse {
      private static final boolean DEBUG = true;
    
  2. El método main llama a dos métodos que generan errores. Estos errores son impresos en pantalla si la constante de depuración tiene el valor verdadero.

    1
    2
    3
    4
    public static void main(String[] args) {
      divisionPorCero();
      integerParseInt();
    }
    
  3. El primer método arroja un error de división por cero. Vemos que los mensajes de error son impresos a través de la salida err, con la causa y el mensaje de excepción:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    public static void divisionPorCero() {
      try {
        System.out.println("Resultado: " + (1337 / 0));
      }
      catch (Exception e) {
        if (DEBUG) {
          System.err.println("Error");
          System.err.println("Causa: " + e.getCause());
          System.err.println("Mensaje: " + e.getMessage());
        }
      }
    }
    
  4. Igualmente, se define un método que arroja la excepción de análisis de la clase Integer.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
      public static void integerParseInt() {
        try {
          System.out.println("Resultado: " + Integer.parseInt("fluid"));
        }
        catch (Exception e) {
          if (DEBUG) {
            System.err.println("Error");
            System.err.println("Causa: " + e.getCause());
            System.err.println("Mensaje: " + e.getMessage());
          }
        }
      }
    }
    
  5. Como se puede apreciar, la duplicación del código se da en el uso de las excepciones en ambos métodos. El problema se presenta porque al realizar posibles cambios en la aplicación como eliminar el mensaje "Causa" o filtrar ciertas palabras de las excepciones, entre otros, pueden llegar a causar una fuga de información.

  6. En cambio, si los mensajes de error son manejados de forma centralizada, el cambio se hace únicamente en un lugar, por lo que un cambio futuro no representaría riesgo de fuga de información.

  7. Para evitar duplicar código se debe abstraer las llamadas en común a un nuevo método.

  8. Declaramos la nueva clase y una constante para depurar los mensajes:

    1
    2
    public class ReuseGood {
      private static final boolean DEBUG = true;
    
  9. El método main llama a dos métodos que generan errores. Estos errores son impresos en pantalla si la constante de depuración tiene el valor verdadero.

    1
    2
    3
    4
    public static void main(String[] args) {
      divisionPorCero();
      integerParseInt();
    }
    
  10. El método showError se encargará, de ahora en adelante, de manejar los mensajes de error. Un cambio en este método se ve reflejado en todas sus llamadas:

    1
    2
    3
    4
    5
    6
    7
    public static void showError(Exception e) {
      if (DEBUG) {
        System.err.println("Error");
        System.err.println("Causa: " + e.getCause());
        System.err.println("Mensaje: " + e.getMessage());
      }
    }
    
  11. Ahora los dos métodos llaman al método showError.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
      public static void divisionPorCero() {
        try {
          System.out.println("Resultado: " + (1337 / 0));
        }
        catch (Exception e) {
          showError(e);
        }
      }
      public static void integerParseInt() {
        try {
          System.out.println("Resultado: " + Integer.parseInt("fluid"));
        }
        catch (Exception e) {
          showError(e);
        }
      }
    }
    

Descargas

Puedes descargar el código fuente pulsando en los siguientes enlaces:

Reuse.java Código que reutiliza lineas.

ReuseGood.java Código que no reutiliza lineas.


Service status - Terms of Use