Fluid Attacks logo
Contact Us
Young hacker smiling
Zero false positives

Expert intelligence + effective automation

Evitar código fuente duplicado

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 Attacks"));
        }
        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 Attacks"));
        }
        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.


Service status - Terms of Use