es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mejor manera de llamar a múltiples operaciones múltiples veces después de otra.

Tienes el siguiente escenario:

Hay 3 API’s que llamo cada 5 minutos. Hago esto de forma asíncrona para que el orden de llamada a la API no importe. Una “llamada” en sí misma contiene:

  1. Una solicitud HTTP a la API
  2. La extracción de datos (leyendo la respuesta)
  3. Almacenarlos en una base de datos.

Por lo tanto, estos 3 pasos son siempre los mismos. Actualmente, mi código se parece algo así:

scraper.Request()
scraper.Extract()
scraper.Save()

Seguramente lo pondré en otra función para envolverlo, pero de alguna manera parece extraño para mí. ¿Hay algún “patrón” que pueda seguir que coincida con mi escenario?

Gracias por adelantado.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Basado en su escenario, se pueden utilizar los siguientes patrones de diseño:

    1. Patrón de fachada: Este patrón proporciona una interfaz unificada para un conjunto de interfaces en un subsistema. En su caso, puede crear una clase ScraperFacade que encapsule la lógica compleja de solicitud, extracción y guardado de datos. Esto simplificará la interfaz para el código del cliente y proporcionará una clara separación de responsabilidades.

    Ejemplo:

    class ScraperFacade 
    {
      private Scraper scraper = new Scraper();
    
      public void Scrape() 
      {
        scraper.Request();
        scraper.Extract();
        scraper.Save();
      }
    }
    
    1. Patrón de método de fábrica: Este patrón le permite crear objetos sin especificar la clase exacta del objeto que se creará. En su caso, puede crear una clase ScraperFactory que pueda crear diferentes tipos de scrapers basados en la API que se esté utilizando. Esto evitará duplicar el código y proporcionará flexibilidad.

    Ejemplo:

    interface IScraper 
    {
      void Request();
      void Extract();
      void Save();
    }
    
    class Scraper1 : IScraper 
    {
      // implementación para API 1
    }
    
    class Scraper2 : IScraper 
    {
      // implementación para API 2
    }
    
    class Scraper3 : IScraper 
    {
      // implementación para API 3
    }
    
    class ScraperFactory 
    {
      public static IScraper CreateScraper(string apiName) 
      {
        switch(apiName) 
        {
          case "API1":
            return new Scraper1();
          case "API2":
            return new Scraper2();
          case "API3":
            return new Scraper3();
          default:
            throw new ArgumentException("Nombre de API inválido.");
        }
      }
    }
    

    Con la implementación anterior del patrón de método de fábrica, el código del cliente puede crear el objeto rascador apropiado en función del nombre de la API:

    var api1Scraper = ScraperFactory.CreateScraper("API1");
    api1Scraper.Request();
    api1Scraper.Extract();
    api1Scraper.Save();
    

    ¡Espero que esto les sea útil!

Comments are closed.