de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

Przechodzenie do samego dna: zrozumienie diagramów kodu C4 – co to są, kiedy przynoszą wartość i praktyczne przykłady PlantUML

Co to jest diagram kodu C4?

Diagram kodu toPoziom 4— najgłębszy, najszczegółowiejszy poziom w modelu C4 Simona Brown.

The Ultimate Guide to C4 Model Visualization with Visual Paradigm's AI Tools - ArchiMetric

Pokazuje:

  • Klasyinterfejsywyliczeniarejestracje, lub inne konstrukcje poziomu kodu, które implementują określonykomponent (z poziomu 3).

  • Związki między tymi klasami (dziedziczenie, kompozycja, zależność, realizacja interfejsów itp.).

  • Kluczoweelementy projektowe takie jak wzorce stosowane wewnątrz komponentu (np. repozytoria, usługi, DTO, encje domeny, fabryki).

W praktyce ten poziom to niemal zawszediagram klas UML (lub uproszczona wersja), skupiona na jednym (lub bardzo małej liczbie) komponentach.

Ważna wyjaśnienie:

  • Poziom 4 tonie nie dotyczy całego kodu źródłowego.

  • Nie jestniewymagane do pokazania każdej klasy.

  • Mapuje tylko istotną strukturępotrzebną do zrozumienia, jak faktycznie budowana jest złożona lub krytyczna część.

  • Oficjalna rekomendacja C4: idealnie generowana automatyczniez kodu źródłowego (przez narzędzia takie jak Doxygen, Javadoc + wtyczki UML, yWorks, Structurizr, CodeSee itp.) zamiast rysowana ręcznie.

Kiedy tworzyć diagram kodu

Twórz diagramy poziomu 4 oszczędnie — tylko w tych sytuacjach:

  • Składnik jest bardzo złożonykrytyczny dla misji, lub trudny do zrozumieniaz samego kodu źródłowego (np. skomplikowana logika domeny, intensywne wykorzystanie wzorców projektowych, przepływy kryptograficzne, maszyny stanów, kod dziedziczony pełen długu technicznego).

  • Pracujesz w bardzo regulowanym sektorze (finanse, medycyna, lotnictwo, obrona), gdzie audytorzy lub zespoły zgodności wymagają jasnego odwzorowania architektura → projekt → implementacja.

  • W trakcie dużego przekształceniaprzytłaczania składnika dziedziczonego, lub wprowadzania nowego wzorca architektonicznego (heksagonalny, czysty, pionowy przekrój, agregaty DDD) — widoki przed/po pomagają przekazać zmianę.

  • Wprowadzanie starszych programistów lub architektówktórzy muszą szybko zrozumieć nieoczywistą wewnętrzną strukturę krytycznego pod kątem ryzyka fragmentu kodu.

  • Już zainwestowałeś w automatyczne generowanienarzędzia — więc utrzymanie poziomu 4 kosztuje niemal nic.

  • Zespół zgodził się, że „żywa dokumentacja”na poziomie klasy jest wartościowa dla tego konkretnego podsystemu.

Nie twórz diagramów poziomu 4, gdy:

  • Struktura składników jest oczywista dzięki dobremu nazewnictwu, małej wielkości lub czystemu kodowi (większość nowoczesnych mikroserwisów mieści się w tej kategorii).

  • Masz już dobrze napisane testy jednostkowe/integracyjnejasne interfejsy, oraz objaśniające komentarze.

  • Większość zespołu łatwo porusza się po kodzie.

  • Koszty utrzymania przewyższają korzyści (ręcznie rysowane diagramy klas bardzo szybko się wygryzają).

Simon Brown i większość praktyków podkreśla: Większość zespołów nigdy nie potrzebuje poziomu 4Poziomy 1 i 2zaspokajają 80–90% potrzeb komunikacji; Poziom 3zajmuje się większością pozostałych przypadków. Poziom 4 to wyjątek, a nie reguła.

Dlaczego używać diagramów kodu? (Gdy przynoszą wartość)

  • Łączy architekturę ↔ realizację — Pokazuje, jak komponenty najwyższego poziomu są faktycznie zrealizowane w kodzie.

  • Ujednolica skomplikowaną wewnętrzną architekturę — Wskazuje na wykorzystanie wzorców (Strategia, Fabryka, Dekorator, Repozytorium), naruszenia warstw, silne powiązania lub sprytne modelowanie domeny.

  • Wsparcie audytów i zgodności — Pokazuje, że decyzje architektoniczne są realizowane w kodzie.

  • Wsparcie dyskusji nad refaktoryzacją i migracją — Struktury klas przed i po ułatwiają zrozumienie propozycji.

  • Zmniejsz „wiedzę plemienną” — Pomaga nowym seniorom szybciej zrozumieć trudne fragmenty niż czytanie wszystkich plików źródłowych.

  • Wersje generowane automatycznie stają się „żywymi dokumentami” — Jeśli narzędzia są w miejscu, pozostają dokładne praktycznie bez wysiłku.

