Joven hacker sonriendo

Evitar código fuente duplicado

Nuestros ethical hackers explican cómo evitar caer en la mala practica de programación que consiste el código fuente duplicado, en los desarrollos utilizando la centralización del manejo de excepciones como ejemplo de la reutilización de código.

Necesidad

Evitar código fuente duplicado en C#.

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 C#.

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

Solución

  1. 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.[2]

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

    ejemplo.cs
    1
    2
    class Reuse {
      private static bool DEBUG = true;
    
  3. El método main llama a dos métodos que generan errores, estos errores son imprimidos en pantalla si la constante de depuración tiene el valor verdadero:

    1
    2
    3
    4
      static void Main(string[] args) {
        divisionPorCero();
        integerParseInt();
      }
    
  4. El primer método arroja un error de división por cero, vemos que los mensajes de error son imprimidos a través de la salida estándar, 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 {
            int x = 4;
            int y = x;
            Console.WriteLine("Resultado: "+(22/(x-y)));
          } catch (Exception e) {
          if (DEBUG) {
            Console.Error.WriteLine("Error");
            Console.Error.WriteLine("Causa "+e.Source+" "+e.Message);
          }
        }
      }
    
  5. Igualmente se define un segundo método que arroja la excepción la clase Integer. En el cual termina el programa:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
      public static void integerParseInt() {
        try {
          Console.WriteLine("Resultado: " + int.Parse("FLUID"));
        }
        catch (Exception e) {
          if (DEBUG) {
            Console.Error.WriteLine("Error");
            Console.Error.WriteLine("Causa " + e.Source + " " + e.Message);
          }
        }
      }
    
  6. El error consiste en duplicar el código, si las clases siguen creciendo y se continua la metodología de duplicar el código, cambios futuros en la aplicación como eliminar el mensaje causa, filtrar ciertas palabras de las excepciones, entre otros, pueden llegar a causar una fuga de información.[3] Si los mensajes de error son manejados de forma centralizada, el cambio se hace únicamente en un lugar, por lo que a un crecimiento futuro no representaría riesgo de fuga de información. Para evitar duplicar código se debe abstraer las llamadas en común a un nuevo método. Declaramos la nueva clase y una constante para depurar los mensajes:

    1
    2
    class Reuse {
      private static bool DEBUG = true;
    
  7. El método main llama a dos métodos que generan errores, estos errores son imprimidos en pantalla si la constante de depuración tiene el valor verdadero:

    1
    2
    3
    4
      static void Main(string[] args) {
        divisionPorCero();
        integerParseInt();
      }
    
  8. 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 demás llamadas:

    1
    2
    3
    4
    5
    6
      public static void showError(Exception e) {
        if (DEBUG){
          Console.Error.WriteLine("Error");
          Console.Error.WriteLine("Causa " + e.Source + " " + e.Message);
        }
      }
    
  9. 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 {
          int x = 4;
          int y = x;
          Console.WriteLine("Resultado: "+(22/(x-y)));
        } catch (Exception e) {
          showError(e);
        }
      }
      public static void integerParseInt() {
        try {
          Console.WriteLine("Resultado: " + int.Parse("FLUID"));
        }
        catch (Exception e) {
          showError(e);
        }
      }
    

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

  1. ejemplo.cs contiene todas las instrucciones C# del programa.




Haz un comentario

Estado de los servicios - Términos de Uso