de_DEen_USes_ESfa_IRfr_FRhi_IN

सभी तरफ जूम करना: C4 कोड डायग्राम को समझना – वे क्या हैं, जब वे मूल्य जोड़ते हैं, और प्रैक्टिकल PlantUML उदाहरण

C4 कोड डायग्राम क्या है?

कोड डायग्राम हैस्तर 4 — साइमन ब्राउन के C4 मॉडल में सबसे गहरा, सबसे विस्तृत स्तर।

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

यह दिखाता है:

  • क्लासेजइंटरफेसएन्यूम्सरिकॉर्ड्स, या एक विशिष्ट कंपोनेंट को लागू करने वाले अन्य कोड-स्तरीय निर्माण (कंस्ट्रक्ट्स)कंपोनेंट (स्तर 3 से)।

  • संबंध उन क्लासेज के बीच (विरासत, संघटना, निर्भरता, इंटरफेस के वास्तविकीकरण आदि)।

  • मुख्य डिज़ाइन तत्व जैसे कि कंपोनेंट के अंदर लागू पैटर्न (उदाहरण के लिए, रिपॉजिटरीज़, सेवाएं, DTOs, डोमेन एंटिटीज़, फैक्ट्रियां)।

व्यवहार में, इस स्तर को लगभग हमेशा एक UML क्लास डायग्राम (या सरलीकृत संस्करण) एक (या बहुत कम) कंपोनेंट पर केंद्रित।

महत्वपूर्ण स्पष्टीकरण:

  • स्तर 4 है नहीं पूरे कोडबेस के बारे में।

  • यह है नहींहर क्लास को दिखाने के लिए आवश्यक है।

  • यह मैप करता हैकेवल आवश्यक संरचनाजिसकी आवश्यकता एक जटिल या महत्वपूर्ण घटक के वास्तविक निर्माण को समझने के लिए होती है।

  • आधिकारिक C4 सिफारिश:आदर्श रूप से स्वचालित उत्पन्नस्रोत कोड से (Doxygen, Javadoc + UML प्लगइन, yWorks, Structurizr, CodeSee आदि टूल्स के माध्यम से) हाथ से बनाए जाने के बजाय।

कोड डायग्राम बनाने का समय

स्पार्सली लेवल 4 डायग्राम बनाएं — केवल इन स्थितियों में:

  • घटक हैअत्यधिक जटिलमिशन-क्रिटिकल, यासमझने में कठिनकेवल स्रोत कोड से (उदाहरण के लिए, जटिल डोमेन लॉजिक, डिज़ाइन पैटर्न का भारी उपयोग, क्रिप्टोग्राफिक फ्लो, स्टेट मशीन, तकनीकी देनदारी से भरा लीगेसी कोड)।

  • आप एक में काम कर रहे हैंअत्यधिक नियमित उद्योग (वित्त, स्वास्थ्य सेवा, एयरोस्पेस, रक्षा) जहां ऑडिटर या संपादन टीमें आर्किटेक्चर → डिज़ाइन → इम्प्लीमेंटेशन के लिए स्पष्ट मैपिंग मांगती हैं।

  • के दौरानमुख्य रूपांतरणपुराने घटक को बांधना, याएक नए आर्किटेक्चरल पैटर्न को लागू करना (हेक्सागोनल, क्लीन, वर्टिकल स्लाइस, DDD एग्रीगेट्स) — पहले/बाद के दृश्य बदलाव को समझाने में मदद करते हैं।

  • ऑनबोर्डिंगसीनियर डेवलपर्सयाआर्किटेक्ट्सजिन्हें एक उच्च जोखिम वाले कोड के गैर-स्पष्ट आंतरिक संरचना को त्वरित रूप से समझने की आवश्यकता है।

  • आपने पहले से ही निवेश कर दिया है स्वचालित उत्पादन उपकरण — इसलिए लेवल 4 के बनाए रखने की लागत लगभग कोई नहीं है।

  • टीम ने सहमति जताई है कि “जीवित दस्तावेज़ीकरण” वर्ग स्तर पर इस विशिष्ट उपप्रणाली के लिए मूल्यवान है।

