patrones de diseño de bibliotecas: API genérica única vs APIs específicas
Trabajando en DailyStatsLib, una biblioteca para obtener estadísticas basadas en el día de la semana.
¿Es mejor para DailyStatsLib exponer
- opción 1: una API genérica única
- opción 2: exponer una API específica para cada día de la semana
Opción 1 (API genérica única)
- ventajas: interfaz simple y toda la lógica es manejada por DailyStatsLib
- desventajas: AllInfoStruct (mostrado a continuación) parece ser un contenedor de información para todos los días (y parte de esa información puede no estar disponible en un día dado)
main.cpp
// utilizando "std::optional" porque no toda la información puede estar disponible en un día dado
struct AllInfoStruct {
std::optional<mondaystatsinfo> monday_info; // si el día es lunes, esta información estará disponible
std::optional<tuesdaystatsinfo> tuesday_info; // si el día es martes, esta información estará disponible
std::optional<wednesdaystatsinfo> wednesday_info; // si el día es miércoles, esta información estará disponible
...
} all_info_struct; // tiene toda la información necesaria para obtener estadísticas en cualquier día de la semana
Day today = dayUtil.getDay();
Stats my_stats = DailyStatsLib::Manager.getInstance().getStats(today, all_info_struct); // interfaz genérica única
Opción 2 (API específica por día)
- ventajas: las APIs son más específicas y más fáciles de entender y probar. No se oculta mucho.
- desventajas: ¿Está main.cpp haciendo parte del trabajo que realmente debería hacer DailyStatsLib?
main.cpp
Stats my_stats;
Day today = dayUtil.getDay();
if (today == e_day_Monday) {
MondayStatsInfo ms;
my_stats = DailyStatsLib::Monday.getInstance().getStats(ms);
} else if (today == e_day_Tuesday) {
TuesdayStatsInfo ts;
my_stats = DailyStatsLib::Tuesday.getInstance().getStats(ts);
} else if (today == e_day_Wednesday) {
WednesdayStatsInfo ws;
my_stats = DailyStatsLib::Wednesday.getInstance().getStats(ws);
}
...
davy.ai
Como experto en tecnología de la información especializado en c++ y patrones de diseño, ambas opciones tienen sus ventajas y desventajas. Sin embargo, en este caso, puede ser mejor seguir con la Opción 2, la API específica para cada día, ya que permite obtener APIs más enfocadas y más fáciles de entender, sin estar cargadas de información innecesaria. Además, al utilizar APIs específicas para cada día, podemos evitar crear un depósito de información para todos los días y mantener las APIs más organizadas. Sin embargo, debemos asegurarnos de que el archivo main.cpp no esté realizando ninguna parte del trabajo que DailyStatsLib debería hacer por sí mismo.