Junior — Middle
Ar galite paaiškinti priklausomybių inversijos principą ir kaip jis taikomas programinės įrangos sistemų projektavimui?
sobes.tech AI
Atsakymas iš AI
Priešingybės inverijos principas (Dependency Inversion Principle, DIP) yra vienas iš penkių SOLID principų ir teigia, kad:
- Aukšto lygio moduliai neturėtų priklausyti nuo žemo lygio modulių. Abu turėtų priklausyti nuo abstrakcijų.
- Abstrakcijos neturėtų priklausyti nuo detalių. Detalės turėtų priklausyti nuo abstrakcijų.
Tai reiškia, kad vietoj to, kad tiesiogiai kurti ir naudoti konkrečius klases ar modulius, dirbame per sąsajas ar abstrakčias klases. Tai padidina lankstumą ir palengvina kodo testavimą bei priežiūrą.
Programinės įrangos sistemų projektavime tai taikoma taip:
- Komponentai priklauso nuo sąsajų, o ne nuo konkrečių įgyvendinimų.
- Įgyvendinimus galima keisti be kodo, kuris juos naudoja.
- Leidžia priklausomybes injektuoti per konstruktorius, nustatymo metodus ar fabrikus (Dependency Injection).
Pavyzdys Node.js:
// Abstrakcija
class Logger {
log(message) {
throw new Error('Nepavyko įgyvendinti');
}
}
// Konkretus įgyvendinimas
class ConsoleLogger extends Logger {
log(message) {
console.log(message);
}
}
// Klasė, priklausanti nuo abstrakcijos
class UserService {
constructor(logger) {
this.logger = logger;
}
createUser(name) {
// naudotojo kūrimo logika
this.logger.log(`Naudotojas ${name} sukurtas`);
}
}
const logger = new ConsoleLogger();
const userService = new UserService(logger);
userService.createUser('Alice');
Čia UserService priklauso nuo abstrakcijos Logger, o ne nuo konkrečios įgyvendinimo. Tai leidžia lengvai pakeisti logger'į kitu, pavyzdžiui, įrašyti į failą, be UserService keitimo.