Ren arkitektur og designmønstre i praksis · Lektion

Dependency Rule forklaret

Forstå den grundlæggende Dependency Rule, som fastslår, at afhængigheder kun må flyde indad, så den centrale forretningslogik forbliver isoleret.

Lektion 3 af 411 trin

Dependency Rule forklaret er en gratis Ren arkitektur og designmønstre i praksis-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Ren arkitektur og designmønstre i praksis, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Ren arkitektur og designmønstre i praksis-kurset indeholder 4 lektioner i alt.

Kernen i Clean Architecture

Velkommen til vores lektion om afhængighedsreglen! Dette princip er hjørnestenen i Clean Architecture og sikrer, at din centrale forretningslogik forbliver isoleret og uafhængig.

Det handler om at styre afhængighedernes retning i din applikation på en meget bestemt måde.

Afhængigheder bevæger sig indad

Den grundlæggende idé er enkel: Afhængigheder kan kun bevæge sig indad. Det betyder, at de ydre lag i din arkitektur skal afhænge af de indre lag, mens de indre lag aldrig må afhænge af de ydre lag.

Tænk på det som en ensrettet vej, der altid fører mod centrum af din applikations logik.

Visualisering af reglen

Husk de koncentriske cirkler i Clean Architecture (entiteter, Use Cases, grænsefladeadaptere, rammeværker/drivere). Afhængighedsreglen bestemmer, at kode i en ydre cirkel må afhænge af kode i en indre cirkel, men aldrig omvendt.

  • Indre lag: Centrale forretningsregler, uafhængige.
  • Ydre lag: Brugergrænseflader, databaser, web-rammeværker og eksterne tjenester.

Hvorfor er denne regel vigtig?

Det giver betydelige fordele at følge afhængighedsreglen konsekvent:

  • Isolation: Din centrale forretningslogik er beskyttet mod ændringer i brugergrænseflader, databaser eller rammeværker.
  • Testbarhed: Du kan teste din kerne-logik uden at skulle opsætte en database eller en webserver.
  • Fleksibilitet: Du kan udskifte eksterne komponenter (f.eks. skifte fra SQL til NoSQL eller fra ét web-rammeværk til et andet) med minimal påvirkning af din kerne.

Det ydre lag kalder indad

Dette er det naturlige og tilladte flow. Et ydre lag, f.eks. en web-controller, afhænger af et indre lag, f.eks. et Use Case, for at udføre en handling. Controlleren kender til Use Caset.

Prøv at køre dette eksempel:

class CreateUserUseCase {
  public void execute(String username) {
    System.out.println("Logic to create user: " + username);
  }
}

// Outer layer (e.g., Web Controller)
class UserController {
  private final CreateUserUseCase createUserUseCase;

  public UserController(CreateUserUseCase useCase) {
    this.createUserUseCase = useCase;
  }

  public String register(String username) {
    createUserUseCase.execute(username);
    return "User registration initiated for " + username;
  }
}

public class Main {
  public static void main(String[] args) {
    CreateUserUseCase useCase = new CreateUserUseCase();
    UserController controller = new UserController(useCase);

    System.out.println(controller.register("Alice"));
  }
}

Det indre lags uafhængighed

Hvad nu, hvis vores CreateUserUseCase (indre lag) skal sende en succesmeddelelse tilbage til UserController (ydre lag)?

Det kan ikke kalde en metode på UserController direkte. Det ville betyde, at det indre lag er afhængigt af det ydre lag, hvilket bryder afhængighedsreglen!

Invertering af afhængigheden

For at løse dette bruger vi invertering af afhængigheder. Det indre lag (Use Case) definerer en grænseflade, ofte kaldet en 'Port' eller 'Output Port', som det forventer at kommunikere gennem.

Det ydre lag (Controller/Presenter) implementerer derefter denne grænseflade og stiller sig selv til rådighed for det indre lag. Det vender afhængighedsretningen på kompileringstidspunktet.

Kode: Inverteret afhængighed

