Implementación del pronóstico del tiempo usando el patrón de diseño de fachada en Python

Los patrones de diseño de fachadas son patrones de diseño en Python que proporcionan una interfaz simple a un subsistema complejo. Cuando observamos el mundo que nos rodea, siempre podemos encontrar patrones de diseño de fachadas. Un automóvil es el mejor ejemplo: no necesitas entender cómo funciona el motor. Para operar el motor, se le proporciona un conjunto de interfaces simples, como girar la llave en el encendido para arrancar un motor, hacer uso de volantes para girar las ruedas y más. Veamos las ventajas del patrón de diseño de fachada. Son los siguientes:

  • Mantiene un acoplamiento flojo entre el cliente y los subsistemas.
  • Más fácil de usar y probar
  • Proporciona una API mejor y más clara para el código del cliente.
  • Envuelve un subsistema complicado con una interfaz simple

Implementación del pronóstico del tiempo

Vayamos a la sección de implementación. En esta aplicación, buscamos la temperatura actual en una ciudad. Para este propósito, utilizamos las API disponibles de los recursos de openweathermap.org . Aquí, sin usar el patrón de diseño de la fachada, el cliente tiene que pasar por tantas tareas complicadas como llamar a la API, analizar y recuperar los datos necesarios y convertir de Kelvin a Celsius. Es más fácil si el cliente necesita llamar a un solo método para obtener la temperatura actual. Eso es lo que logramos a través del patrón de diseño de fachada.

Antes de entrar en el código fuente, veamos el patrón de diseño del código.

En el diagrama anterior, tenemos un subsistema que consta de cuatro módulos. Si el cliente utiliza estos módulos directamente, perderá su flexibilidad. Esto se debe a que, si se cambia alguno de los módulos, entonces se debe modificar el código del cliente, lo que agrega complejidades adicionales. Mientras usa un patrón de diseño de fachada, el cliente usa una fachada, donde la fachada llama al submódulo y devuelve los detalles necesarios al cliente. Este diseño se basa en el principio de descomposición, donde un sistema complejo se divide en subsistemas más pequeños y simples.

Veamos la funcionalidad de cada módulo. 

  • La clase WeatherRetriever realiza requests al extremo de la API meteorológica y devuelve datos de pronóstico.
  • La clase Crawler rastrea los datos devueltos por la clase WeatherRetriever, los decodifica en formato JSON y obtiene la temperatura.
  • La clase WeatherForecast es responsable de almacenar los datos de temperatura.
  • Finalmente, la clase Converter convierte la temperatura de Kelvin a Celsius

Python3

import urllib
import urllib.request
import urllib.parse
import json
 
 
class WeatherRetriever(object):
    def __init__(self):
        self.api_url = 'https://samples.openweathermap.org/data/2.5/\
weather?q={},{}&appid=439d4b804bc8187953eb36d2a8c26a02'
 
    # takes input (city and country), produces a URL string,
    # generate HTTP request, and returns the data.
    def fetch_weather_data(self, city, country):
        city = urllib.parse.quote(city)
        url = self.api_url.format(city, country)
        return urllib.request.urlopen(url).read()
 
 
class Crawler(object):
    def crawl_weather_data(self, weather_data):
        data = json.loads(weather_data)
         
        # fetch the current temperature
        temp_data = data['main']['temp']
        return temp_data
 
 
class Converter(object):
    """ converts the temperature from kelvin to celsius """
 
    def from_kelvin_to_celsius(self, kelvin):
        return kelvin - 273.15
 
 
class WeatherForecast(object):
    def __init__(self, data):
        self.temperature = data
 
 
class FacadeDesign(object):
    def get_forecast(self, city, country):
        weather_retriever = WeatherRetriever()
        weather_data = weather_retriever.fetch_weather_data(city, country)
 
        crawl = Crawler()
        crawl_data = crawl.crawl_weather_data(weather_data)
        weather = WeatherForecast(crawl_data)
        converter = Converter()
        temp_celsius = converter.from_kelvin_to_celsius(weather.temperature)
        return temp_celsius
 
 
if __name__ == '__main__':
    facadeDesign = FacadeDesign()
    print("So today's forecast is about ",
          facadeDesign.get_forecast('London', 'uk'), "degrees")

Producción:

Así que el pronóstico de hoy es de unos 7.170000000000016 grados

Un patrón de diseño de fachada proporciona una interfaz de nivel superior que simplifica el uso de subsistemas. El diseño de la fachada no agrega ninguna funcionalidad nueva, sino que actúa como un envoltorio que brinda flexibilidad para acceder a subsistemas complejos.

Publicación traducida automáticamente

Artículo escrito por SonuGeorge y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *