¿Qué puedes contarme sobre el principio D en SOLID?
sobes.tech AI
Respuesta de la IA
El principio de inversión de dependencias (Dependency Inversion Principle) establece:
- Los módulos de nivel superior no deben depender de los módulos de nivel inferior. Ambos tipos de módulos deben depender de abstracciones.
- Las abstracciones no deben depender de los detalles. Los detalles deben depender de las abstracciones.
El objetivo de la D en SOLID es desacoplar (decoupling) las políticas de alto nivel de la implementación de bajo nivel. En lugar de que un módulo de alto nivel dependa directamente de la implementación concreta de un módulo de bajo nivel, ambos dependen de una interfaz común o una clase abstracta. Esto aumenta la flexibilidad, la capacidad de prueba y la mantenibilidad del código.
En Flutter, esto a menudo se manifiesta mediante el uso de clases abstractas o mixins para definir contratos, que luego son implementados por clases concretas. Por ejemplo, al trabajar con datos:
// Abstracción
abstract class DataService {
Future<List<String>> getData();
}
// Implementación de bajo nivel (detalle concreto)
class ApiDataService implements DataService {
@override
Future<List<String>> getData() async {
// Lógica para obtener datos desde una API
return ['API Data 1', 'API Data 2'];
}
}
// Otra implementación de bajo nivel (otro detalle concreto)
class LocalDataService implements DataService {
@override
Future<List<String>> getData() async {
// Lógica para obtener datos desde almacenamiento local
return ['Local Data 1', 'Local Data 2'];
}
}
// Módulo de alto nivel que depende de la abstracción, no de los detalles
class DataManager {
final DataService _dataService; // Dependencia de la abstracción
DataManager(this._dataService); // La dependencia se inyecta (inversión)
Future<List<String>> fetchData() {
return _dataService.getData();
}
}
// Uso
void main() {
final apiService = ApiDataService();
final localService = LocalDataService();
final apiManager = DataManager(apiService); // Inyección de ApiDataService
final localManager = DataManager(localService); // Inyección de LocalDataService
// ... uso de apiManager o localManager
}
En este ejemplo, DataManager (el módulo de alto nivel) no depende directamente de ApiDataService o LocalDataService. Depende de la abstracción DataService. La implementación concreta de DataService se "inyecta" en DataManager desde fuera, lo cual es una manifestación de la inversión de dependencia. Esto permite cambiar fácilmente las fuentes de datos sin modificar la lógica de DataManager.