Sobes.tech
Junior — Middle

Můžete vysvětlit princip inverze závislostí a jak se uplatňuje při navrhování softwarových systémů?

sobes.tech AI

Odpověď od AI

Princip závislostní inverze (Dependency Inversion Principle, DIP) je jedním z pěti SOLID principů a říká, že:

  • Moduly vysoké úrovně by neměly záviset na modulech nízké úrovně. Oba by měly záviset na abstrakcích.
  • Abstrakce by neměly záviset na detailech. Detaily by měly záviset na abstrakcích.

To znamená, že místo toho, abychom přímo vytvářeli a používali konkrétní třídy nebo moduly, pracujeme přes rozhraní nebo abstraktní třídy. To zvyšuje flexibilitu a usnadňuje testování a údržbu kódu.

V návrhu softwarových systémů se to aplikuje takto:

  • Komponenty závisí na rozhraních, nikoliv na konkrétních implementacích.
  • Implementace lze měnit bez změny kódu, který je používá.
  • Umožňuje vkládání závislostí přes konstruktory, nastavovače nebo továrny (Dependency Injection).

Příklad v Node.js:

// Abstrakce
class Logger {
  log(message) {
    throw new Error('Nepoužitelné');
  }
}

// Konkrétní implementace
class ConsoleLogger extends Logger {
  log(message) {
    console.log(message);
  }
}

// Třída závislá na abstrakci
class UserService {
  constructor(logger) {
    this.logger = logger;
  }

  createUser(name) {
    // logika vytváření uživatele
    this.logger.log(`Uživatel ${name} vytvořen`);
  }
}

const logger = new ConsoleLogger();
const userService = new UserService(logger);
userService.createUser('Alice');

Zde závisí UserService na abstrakci Logger, nikoliv na konkrétní implementaci. To umožňuje snadno nahradit logger jiným, například pro zápis do souboru, bez změny UserService.