Jak stworzyć świetny diagram kodu (krok po kroku + najlepsze praktyki)

  1. Wybierz JEDEN komponent — Zazwyczaj z diagramu poziomu 3, gdzie złożoność wewnętrzna uzasadnia powiększenie.

  2. Zdecyduj: rysowany ręcznie czy generowany?

    • Rysowany ręcznie → tylko do warsztatów, propozycji lub obszarów zbyt chaotycznych dla narzędzi automatycznych.

    • Generowany → zalecane (PlantUML można nadal użyć do stylizacji/ dopasowania wyjścia).

  3. Skup się na istotnych elementach — Pokaż:

    • Kluczowe klasy i interfejsy

    • Ważne relacje (→ zależność, — kompozycja, <| realizacja, ^ dziedziczenie)

    • Agregaty, encje, obiekty wartości (styl DDD)

    • Krytyczne wzorce lub antywzorce, które chcesz wyróżnić

  4. Zachowaj mały rozmiar — Maksymalnie 8–15 klas. Jeśli większy → podziel na skupione diagramy (np. „kawałek uwierzytelniania”, „encje przetwarzania zamówień”).

  5. Najlepsze praktyki

    • Zalecaj generowanie automatyczne gdy to możliwe (mniejsza utrata aktualności).

    • Używaj składni PlantUML classDiagram — czytelna i wersjonowalna.

    • Dodaj notatki dla nieoczywistych decyzji (np. „Używa anemicznego modelu domeny – zaplanowana refaktoryzacja”).

    • Unikaj pokazywania wszystkiego — pomijaj trywialne gettery/settery, klasy pomocnicze.

    • Przechowuj w repozytorium → traktuj jako kod (zatwierdzaj pliki .puml obok komponentu).

    • Używaj oszczędnie — jeden na złożony komponent, nie na każdy mikroserwis.

    • Połącz z dynamiczne widoki (sekwencja/współpraca), jeśli przepływ w czasie wykonywania jest ważniejszy niż struktura statyczna.

Przykład PlantUML – Komponent uwierzytelniania (rozszerzenie stylu Big Bank plc)

Oto realistyczny przykład poziomu 4, przybliżający Komponent zabezpieczeń / uwierzytelniania z wcześniejszych diagramów aplikacji API.

@startuml
tytuł C4 Poziom 4 – Diagram kodu: Uwierzytelnianie w aplikacji API

skinparam monochrome true
skinparam shadowing false
skinparam class {
  BackgroundColor White
  BorderColor Black
  ArrowColor Black
}

abstrakcyjna klasa AuthenticationProvider {
  + authenticate(credentials): Authentication
}

class JwtAuthenticationProvider {
  - tokenProvider: JwtTokenProvider
  - userDetailsService: UserDetailsService
  + authenticate(credentials): Authentication
}

class JwtTokenProvider {
  - secretKey: String
  - validityInMilliseconds: long
  + generateToken(userDetails): String
  + validateToken(token): boolean
  + getUsernameFromToken(token): String
}

interfejs UserDetailsService {
  + loadUserByUsername(username): UserDetails
}

class DatabaseUserDetailsService {
  - userRepository: UserRepository
  + loadUserByUsername(username): UserDetails
}

class UserRepository {
  + findByUsername(username): Optional<User>
}

class User {
  - username: String
  - passwordHash: String
  - roles: Set<Role>
}

class JwtAuthenticationToken << (T,orchid) Authentication >> {
  - principal: UserDetails
  - credentials: Object
  - authorities: Collection<GrantedAuthority>
}

' Relacje
JwtAuthenticationProvider -up-> JwtTokenProvider : używa
JwtAuthenticationProvider -up-> UserDetailsService : używa
DatabaseUserDetailsService .up.|> UserDetailsService
DatabaseUserDetailsService --> UserRepository : używa
UserRepository --> User : zwraca

JwtAuthenticationToken .up.|> Authentication

note right of JwtAuthenticationProvider
  Podstawowy przepływ uwierzytelniania dla sesji bezstanowych opartych na JWT
end note

note bottom of JwtTokenProvider
  Podpisuje i weryfikuje JWT przy użyciu HS512
end note

@enduml

Ten mały diagram:

  • Skupia się wyłącznie na wewnętrznych aspektach uwierzytelniania

  • Pokazuje kluczowe klasy, interfejsy i zależności

  • Wyróżnia wzorce (dostawca, repozytorium)

  • Używa notatek do dostarczania kontekstu

Wklej do dowolnego renderera PlantUML — dostosuj do swojego domeny (np. zastąp JWT przez OAuth2, dodaj klasy MFA itp.).

Przypomnienie podsumowujące: Poziom 4 jest potężny, ale rzadki. Używaj go świadomie, preferuj generowanie automatyczne i nigdy nie pozwól, by stało się to zbędną pracą. Największą wartość w C4 dają poziomy 1–3. Szczęśliwego (wybieranego) modelowania!

Zasób

Ten post dostępny jest również w Deutsch, English, Español, فارسی, Français, English, Bahasa Indonesia, 日本語, Portuguese, Ру́сский, Việt Nam, 简体中文 and 繁體中文