जब निम्नलिखित स्थितियों में लेवल 4 आरेख न बनाएं:

  • घटक संरचना अच्छे नामकरण, छोटे आकार या साफ कोड से स्पष्ट है (अधिकांश आधुनिक माइक्रोसर्विस इस श्रेणी में आते हैं)।

  • आपके पास पहले से ही है अच्छे यूनिट/एकीकरण परीक्षणस्पष्ट इंटरफेस, और व्याख्यात्मक टिप्पणियाँ.

  • टीम के अधिकांश सदस्य कोड को आसानी से नेविगेट करने में सक्षम हैं।

  • रखरखाव लागत लाभ से अधिक है (हाथ से बनाए गए वर्ग आरेख बहुत जल्दी अप्रचलित हो जाते हैं)।

साइमन ब्राउन और अधिकांश प्रैक्टिशनर जोर देते हैं: अधिकांश टीमों को कभी भी लेवल 4 की आवश्यकता नहीं होती हैलेवल 1 + 2 संचार की आवश्यकताओं के 80–90% को कवर करते हैं; लेवल 3 बाकी के अधिकांश हिस्से को संभालता है। लेवल 4 नियम के विपरीत एक अपवाद है।

कोड आरेख का उपयोग क्यों करें? (जब वे मूल्य जोड़ते हैं)

  • आर्किटेक्चर ↔ कार्यान्वयन के बीच पुल बनाएं — दिखाता है कि उच्च स्तर के घटक कोड में वास्तव में कैसे लागू किया जाता है।

  • जटिल आंतरिक डिज़ाइन को स्पष्ट करें — पैटर्न (रणनीति, फैक्टरी, डिकोरेटर, रिपॉजिटरी) के उपयोग, परतों के उल्लंघन, तंग कपलिंग या चतुर डोमेन मॉडलिंग को उजागर करता है।

  • ऑडिट और सुसंगतता का समर्थन करें — यह दिखाता है कि आर्किटेक्चरल निर्णय कोड तक लागू किया जाता है।

  • रिफैक्टरिंग और माइग्रेशन चर्चाओं में सहायता करें — पहले/बाद के क्लास संरचनाएं प्रस्तावों को मापने योग्य बनाती हैं।

  • “ट्राइबल ज्ञान” को कम करें — नए सीनियर नियुक्तियों को सभी सोर्स फाइलों को पढ़ने की तुलना में गैर-स्पष्ट भागों को तेजी से समझने में मदद करता है।

  • ऑटो-जनरेटेड संस्करण “लाइविंग डॉक्स” बन जाते हैं — यदि टूलिंग उपलब्ध है, तो उन्हें � prácticamente कोई प्रयास किए बिना सटीक रखा जा सकता है।

