ExpDev07 / coronavirus-tracker-api

🦠 A simple and fast (< 200ms) API for tracking the global coronavirus (COVID-19, SARS-CoV-2) outbreak. It's written in python using the 🔥 FastAPI framework. Supports multiple sources!
https://coronavirus-tracker-api.herokuapp.com
GNU General Public License v3.0
1.59k stars 320 forks source link

Apply Bridge pattern #466

Closed JoyBiao closed 3 years ago

JoyBiao commented 3 years ago

Reference Issues

The data sources may change in the future, or maybe you want to change the service someday. Since in your code, service and data sources are combined together, the change of data sources will force the service to change.

What does this implement/fix? Explain your changes.

I apply bridge pattern so that service and data sources can vary independently. I add a new interface named DataSourcesInterface, which has a method get_locations(). This class is responsible for getting data from different data sources. class JHULocations, CSBSLocations and NYTLocations represent three different data sources that will return us the locations, these three class implement this interface. LocationService is an abstract class, which is responsible for managing the services. I add a construct method which receives a class that implements DataSourcesInterface. So, its children can use this as an attribute. I add BasicLocationService class to implement LocationService class. It overwrites the get_all() methods and call the get_locations() methods in DataSourcesInterface interface. So, when there is any change to data source, we only need to change the parameter that are passed to children of LocationService class. Service and data source will change independently.

Any other comments?

Thank you for reading!

JoyBiao commented 3 years ago

I am so sorry! I am trying to make this PR to my own fork, but something goes wrong.