सॉफ्टवेयर प्रणालियाँ बढ़ती हैं। फीचर जोड़े जाते हैं, सेवाओं को विभाजित किया जाता है, और एकीकरण बढ़ते हैं। स्पष्ट नक्शे के बिना, आर्किटेक्चर एक जटिल तार के रूप में बन जाता है जिसे नेविगेट करना, बनाए रखना या स्टेकहोल्डर्स को समझाना मुश्किल हो जाता है। यहीं पर सी4 मॉडल का दस्तावेज़ आता है। यह सॉफ्टवेयर आर्किटेक्चर के दस्तावेज़ीकरण के लिए एक संरचित दृष्टिकोण प्रदान करता है, जटिलता को प्रबंधनीय स्तरों पर अब्स्ट्रैक्शन में तोड़ता है।
लक्ष्य केवल चित्र बनाना नहीं है, बल्कि इरादे, संरचना और व्यवहार को संचारित करना है। एक संगत डायग्राम सेट के उपयोग से, टीमें इस बात पर सहमति बना सकती हैं कि प्रणाली कैसे काम करती है, बिना बहुत जल्दी इम्प्लीमेंटेशन विवरणों में खो जाने के। यह मार्गदर्शिका सी4 मॉडल के चार स्तरों, उन्हें प्रभावी ढंग से लागू करने के तरीके और उन सिद्धांतों का अध्ययन करती है जो आपके दस्तावेज़ीकरण को समय के साथ उपयोगी बनाए रखते हैं।