एक शानदार कोड डायग्राम बनाने का तरीका (स्टेप-बाय-स्टेप + बेस्ट प्रैक्टिसेज)

  1. एक घटक चुनें — आमतौर पर लेवल 3 डायग्राम से, जहां आंतरिक जटिलता जूम के लिए तर्कसंगत हो।

  2. निर्णय लें: हाथ से बनाया या जनरेट किया गया?

    • हाथ से बनाया → केवल वर्कशॉप्स, प्रस्तावों या ऐसे क्षेत्रों के लिए, जहां ऑटो-टूल्स के लिए बहुत अव्यवस्थित हैं।

    • जनरेट किया गया → प्राथमिकता (प्लांटयूएमएल का उपयोग आउटपुट को स्टाइल/एडजस्ट करने के लिए अभी भी किया जा सकता है)।

  3. मुख्य बातों पर ध्यान केंद्रित करें — दिखाएं:

    • मुख्य क्लासेज/इंटरफेस

    • महत्वपूर्ण संबंध (→ निर्भरता, — संघटना, <| वास्तविकीकरण, ^ विरासत)

    • एग्रीगेट्स, एंटिटीज, मूल्य ऑब्जेक्ट्स (डीडीडी शैली)

    • महत्वपूर्ण पैटर्न या एंटी-पैटर्न जिन्हें आप उजागर करना चाहते हैं

  4. इसे छोटा रखें — अधिकतम 8–15 क्लासेज। यदि बड़ा है → फोकस्ड डायग्राम में विभाजित करें (उदाहरण के लिए, “प्रमाणीकरण स्लाइस”, “ऑर्डर प्रोसेसिंग एंटिटीज”)।

  5. बेस्ट प्रैक्टिसेज

    • प्राथमिकता दें ऑटो-जनरेशन जब भी संभव हो (कम अप्रचलितता)।

    • उपयोग करें प्लांटयूएमएल क्लासडायग्राम सिंटैक्स — साफ और वर्जन योग्य।

    • जोड़ें नोट्स अस्पष्ट निर्णयों के लिए (उदाहरण के लिए, “अनीमिक डोमेन मॉडल का उपयोग – योजित रीफैक्टरिंग”)।

    • दिखाने से बचें सब कुछ — नगण्य गेटर्स/सेटर्स, उपयोगिता क्लासेस को छोड़ दें।

    • रिपो में स्टोर करें → कोड के रूप में व्यवहार करें (कंपोनेंट के पास .puml फाइलें कमिट करें)।

    • बहुत कम उपयोग करें — एक जटिल कंपोनेंट प्रति, माइक्रोसर्विस प्रति नहीं।

    • के साथ संयोजित करें डायनामिक दृश्य (अनुक्रम/सहयोग) यदि रनटाइम फ्लो स्थिर संरचना से अधिक महत्वपूर्ण है।

PlantUML उदाहरण – प्रमाणीकरण कंपोनेंट (बिग बैंक plc शैली विस्तार)

यहाँ एक वास्तविक लेवल 4 उदाहरण है जो सुरक्षा / प्रमाणीकरण कंपोनेंट पिछले API एप्लिकेशन डायग्राम्स से।

@startuml
title C4 लेवल 4 – कोड डायग्राम: API एप्लिकेशन के अंदर प्रमाणीकरण

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

abstract class 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
}

interface 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>
}

' Relationships
JwtAuthenticationProvider -up-> JwtTokenProvider : uses
JwtAuthenticationProvider -up-> UserDetailsService : uses
DatabaseUserDetailsService .up.|> UserDetailsService
DatabaseUserDetailsService --> UserRepository : uses
UserRepository --> User : returns

JwtAuthenticationToken .up.|> Authentication

note right of JwtAuthenticationProvider
  JWT-आधारित बिना अवस्था वाले सत्रों के लिए मुख्य प्रमाणीकरण प्रवाह
end note

note bottom of JwtTokenProvider
  HS512 का उपयोग करके JWT को हस्ताक्षरित और सत्यापित करता है
end note

@enduml

यह छोटा डायग्राम:

  • केवल प्रमाणीकरण आंतरिक विवरण पर ध्यान केंद्रित करता है

  • मुख्य क्लासेस, इंटरफेस और निर्भरताओं को दिखाता है

  • पैटर्न (प्रदाता, भंडारण) को उजागर करता है

  • संदर्भ के लिए नोट्स का उपयोग करता है

किसी भी PlantUML रेंडरर में पेस्ट करें — अपने डोमेन के लिए कस्टमाइज़ करें (उदाहरण के लिए, JWT को OAuth2 से बदलें, MFA क्लासेस जोड़ें, आदि)।

सारांश याद दिलाना: लेवल 4 शक्तिशाली है लेकिन दुर्लभ। इसका जानबूझकर उपयोग करें, स्वचालित उत्पादन को प्राथमिकता दें, और कभी भी इसे बेकार काम न बनने दें। C4 में अधिकांश मूल्य लेवल 1–3 से आता है। खुश (चयनात्मक) मॉडलिंग!

संसाधन

यह पोस्ट Deutsch, English, Español, فارسی और Français में भी उपलब्ध है।