Bemærk, hvordan CreateUserUseCase nu kun afhænger af sin egen grænseflade, UserOutputPort. UserController implementerer denne port, så Use Case'et kan 'svare tilbage' uden at kende de specifikke detaljer om brugergrænsefladen.

Prøv at køre dette eksempel:

// 1. Inner layer defines its 'output port' (interface)
interface UserOutputPort {
  void presentUserCreationResult(String message);
}

// 2. Inner layer (Use Case) depends on its own interface
class CreateUserUseCase {
  private final UserOutputPort outputPort;

  public CreateUserUseCase(UserOutputPort outputPort) {
    this.outputPort = outputPort;
  }

  public void execute(String username) {
    // Simulate user creation logic
    System.out.println("Processing creation for: " + username);
    outputPort.presentUserCreationResult("User '" + username + "' created!");
  }
}

// 3. Outer layer (e.g., Web Controller) implements the 'port'
class UserController implements UserOutputPort {
  private final CreateUserUseCase createUserUseCase;

  public UserController() {
    // Controller provides itself as the output port
    this.createUserUseCase = new CreateUserUseCase(this);
  }

  public void registerUser(String username) {
    createUserUseCase.execute(username);
  }

  @Override
  public void presentUserCreationResult(String message) {
    System.out.println("UI Update: " + message);
  }
}

public class Main {
  public static void main(String[] args) {
    UserController controller = new UserController();
    controller.registerUser("Bob");
  }
}

Konsekvenser af at bryde reglen

Hvis du overtræder afhængighedsreglen, fører det til en skrøbelig og ufleksibel arkitektur:

  • Tæt kobling: Din kerne логik bliver bundet til eksterne detaljer (brugergrænseflade, database).
  • Vanskelig testning: Test af forretningsregler kræver, at du opsætter eksterne komponenter.
  • Mindre fleksibilitet: Det bliver en omfattende opgave at skifte frameworks eller databaser.
  • Lækkende abstraktioner: Indre lag afslører viden om ydre lag, hvilket gør systemet sværere at forstå og vedligeholde.

Hurtigt tjek

Afhængighedsreglen er afgørende for at bevare en ren og fleksibel arkitektur. Lad os teste din forståelse af, hvordan afhængigheder bør flyde.

Opsummering: Afhængighedsreglen

Du har lært, at afhængighedsreglen er det grundlæggende princip i Clean Architecture. Den fastslår, at afhængigheder altid skal flyde indad, fra ydre lag til indre lag.

  • Den beskytter din centrale forretningslogik.
  • Den forbedrer testbarhed og fleksibilitet.
  • Invertering af afhængigheder (ved hjælp af grænseflader) er afgørende for, at indre lag kan kommunikere udad uden direkte afhængigheder.

Det er nødvendigt at beherske denne regel for at bygge robuste og vedligeholdelsesvenlige softwaresystemer!

Gratis at komme i gang

Lær Ren arkitektur og designmønstre i praksis med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Dependency Rule forklaret” gratis?

Ja — hele teksten til “Dependency Rule forklaret” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Ren arkitektur og designmønstre i praksis-kurset, skal du opgradere til CoddyKit PRO. Ren arkitektur og designmønstre i praksis-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Dependency Rule forklaret”?

Forstå den grundlæggende Dependency Rule, som fastslår, at afhængigheder kun må flyde indad, så den centrale forretningslogik forbliver isoleret. Du øver dig i Ren arkitektur og designmønstre i praksis med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Ren arkitektur og designmønstre i praksis?

Der kræves ingen tidligere erfaring. Ren arkitektur og designmønstre i praksis på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Dependency Rule forklaret”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Ren arkitektur og designmønstre i praksis-lektion?

Ja. Alle Ren arkitektur og designmønstre i praksis-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvad er Clean Architecture?
  2. Forståelse af arkitekturlag
  3. Dependency Rule forklaret
  4. Screaming Architecture og use case-intention
← Tilbage til Ren arkitektur og designmønstre i praksis