🧩 सी4 मॉडल फ्रेमवर्क को समझना
सी4 मॉडल सॉफ्टवेयर आर्किटेक्चर डायग्राम का एक पदानुक्रम है। इसका अर्थ है संदर्भ, कंटेनर, घटक और कोड। प्रत्येक स्तर एक अलग स्तर के अब्स्ट्रैक्शन का प्रतिनिधित्व करता है, जो विशिष्ट दर्शकों और उद्देश्य के अनुरूप होता है। एक विशाल डायग्राम के बजाय जो सब कुछ दिखाने की कोशिश करता है, मॉडल परतदार दृष्टिकोण को प्रोत्साहित करता है।
-
स्तर 1:संदर्भ डायग्राम 🌍
-
स्तर 2:कंटेनर डायग्राम 📦
-
स्तर 3:घटक डायग्राम ⚙️
-
स्तर 4:कोड डायग्राम 💻
इस संरचना के कारण आप केवल तब तक प्रणाली के विशिष्ट हिस्सों पर जूम कर सकते हैं जब आवश्यकता हो। यह उच्च स्तर के अवलोकन में प्रत्येक कोड लाइन को समझने की कोशिश करने से आने वाली मानसिक भार को रोकता है। मॉडल तकनीकी निरपेक्ष है, जिसका अर्थ है कि यह विशिष्ट प्रोग्रामिंग भाषाओं या फ्रेमवर्क पर निर्भर नहीं है।
📉 अब्स्ट्रैक्शन का पदानुक्रम
सही विवरण के स्तर का चयन करना महत्वपूर्ण है। एक बहुत उच्च स्तर का डायग्राम तकनीकी मार्गदर्शन प्रदान नहीं करता है। एक बहुत विस्तृत डायग्राम पाठक को भारी बना देता है। नीचे दी गई तालिका चार स्तरों के बीच के अंतर को दर्शाती है, जिसमें लक्षित दर्शक और सामान्य दायरा शामिल है।
|
स्तर |
फोकस |
प्राथमिक दर्शक |
मुख्य प्रश्न का उत्तर |
|---|---|---|---|
|
संदर्भ |
प्रणाली की सीमाएँ और संबंध |
स्टेकहोल्डर्स, ग्राहक, आर्किटेक्ट्स |
प्रणाली क्या करती है और इसका उपयोग कौन करता है? |
|
कंटेनर |
उच्च स्तर की तकनीकी संरचना |
विकासकर्ता, डेवोप्स, आर्किटेक्ट्स |
कौन सी तकनीकों का उपयोग किया जाता है और वे कैसे संचार करते हैं? |
|
घटक |
कंटेनर का तार्किक विभाजन |
विकासकर्ता, टीम नेता |
कोड एक कंटेनर के अंदर कैसे व्यवस्थित है? |
|
कोड |
वर्ग स्तरीय संरचना और तर्क |
विकासकर्ता |
तर्क एक वर्ग या मॉड्यूल के भीतर कैसे बातचीत करता है? |
हर सिस्टम को सभी चार स्तरों की आवश्यकता नहीं होती है। एक छोटे एप्लिकेशन को केवल संदर्भ और कंटेनर डायग्राम की आवश्यकता हो सकती है। जटिल तर्क वाले बड़े एंटरप्राइज सिस्टम को कंपोनेंट और कोड स्तर से लाभ मिल सकता है। मुख्य बात यह है कि ऊपर से शुरू करें और केवल तभी नीचे की ओर जाएं जब अबस्ट्रैक्शन लीक हो या निर्णय लेने के लिए विवरण आवश्यक हों।
🌍 स्तर 1: संदर्भ डायग्राम
संदर्भ डायग्राम शुरुआती बिंदु है। यह रुचि के सिस्टम को परिभाषित करता है और यह दिखाता है कि यह व्यापक पारिस्थितिकी तंत्र में कैसे फिट होता है। इस डायग्राम को आमतौर पर नए टीम सदस्य द्वारा लैंडस्केप को समझने के लिए पहले देखा जाता है।
मुख्य तत्व
-
रुचि का सिस्टम: वह मुख्य एप्लिकेशन या सेवा जिसका वर्णन किया जा रहा है। इसे आमतौर पर केंद्र में एक बॉक्स के रूप में दर्शाया जाता है।
-
लोग: उपयोगकर्ता या ऐसे भूमिकाएं जो सिस्टम से बातचीत करती हैं। इनमें आंतरिक उपयोगकर्ता, बाहरी ग्राहक या प्रशासक शामिल हो सकते हैं।
-
सिस्टम: वे अन्य सॉफ्टवेयर सिस्टम जिनसे मुख्य सिस्टम संचार करता है। ये बाहरी निर्भरताएं या एकीकरण हैं।
-
संबंध: लोगों और सिस्टम को मुख्य बॉक्स से जोड़ने वाली रेखाएं। इन रेखाओं को लेबल लगाकर बातचीत के प्रकार को वर्णित किया जाता है (उदाहरण के लिए, “प्रबंधित करता है”, “उपभोग करता है”, “प्रदान करता है”)।
संदर्भ डायग्राम के लिए सर्वोत्तम प्रथाएं
-
सरल रखें: हर एक डेटाबेस या माइक्रोसर्विस को शामिल न करें, जब तक कि यह एक महत्वपूर्ण एकीकरण बिंदु न हो।
-
सीमाओं पर ध्यान केंद्रित करें: स्पष्ट रूप से परिभाषित करें कि आपके सिस्टम के भीतर क्या है और बाहर क्या है।
-
लेबल का उपयोग करें: तीरों में डेटा प्रवाह या क्रिया का वर्णन करने वाला पाठ होना चाहिए। लेबल रहित रेखा अस्पष्ट होती है।
-
रंग कोडिंग: विभिन्न प्रकार के क्रियाकलापियों के बीच अंतर करने के लिए रंगों का उपयोग करें, जैसे मानव बनाम अन्य सॉफ्टवेयर सिस्टम।
इस डायग्राम के निर्माण के समय, प्रश्न नहीं है “यह कैसे काम करता है?” बल्कि “यह क्या है?” है। यह सभी बाद के डायग्रामों के लिए मंच तैयार करता है। यदि संदर्भ डायग्राम भ्रमित है, तो नीचे दिए गए विस्तृत डायग्राम भी उसी समस्या से ग्रस्त होंगे।
📦 स्तर 2: कंटेनर डायग्राम
जब संदर्भ स्थापित हो जाता है, तो कंटेनर डायग्राम तकनीकी संरचना में गहराई से जाता है। एक कंटेनर एक उच्च स्तरीय निर्माण ब्लॉक है, जैसे वेब एप्लिकेशन, मोबाइल एप्लिकेशन, डेटाबेस या माइक्रोसर्विस। यह एक अलग, डिप्लॉय करने योग्य सॉफ्टवेयर इकाई है।
कंटेनर क्या है?
एक कंटेनर सख्त अर्थ में डॉकर कंटेनर नहीं है, हालांकि यह एक हो सकता है। यह कोई भी अलग रनटाइम वातावरण है। सामान्य उदाहरण हैं:
-
HTML और CSS चलाने वाला एक वेब सर्वर।
-
एक JAR फ़ाइल निष्पादित कर रहा जावा वर्चुअल मशीन।
-
एक पोस्टग्रेसक्यूएल डेटाबेस इंस्टेंस।
-
बादल में डेप्लॉय की गई सर्वरलेस फ़ंक्शन।
-
एक मोबाइल एप्लिकेशन जो फ़ोन पर स्थापित है।
कंटेनर डायग्राम इन कंटेनरों के बीच के संबंधों को दिखाता है। इसका ध्यान तकनीकी चयनों और उनके बीच संचार प्रोटोकॉल पर केंद्रित है।
मुख्य तत्व
-
कंटेनर: बॉक्स के रूप में दर्शाया जाता है, जिसमें तकनीक को दर्शाने के लिए अक्सर एक विशिष्ट आइकन या रंग होता है (उदाहरण के लिए, SQL के लिए डेटाबेस आइकन)।
-
कनेक्शन: संचार को दर्शाने वाली रेखाएं। इनमें प्रोटोकॉल को निर्दिष्ट करना चाहिए, जैसे HTTP, gRPC, TCP या SQL।
-
तकनीकी स्टैक: भाषा या फ्रेमवर्क को दर्शाने वाले लेबल (उदाहरण के लिए, “रिएक्ट”, “पायथन”, “माइक्रोसीक्यूएल”)।
रणनीतिक मूल्य
यह स्तर डेवोप्स और इंफ्रास्ट्रक्चर टीमों के लिए महत्वपूर्ण है। यह डेप्लॉयमेंट, स्केलिंग और सुरक्षा से संबंधित प्रश्नों के उत्तर देने में मदद करता है। यदि आप एक मोनोलिथिक आर्किटेक्चर से माइक्रोसर्विसेज में स्थानांतरण की योजना बना रहे हैं, तो यह डायग्राम उस संक्रमण के लिए ब्लूप्रिंट है। यह डेटा प्रवाह में एकल विफलता के बिंदु और बॉटलनेक्स की पहचान करने में मदद करता है।
इसे बनाते समय आंतरिक तर्क को दिखाने से बचें। क्लास या फ़ंक्शन को न दिखाएं। दृश्य को सिस्टम की सीमा पर रखें। यदि कंटेनर जटिल है, तो उसके लिए अलग से एक कंपोनेंट डायग्राम बना सकते हैं।
⚙️ स्तर 3: कंपोनेंट डायग्राम
जब कंटेनर एक एकल ब्लॉक के रूप में समझने के लिए बहुत बड़ा हो जाता है, तो आप कंपोनेंट स्तर पर जाते हैं। यह डायग्राम एक कंटेनर को उसके आंतरिक हिस्सों में तोड़ता है। कंपोनेंट कार्यक्षमता के तार्किक समूह होते हैं, जैसे एक मॉड्यूल, एक पैकेज या एप्लिकेशन के भीतर एक सेवा।
कंपोनेंट को परिभाषित करना
कंपोनेंट को उनके व्यवहार और इंटरफ़ेस द्वारा परिभाषित किया जाता है, उनके अनुप्रयोग द्वारा नहीं। एक कंपोनेंट प्रमाणीकरण का प्रबंधन कर सकता है, भुगतान प्रक्रिया कर सकता है, या इन्वेंट्री का प्रबंधन कर सकता है। लक्ष्य यह दिखाना है कि जिम्मेदारियां कंटेनर के भीतर कैसे वितरित हैं।
-
तार्किक संरचना: यह दिखाता है कि कोड को प्रबंधन योग्य टुकड़ों में कैसे व्यवस्थित किया गया है।
-
निर्भरताएं: यह दिखाता है कि कौन से कंपोनेंट दूसरों पर निर्भर हैं। यह जोड़ाव और संगठन को समझने में मदद करता है।
-
इंटरफ़ेस: यह निर्धारित करता है कि कंपोनेंट एक ही कंटेनर के भीतर एक दूसरे से कैसे बात करते हैं।
इस स्तर का उपयोग कब करें
इस स्तर का उपयोग आमतौर पर विशिष्ट विशेषताओं पर काम कर रही विकास टीम द्वारा किया जाता है। यह नए विकासकर्मियों के एकीकरण में मदद करता है क्योंकि यह दिखाता है कि उनका कोड कहां फिट होता है। यह आर्किटेक्चरल देनदारी की पहचान करने में भी उपयोगी है। यदि आप देखते हैं कि बहुत सारे कंपोनेंट एकल केंद्रीय कंपोनेंट पर निर्भर हैं, तो आपको एक बॉटलनेक्स या एक “गॉड ऑब्जेक्ट” हो सकता है जिसके रीफैक्टरिंग की आवश्यकता होगी।
कंटेनर और कंपोनेंट डायग्राम के बीच सुसंगतता बनाए रखना महत्वपूर्ण है। यदि लेवल 2 पर एक नया कंटेनर जोड़ा जाता है, तो संबंधित कंपोनेंट डायग्राम को अपडेट किया जाना चाहिए ताकि यह दिखाया जा सके कि यह कंटेनर व्यापक प्रणाली के भीतर कहाँ फिट होता है।
💻 स्तर 4: कोड डायग्राम
कोड डायग्राम सबसे विस्तृत दृश्य है। यह कंपोनेंट की आंतरिक संरचना दिखाता है, जो अक्सर क्लास या फंक्शन स्तर पर होता है। यद्यपि C4 मॉडल मुख्य रूप से आर्किटेक्चर के लिए है, इस स्तर का उपयोग जटिल एल्गोरिदम या महत्वपूर्ण लॉजिक पाथ के लिए उपयोगी हो सकता है।
सीमाएँ और विचारधाराएँ
-
रखरखाव: कोड अक्सर बदलता है। जितना अधिक कोड के करीब डायग्राम होते हैं, उतना ही जल्दी वे अप्रचलित हो जाते हैं।
-
उपकरण: स्रोत कोड से इन डायग्रामों को स्वचालित रूप से उत्पन्न करना आम है, लेकिन उन्हें पढ़ने योग्य बनाने के लिए हाथ से संपादन की आवश्यकता होती है।
-
परिधि: केवल महत्वपूर्ण पथों को डायग्राम के रूप में दर्शाएं। प्रणाली के हर क्लास को दस्तावेजीकरण की कोशिश न करें।
अधिकांश टीमें इस स्तर का बहुत कम उपयोग करती हैं। इस स्तर की विस्तृत जानकारी के लिए कोड कमेंट्स और दस्तावेजीकरण पर भरोसा करना अक्सर बेहतर होता है। हालांकि, जटिल एल्गोरिदम के लिए, एक दृश्य प्रतिनिधित्व कोड को पढ़ने की तुलना में डेटा के प्रवाह को बेहतर ढंग से स्पष्ट कर सकता है।
📐 प्रभावी डायग्रामिंग के नियम
डायग्राम बनाना एक कला है। लक्ष्य स्पष्टता है, न कि सौंदर्य। अपनी आर्किटेक्चर के दस्तावेजीकरण के दौरान अनुसरण करने वाले मुख्य सिद्धांत यहाँ दिए गए हैं।
1. अपने दर्शकों को जानें
प्रत्येक डायग्राम एक विशिष्ट समूह के लिए होता है। एक संदर्भ डायग्राम व्यापार स्टेकहोल्डर्स के लिए होता है जो मूल्य और आवश्यकता के बारे में चिंतित होते हैं। एक कंटेनर डायग्राम इंजीनियरों के लिए होता है जो तकनीक और एकीकरण के बारे में चिंतित होते हैं। एक कंपोनेंट डायग्राम डेवलपर्स के लिए होता है जो कोड संरचना के बारे में चिंतित होते हैं। एक ही डायग्राम को सभी को संतुष्ट करने की कोशिश न करें।
2. सुसंगतता महत्वपूर्ण है
सभी डायग्रामों में सुसंगत नामकरण पद्धति का उपयोग करें। यदि लेवल 2 में किसी कंटेनर का नाम “ऑर्डर सेवा” है, तो लेवल 3 में भी उसका नाम “ऑर्डर सेवा” होना चाहिए। असंगत नामकरण भ्रम पैदा करता है और प्रणाली के मानसिक मॉडल को तोड़ता है।
3. संस्करण नियंत्रण
डायग्रामों को कोड के रूप में लिया जाना चाहिए। उन्हें संस्करण नियंत्रण प्रणाली में स्टोर करें। इससे आप समय के साथ बदलावों को ट्रैक कर सकते हैं और समझ सकते हैं कि आर्किटेक्चर कैसे विकसित हुआ है। इसके अलावा सहयोग की अनुमति देता है, जिससे एक साथ कई आर्किटेक्ट डायग्रामों की समीक्षा और अद्यतन कर सकते हैं।
4. “क्यों” पर ध्यान केंद्रित करें
बस यह दिखाने की कोशिश न करें कि प्रणाली कैसी दिखती है। बताएं कि इसे ऐसे क्यों बनाया गया है। आर्किटेक्चरल निर्णयों को समझाने के लिए नोट जोड़ें। उदाहरण के लिए, “इस डेटाबेस को केवल पढ़ने योग्य बनाया गया है ताकि क्षेत्रों के बीच सुसंगतता सुनिश्चित की जा सके।” इस संदर्भ को अक्सर डायग्राम के खुद के मूल्य से अधिक महत्वपूर्ण माना जाता है।
🚫 बचने के लिए सामान्य गलतियाँ
यहाँ तक कि अनुभवी टीमें भी आर्किटेक्चर के दस्तावेजीकरण के दौरान गलतियाँ करती हैं। इन सामान्य जाल में रहने के बारे में जागरूक होना समय बचाता है और भ्रम से बचाता है।
1. “मैदान का बड़ा गांठ”
पूरी प्रणाली को एक ही डायग्राम में फिट करने की कोशिश करने से अव्यवस्था होती है। एक साथ सब कुछ दिखाने की इच्छा को रोकें। विश्राम के स्तर का पालन करें। यदि डायग्राम बहुत भीड़ वाला हो जाता है, तो आप अधिकांश रूप से अबस्ट्रैक्शन के स्तरों को मिला रहे हैं।
2. दर्शकों के बारे में बेखबरी
एक उत्पाद प्रबंधक के लिए कंपोनेंट डायग्राम बनाना समय की बर्बादी है। वे क्लास संरचना के बारे में चिंतित नहीं होते हैं। वे फीचर्स और व्यापारिक मूल्य के बारे में चिंतित होते हैं। डायग्राम को पाठक की आवश्यकताओं के अनुसार अनुकूलित करें।
3. अप्रचलित दस्तावेजीकरण
एक आर्किटेक्चर डायग्राम जो चल रही प्रणाली के मेल नहीं खाता, बिल्कुल भी डायग्राम न होने से भी बदतर है। इससे गलत सुरक्षा की भावना उत्पन्न होती है। दस्तावेजीकरण को एक जीवित वस्तु के रूप में लें। महत्वपूर्ण बदलाव के समय इसे अद्यतन करें।
4. अत्यधिक डिज़ाइन करना
एक आरेख को बेहतर बनाने के लिए दिनों तक बिताएं। लक्ष्य संचार है, कला नहीं। विचार को स्पष्ट करने वाला सरल ड्राइंग एक हफ्तों में बनने वाले बनाए गए चित्र से बेहतर है। तेजी से पुनरावृत्ति करने के लिए उपकरणों का उपयोग करें।
🤝 सहयोग और रखरखाव
आर्किटेक्चर एक टीम का प्रयास है। C4 मॉडल एक साझा भाषा प्रदान करके सहयोग को सुविधा प्रदान करता है। जब सभी एक ही शब्दों और संरचनाओं का उपयोग करते हैं, तो प्रणाली के बारे में चर्चा अधिक कुशल हो जाती है।
कार्यप्रणालियों में एकीकरण
-
ऑनबोर्डिंग: नए कर्मचारी संदर्भ और कंटेनर आरेखों का उपयोग करके तेजी से अपने काम में तैयार हो सकते हैं।
-
कोड समीक्षा: समीक्षक जांच सकते हैं कि कार्यान्वयन दस्तावेजीकृत आर्किटेक्चर के अनुरूप है या नहीं।
-
योजना बनाना: स्प्रिंट योजना बनाते समय, आरेख निर्भरताओं और जोखिमों को पहचानने में मदद करते हैं।
-
घटना प्रतिक्रिया: जब कोई प्रणाली विफल होती है, तो आरेख टीमों को विस्फोट के त्रिज्या और प्रभावित घटकों को समझने में मदद करते हैं।
सटीकता बनाए रखना
आरेखों को सटीक रखने के लिए निम्नलिखित रणनीतियों पर विचार करें:
-
स्वचालित उत्पादन: आरेखों को स्वचालित रूप से अपडेट करने के लिए उन उपकरणों का उपयोग करें जो कोड भंडारों से जानकारी निकालते हैं।
-
डिज़ाइन समीक्षा: प्रमुख विशेषताओं के लिए ‘काम पूरा’ की परिभाषा के हिस्से के रूप में आरेख अपडेट को शामिल करें।
-
स्वामित्व: विशिष्ट आरेखों के स्वामित्व को विशिष्ट टीमों को सौंपें। यदि कोई टीम एक कंटेनर का स्वामित्व रखती है, तो उसे उसके आरेखों को अपडेट करने की जिम्मेदारी होगी।
🔄 प्रणाली का विकास
प्रणालियाँ विकसित होती हैं। नए फीचर जोड़े जाते हैं, पुराने फीचर बंद कर दिए जाते हैं, और तकनीकों में बदलाव आता है। C4 मॉडल आपको अपने आरेखों को संस्करण बनाने की अनुमति देकर इस विकास का समर्थन करता है। आप ऐतिहासिक संस्करणों को बनाए रख सकते हैं ताकि समय के साथ प्रणाली कैसे बदली है, इसे समझ सकें।
इस ऐतिहासिक दृष्टिकोण का रिट्रोस्पेक्टिव के लिए मूल्यवान है। जब किसी पिछली घटना का विश्लेषण करते हैं, तो उस समय के आर्किटेक्चर आरेख को देखकर देख सकते हैं कि क्या संरचनात्मक समस्याएं इस समस्या के लिए योगदान दे रही थीं। यह पिछली गलतियों से सीखने में मदद करता है।
📝 लाभों का सारांश
C4 मॉडल को अपनाने से विकास संगठन को कई भावी लाभ मिलते हैं:
-
स्पष्टता: प्रणाली की सीमाओं और बातचीत के बारे में अस्पष्टता को कम करता है।
-
संचार: तकनीकी और गैर-तकनीकी स्टेकहोल्डर्स के लिए एक सामान्य भाषा प्रदान करता है।
-
ऑनबोर्डिंग: नए टीम सदस्यों के लिए सीखने की प्रक्रिया को तेज करता है।
-
रखरखाव: बदलावों के प्रभाव को समझना आसान बनाता है।
-
स्केलेबिलिटी: संभावित बफलेकेट्स को जल्दी पहचानकर विकास की योजना बनाने में मदद करता है।
इस संरचित दृष्टिकोण का पालन करके टीमें जटिलता को समझौता किए बिना प्रबंधित कर सकती हैं। आरेख डिज़ाइन और कार्यान्वयन के बीच एक अनुबंध के रूप में कार्य करते हैं, जिससे यह सुनिश्चित होता है कि अंतिम उत्पाद मूल दृष्टि के अनुरूप हो।
🔗 कार्यान्वयन पर अंतिम विचार
दस्तावेज़ीकरण पहल करना डरावना लग सकता है। छोटे स्तर पर शुरुआत करना बेहतर है। अपने मुख्य प्रणाली के लिए संदर्भ आरेख से शुरुआत करें। जब वह स्थिर हो जाए, तो कंटेनर आरेख जोड़ें। घटनाक्रम के अनुसार ही घटक और कोड स्तर तक विस्तार करें। इस चरणबद्ध दृष्टिकोण से यह सुनिश्चित होता है कि दस्तावेज़ीकरण मूल्यवान बना रहे और भार न बने।
याद रखें कि सबसे अच्छी वास्तुकला वह है जिसे उस टीम को समझा जाता है जो उसे बना रही है। C4 मॉडल उस समझ को प्राप्त करने का एक उपकरण है। इसका उपयोग अपने विचारों को दिशा देने, चर्चाओं को सुगम बनाने और अपने निर्णयों को दस्तावेज़ करने के लिए करें। सिस्टम के स्पष्ट दृश्य के साथ, आप अधिक विश्वसनीय, स्केलेबल और रखरखाव योग्य सॉफ्टवेयर बना सकते हैं।












