From 3127c1b4af86e5ff8117044cce1f8688318c8bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20St=C4=99pie=C5=84?= Date: Fri, 28 Aug 2026 19:47:03 +0200 Subject: [PATCH] docs: allow direct Godot-to-Godot imports between features --- docs/02_architecture.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/02_architecture.md b/docs/02_architecture.md index 25ad324..9eb447a 100644 --- a/docs/02_architecture.md +++ b/docs/02_architecture.md @@ -247,6 +247,27 @@ Loot -> Enemies.Application ŹLE Combat -> Enemies.Godot ŹLE ``` +### Wyjątek: `Godot` -> `Godot` + +`Domain` i `Application` trzymają się reguły bez wyjątków - tam kontrakt broni czegoś realnego (można podmienić implementację, przetestować logikę bez silnika, nie ma przypadkowego sprzężenia). + +`Godot` tego wsparcia nie potrzebuje - kontrolery są celowo "głupie" i nie są objęte testami automatycznymi, więc kontrakt istniałby tam wyłącznie po to, żeby ominąć ograniczenie edytora Godota (`[Export]` nie umie wskazywać na typ-interfejs). Dlatego `Godot` jednego feature'a może importować `Godot` innego feature'a bezpośrednio, najczęściej po to, żeby zawrzeć w scenie węzeł z innego feature'a (`[Export]` na konkretną klasę) i wywołać na nim kilka metod. + +```text +Players.Godot -> Interactions.Godot DOBRZE (kontener sceny, wywołanie metod kontrolera) +Players.Application -> Interactions.Godot ŹLE (logika feature'a nadal tylko przez Contracts) +Players.Domain -> Interactions.Godot ŹLE +``` + +`GetNode`/`GetNodeOrNull` po ścieżce w scenie między feature'ami dalej jest niepożądane - zależność ma być jawna (typowane pole `[Export]` albo parametr metody `Initialize`/`Use...`), nie odnajdywana w drzewie sceny w runtime. + +Ten wyjątek nie zwalnia z Prawa Demeter. Rozmawiamy tylko z bezpośrednim sąsiadem - jeśli feature trzyma w sobie kontroler innego feature'a, woła na nim metody sam, zamiast wystawiać go dalej do przechodzenia przez łańcuch (`node.Inner.Other.Method()`). Kod spoza feature'a nie powinien wiedzieć, że dany kontroler w ogóle zawiera w sobie coś z innego feature'a. + +```text +player.SetMovementMode(mode) DOBRZE (PlayerController sam woła w środku Interaction/Body) +player.Interaction.SetActive(isActive) ŹLE (wywołujący łańcuje się przez Playera do Interaction) +``` + ### Eventy między feature'ami Gdy jedno zdarzenie interesuje wiele feature'ów, feature źródłowy publikuje event i nie wie, kto go słucha: