हर कोई एक फ़ोल्डर में नियंत्रक और दूसरे में विचार क्यों करता है?


36

मैं एस्प से बाहर मोड़ लेने के लिए तैयार हो रहा हूं और एक mvc ढांचे में, asp.net mvc या नैन्सी। मैं जहां भी जाता हूं, मुझे नियंत्रकों / मॉड्यूल और विचारों के लिए फ़ोल्डर्स के लिए फ़ोल्डर दिखाई देता है। क्या यह केवल चीजों से दूर रहने की एक पैवेलियन रिफ्लेक्स है, या कुछ गहरा ज्ञान संचालित है? मेरे पास एक छोटी सी प्रूफ-ऑफ-कॉन्सेप्ट परियोजना है जहां मैं उन फाइलों को एक साथ संग्रहीत करता हूं जिनकी मैं एक साथ खोलने की संभावना रखता हूं, काफी आराम। चूंकि इन फ़ाइलों को एक दूसरे को कॉल करने की संभावना है, इसलिए वे छोटे, कम भंगुर, रिश्तेदार लिंक के साथ ऐसा कर सकते हैं। इस पैटर्न को mvc द्वारा चुनौती दी जाती है, क्योंकि फ़ोल्डर पथ अब url पथ से स्वचालित रूप से मेल नहीं खाता है, और, asp.net mvc में, प्रोजेक्ट टेम्प्लेट और राउटिंग विचार \ नियंत्रकों \ schism लागू करते हैं।

यह Microsoft पृष्ठ क्षेत्रों की अवधारणा का परिचय देता है। यह पढ़ा जा सकता है कि इस कृत्रिम पृथक्करण के कारण बड़े से बड़े ऐप कैसे बन जाते हैं।

लोग "चिंताओं के पृथक्करण" पर आपत्ति करेंगे, लेकिन अलग-अलग स्रोत फ़ाइलों के होने से चिंताओं का पृथक्करण पहले ही प्राप्त हो जाता है। कोई ठोस लाभ नहीं है, यह मुझे लगता है कि इन स्रोत फ़ाइलों को कसकर युग्मित करने से ले रहा है, और उन्हें फ़ोल्डर संरचना के विपरीत छोर पर भेज रहा है?

क्या कोई और इससे लड़ रहा है? कोई सुझाव?


3
आपको नहीं लगता कि बैक-एंड कोड फ़ाइलों को व्यू फ़ाइलों से अलग करना तर्कसंगत है? यदि हम पहले से ही दिशा ले रहे हैं तो प्रासंगिक सीएसएस और जावास्क्रिप्ट फ़ाइलों को एक ही फ़ोल्डर में क्यों नहीं रखा जाए?
अल्टरनेटेक्स

2
यदि आपको Resharper मिलता है, तो Viewनियंत्रक में कॉल पर F12 आपको दृश्य में ले जाता है और दृश्य पर राइट क्लिक मेनू में पहला विकल्प आपको नियंत्रक पर ले जाता है, और नेविगेशन की कमी के साथ पूरी समस्या दूर हो जाती है।
पीट किर्कम

4
@Alternatex मुझे खेद है, लेकिन मैं यह नहीं देखता कि एक नियंत्रक "बैक-एंड" कैसे है। यह देखने (ओं) को कसकर युग्मित है। कंट्रोलर के बिना व्यू का अच्छा होना, व्यू के बिना कंट्रोलर का कोई फायदा नहीं। एक दिन आप उन्हें एक साथ हटाना चाहते हैं। कि मेरे लिए एक फ़ोल्डर में एक साथ क्या है का सबसे अच्छा परीक्षण है ?? जब तक कोई मुझे बेहतर रास्ता नहीं दिखा सकता है?
bbsimonbb

2
दृश्य प्रस्तुति परत है। नियंत्रकों की परतें होती हैं जिनमें सेवाएँ होती हैं, जिसमें आपके डोमेन से ऑब्जेक्ट हो सकते हैं, जिसमें आपके व्यावसायिक तर्क होते हैं, जिसमें आपके एप्लिकेशन के बैक-एंड तर्क होते हैं। दृश्य केवल संग्रह से अधिक तुच्छ परिस्थितियों और पुनरावृत्ति के लिए सरल छोरों के होते हैं, यदि आपके विचारों में कुछ और है, तो आप इसे गलत कर रहे हैं। नियमित संरचना के साथ, आपने बैक-एंड और फ्रंट-एंड को अलग कर दिया है, जो मेरे लिए एक बेहतर संरचना है जो आप सुझा रहे हैं।
एंडी

10
तो मुझे यह बताने के लिए लोक की कोई कमी नहीं है कि एक नियंत्रक क्रॉकरी है इसलिए यह क्रॉकरी अलमारी में जाता है। दृश्य कांच के होते हैं इसलिए वे कांच की अलमारी में जाते हैं। मुझे पता है कि एक नियंत्रक क्रॉकरी है, लेकिन मैं प्रस्ताव कर रहा हूं कि लंच अलमारी और डिनर अलमारी के लिए बहुत अच्छा होगा, क्योंकि हम सामान के बारे में बात कर रहे हैं जो केवल दोपहर के भोजन या रात के खाने में उपयोग किया जाता है ।
bbsimonbb

जवाबों:


38

मैं यह कहना चाहता हूं कि यह कार्गो पंथ प्रोग्रामिंग है , लेकिन इस संरचना के तकनीकी कारण हैं। Asp.Net MVC ने लगभग सभी चीज़ों के लिए कॉन्फ़िगरेशन दृष्टिकोण पर एक सम्मेलन लिया। डिफ़ॉल्ट रूप से, रेज़र व्यू इंजन Viewsनियंत्रक से लौटने के लिए किस दृश्य को हल करने के लिए निर्देशिका खोजता है । हालाँकि, एक अलग प्रोजेक्ट संरचना प्राप्त करने के लिए कुछ हैक हैं और Microsoft हमें एक और एमवीसी सुविधा भी प्रदान करता है, जो हमें अधिक प्रोजेक्ट प्रोजेक्ट संरचना बनाने के लिए एरियाज प्रदान करता है । आप अपने खुद के व्यू इंजन को भी लागू कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि दृश्य कहाँ देखें।

मैं क्यों कहता हूं कि यह कार्गो पंथ प्रोग्रामिंग है और आप इस बारे में सही हैं? अंकल बॉब ने मुझे आश्वस्त किया कि परियोजना की निर्देशिका संरचना मुझे यह नहीं बताती है कि यह एमवीसी अनुप्रयोग है। यह मुझे बताना चाहिए कि यह एक स्टोर फ्रंट है, या एक टाइम ऑफ रिक्वेस्ट सिस्टम, या जो भी हो। उच्च स्तरीय संरचना और वास्तुकला हमें इस बारे में बताना चाहिए कि यह चीज क्या है, न कि इसे कैसे लागू किया गया।

संक्षेप में, मेरा मानना ​​है कि आप इस बारे में सही हैं, लेकिन किसी भी अन्य निर्देशिका संरचना बस ढांचे के खिलाफ लड़ रही होगी और मुझ पर भरोसा करेगी जब मैं कहता हूं कि आप Asp.Net MVC फ्रेमवर्क बनाने की कोशिश नहीं करना चाहते हैं तो यह कुछ नहीं था। 'करने के लिए डिज़ाइन किया गया। यह अफ़सोस की बात है कि यह वास्तव में अधिक विन्यास योग्य नहीं है।


वास्तु संबंधी चिंताओं को जल्दी से दूर करने के लिए, मुझे अभी भी विश्वास है कि व्यावसायिक मॉडल (व्यवसाय, दृश्य नहीं) और डीएएल को एक अलग परियोजना / पुस्तकालय में रहना चाहिए जो आपके एमवीसी ऐप से कॉल किया जाता है।

यह सिर्फ इतना है कि नियंत्रक वास्तव में बहुत कसकर देखने के साथ युग्मित है और एक साथ संशोधित होने की संभावना है। निर्भरता और तार्किक युग्मन के माध्यम से युग्मन के बीच अंतर को याद रखने के लिए हम सभी बुद्धिमान हैं। सिर्फ इसलिए कि कोड की निर्भरता कम होने के कारण इसे तार्किक रूप से कम नहीं बनाया गया है।


1
यह देखने के लिए कि रेज़र देखने के लिए नियंत्रण का व्यापक तरीका यहाँ है । मैं शायद दृढ़ रहूं।
bbsimonbb

3
मैंने चाचा बॉब को, जैसा कि सुझाव दिया था, X1.25 पर देखा। यह मुझे यह सोचकर छोड़ देता है कि अगर आईटी आर्किटेक्ट्स ने इमारतें बनाईं, तो हम सभी एक साथ बंधे राफ्ट के छोटे समूहों में रह रहे होंगे, जो किसी न किसी झील पर तैर रहे होंगे। जरूरी नहीं कि जीवन सरल हो।
bbsimonbb

1
यह थोड़ा और जटिल हो जाता है। वास्तव में नियंत्रकों और विचारों का सह-पता लगाने के लिए, आप रनवे पर व्यू पथ को हल करना चाहते हैं, नियंत्रक नाम स्थान को शामिल करने के लिए। यहाँ यह कैसे करना है
bbsimonbb

1
अंकल बॉब क्या वर्णन कर रहे हैं, इसके अकादमिक समकक्ष के लिए, सुविधा-उन्मुख सॉफ़्टवेयर विकास ( fosd.net ) पर एक नज़र डालें ।
एनजी

1
काम पर कॉनवे का नियम। मुझे यकीन है कि आपकी कंपनी @ फैलेटर पर काम करती है। मानक MVC लेआउट कई कंपनियों में काम करता है, लेकिन मैं अभी भी वाक्य रचना पर शब्दार्थ द्वारा समूह की बात करना पसंद करता हूं। मैंने जिन कंपनियों के लिए काम किया है वे भूमिका / नौकरी के कार्यों के बजाय उत्पादों के आसपास आयोजित की गई हैं। मेरा मानना ​​है कि यह मेरी प्राथमिकता का मूल है।
रबरडुक

9

कारण कुछ भी हो, यह घटिया प्रथा है। यह बहुत विरोधी OO है क्योंकि पैकेज या फ़ोल्डर (जो भी आप उन्हें कॉल करना चाहते हैं), कमजोर अंतर-निर्भरताएं होनी चाहिए। उनके अंदर कक्षाएं (या फाइलें) मजबूत अंतर-निर्भरता होनी चाहिए।

एक फ़ोल्डर में सभी विचारों को फेंकने और दूसरे फ़ोल्डर में सभी नियंत्रकों को आप बहुत ही तंग युग्मन के साथ दो पैकेज बना रहे हैं। यह कमजोर अंतर पैकेज निर्भरता होने के सिद्धांत के खिलाफ जाता है।

एक दृश्य और एक नियंत्रक एक पूरे के दो हिस्सों हैं और एक दूसरे से संबंधित होना चाहिए। आपके पास बाईं ओर के मोज़े के लिए एक कपबोर्ड ड्रॉ नहीं होगा, और दाईं ओर मोज़े के लिए एक और ड्रा होगा।


6

अपने 'क्यों सभी को जवाब देने के लिए ...?' प्रश्न: यहां कुछ संभावित कारण हैं, हालांकि मुझे पूरी तरह से यकीन नहीं है कि उनमें से कौन सा संयोजन एक वास्तविक कारण है, क्योंकि यह वास्तव में एक व्यक्तिपरक सवाल है

  • मिलान फ़ोल्डर और नाम स्थान संरचना के साथ तार्किक वास्तुकला (मॉडल, दृश्य, नियंत्रक) को दोहराने के लिए

  • ASP.net MVC प्रोजेक्ट टेम्पलेट का पालन करने के लिए सम्मेलन और सुविधा से बाहर

  • नाम स्थान द्वारा समूहित करने के लिए, चूंकि Controllers/फ़ोल्डर .Controllersनामस्थान पर ले जाएगा

  • शायद डि / आईओसी में कुछ परिदृश्यों सक्षम जहां नियंत्रक वर्ग हैं केवल क्वेरी किए / स्कैन एक namespace है कि 'नियंत्रकों' के साथ समाप्त होता है-/ शामिल से (यह गलत हो सकता है)

  • विचारों को उत्पन्न करने के लिए मॉडल और नियंत्रकों को स्कैन और मचान के लिए टी 4 टेम्प्लेट के लिए अनुमति देने के लिए

आप अपने स्वयं के सम्मेलन को हमेशा बना सकते हैं और उसका पालन कर सकते हैं यदि यह आपकी परियोजना के लिए समझ में आता है, तो कोई भी आपको रोक नहीं सकता है। लेकिन ध्यान रखें कि यदि आप एक बड़ी परियोजना और / या बड़ी टीम में काम करते हैं, तो डिफ़ॉल्ट सम्मेलन जो सभी को पता है, वह एक बेहतर विकल्प हो सकता है (जरूरी नहीं कि सही एक ही हो, हालांकि!)

यदि आपके सम्मेलन का पालन करना आसान है और उत्पादकता में बाधा नहीं है, तो हर तरह से इसे करें! और शायद इसके बारे में एक ब्लॉग पोस्ट या दो को भी लिखें, ताकि डेवलपर समुदाय के साथ मेलजोल और प्रतिक्रिया प्राप्त कर सकें


2

अलग-अलग निर्देशिकाओं में विचारों और नियंत्रकों को रखने का एक कारण यह है कि जब आपके पास एक प्रोजेक्ट पर काम करने वाले फ्रंट एंड बैक एंड डेवलपर्स होते हैं। आप फ्रंट एंड डेवलपर्स को बैक एंड कोड तक पहुंचने से रोक सकते हैं (जैसे पीसीआई अनुपालन में सहायता करने के लिए, संवेदनशील कोड तक पहुंच को प्रतिबंधित करना)।

एक अन्य कारण यह है कि "थीम" को आसान बनाना और व्यू पथ में मामूली बदलाव करके सभी टेम्प्लेट को स्विच करना ।

एक तीसरा कारण MVC ढांचे में विचारों को निर्दिष्ट करते समय एक सरल निर्देशिका पैटर्न है। प्रत्येक दृश्य के लिए एक बड़े लंबे पथ के बजाय उप-निर्देशिका और फ़ाइल निर्दिष्ट करना आसान है।

केवल "तंग युग्मन" होना चाहिए:

  1. नियंत्रक द्वारा दृश्य में भेजे गए चर।
  2. दृश्य में प्रपत्र फ़ील्ड्स या क्रियाएं, नियंत्रक को वापस भेजी जाती हैं।

मैं एक सामान्य नियंत्रक का उपयोग करता हूं और दृश्य नाम सामान्य में चर नाम रखने का प्रयास करता हूं, ताकि कई दृश्य एक ही नियंत्रक का उपयोग कर सकें, और कई नियंत्रक एक ही दृश्य का उपयोग कर सकते हैं। इस कारण से मैं विचारों को पूरी तरह से अलग रखना पसंद करता हूं। मॉडल वह जगह है जहां आप अपने एप्लिकेशन में प्रत्येक "चीज़" को अलग कर सकते हैं - वे उन गुणों की सूची और उन्हें संशोधित / संशोधित करने के लिए गुणों की सूची के साथ हो सकते हैं।

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


    lib/my-namespace/my-package/
        -> controllers/
        -> models/
        -> views/
            -> theme/
               -> template-name1
    app/compiled_views/theme/
        -> url/path/template-name1

दुर्भाग्य से, यदि आप किसी मौजूदा विषय की संरचना को बदलना चाहते हैं, तो दृश्यों को अपडेट करने के लिए पैकेज निर्देशिकाओं में और बाहर बुनाई होती है।

विचार करें कि विचार केवल डेटा को प्रारूपित करने का एक तरीका है, चाहे वह json, xml, csv, या html हो। यह विशेष रूप से मदद करता है यदि आप चाहते हैं कि आपका एप्लिकेशन भी एपीआई के रूप में काम करे। जेनेरिक वैरिएबल नामों का उपयोग करके डेटा से दृश्य को कम करने की कोशिश करें, ताकि आप कई नियंत्रक या मॉडल के लिए एक ही टेम्पलेट का उपयोग कर सकें (या उपयोग में आपके द्वारा बनाए जाने वाले कोड की मात्रा को कम करना शामिल है)।


1

जरूरी नहीं कि हर कोई ऐसा करता हो। उदाहरण के लिए अजगर के Django ढांचे में एक ऐप की अवधारणा है, जहां आपके एप्लिकेशन के उप-मॉड्यूल अपने स्वयं के निर्देशिका में अपने स्वयं के मॉडल और विचारों और टेम्पलेट्स के साथ रहते हैं (विचार जो Django अनिवार्य रूप से नियंत्रकों को कॉल करते हैं)। मैं चीजों को करने के उस तरीके को पसंद करने के लिए होता हूं क्योंकि इसका मतलब है कि मैं आसानी से एक "एप्लिकेशन" पैकेज कर सकता हूं और इसे अपनी परियोजनाओं की सेटिंग्स में एप्लिकेशन सूची में शामिल करके परियोजनाओं पर इसका पुन: उपयोग कर सकता हूं। यह पता लगाना भी आसान है कि अलग-अलग हिस्से कहाँ हैं। यदि मैं urls.py फ़ाइल को देखता url(r'^users/', include('my_site.users.urls'))हूं और कुछ ऐसा देखता हूं, तो मुझे पता है कि मॉड्यूल my_site.usersमें सभी कोड हैं जो उपयोगकर्ताओं को संभालते हैं। मैं मॉड्यूल को देखना जानता हूं my_site.users.viewsऔर my_site.users.modelsजब मैं यह देखना चाहता हूं कि उपयोगकर्ताओं को कैसे बनाया और प्रमाणित किया जाता है। मुझे पता है कि मेरे सभी मार्गों को परिभाषित किया गया है my_site.users.url

इसके अलावा अगर यह पर्याप्त रूप से सामान्य है तो मैं शायद अन्य साइटों में उस मॉड्यूल का उपयोग केवल कॉन्फ़िगरेशन को बदलकर या इसे लाइब्रेरी के रूप में पैकेज कर सकता हूं और इसे ओएसएस के रूप में प्रकाशित कर सकता हूं।


1

याद रखें कि Microsoft ने विभिन्न फ़ोल्डर में नियंत्रकों और विचारों को रखने का तरीका सुझाया है , इसलिए कई अनुशंसित संरचना का पालन करेंगे,

  1. एक कारण यह हो सकता है कि नियंत्रक हमेशा विचारों के साथ एक से एक संबंध नहीं रखते हैं, विशेष रूप से आंशिक विचारों को नियंत्रकों के बीच साझा किया जा सकता है।
  2. एक अन्य कारण यह हो सकता है कि जब आपका प्रोजेक्ट बढ़ता है, तो आप नियंत्रकों और यूनिट परीक्षणों को किसी अन्य प्रोजेक्ट (ओं) तक खींचना चाह सकते हैं, लेकिन विचारों को देखने के लिए ऐसा करना बहुत कठिन है।

यह कहते हुए कि इस तरह से इसे करने के बारे में कई पोस्ट हैं, जैसे कि यह


"यह Microsoft अनुशंसित तरीका है" ... क्या आप स्पष्ट कर सकते हैं कि आपका क्या मतलब है? क्या इस बारे में एक वास्तविक, आधिकारिक एमएस लेख है? या, यह कि MVC ऐप के लिए केवल डिफ़ॉल्ट प्रोजेक्ट सेटअप है? और, यदि आप इसे उत्तरार्द्ध पर आधारित कर रहे हैं, तो क्या यह संभव नहीं है कि डिफ़ॉल्ट MVC प्रोजेक्ट सेटअप है क्योंकि यह है कि यह कैसे "हर कोई" इसे करता है ??
15

1
Msdn.microsoft.com/en-us/library/… लेख के आधार पर, यह "नियंत्रकों, जो कि अनुशंसित है" और इत्यादि विचारों के लिए इत्यादि के आधार पर कहता है
कम उड़ान

0

रिकार्ड के लिए

मैं क्यों कहता हूं कि यह कार्गो पंथ प्रोग्रामिंग है और आप इस बारे में सही हैं? अंकल बॉब ने मुझे आश्वस्त किया कि परियोजना की निर्देशिका संरचना मुझे यह नहीं बताती है कि यह एमवीसी अनुप्रयोग है। यह मुझे बताना चाहिए कि यह एक स्टोर फ्रंट है, या एक टाइम ऑफ रिक्वेस्ट सिस्टम, या जो भी हो। उच्च स्तरीय संरचना और वास्तुकला हमें इस बारे में बताना चाहिए कि यह चीज क्या है, न कि इसे कैसे लागू किया गया।

प्रश्न: कोड की पहुंच किसके पास है? प्रोग्रामर्स। क्या एंड-यूजर्स कोड के बारे में परवाह करते हैं? नहीं। और, एक प्रोग्रामर क्या करता है, कोड। या अधिक विशेष रूप से, प्रकार (नियंत्रक, सेवा, मॉडल और इसी तरह) के आधार पर कक्षाएं। तो यह समझ में आता है और कोड को डिबग करना आसान है, यदि आप कोड के व्यवहार के बजाय कोड के प्रकार के आधार पर कोड ढूंढने में सक्षम हैं। इसके अलावा, मान लीजिए कि एक टीम प्रोजेक्ट है, एक नियंत्रक का प्रभारी है, दूसरा मॉडल का, दूसरा दाओ का और दूसरा दृश्य का। परियोजना को भागों में अलग करना आसान है। एक अच्छा कोड एक ऐसा कोड है जो डिबग करना आसान है, न कि वाक्य रचना चीनी कोड। अंकल बॉब फिर गलत है।

परियोजना के व्यवहार (एक स्टोर फ्रंट) की नकल करने की कोशिश कार्गो कार्गो है।


3
Whan I कोड मैं सबसे अधिक सुविधाओं के बारे में परवाह करता हूं, न कि प्रकार। जब मुझे ऐसी सुविधा दिखाई देती है जो अपेक्षित रूप से काम नहीं करती है तो मुझे उस सुविधा से संबंधित कोड में कुछ गलत पता चलता है, जबकि मुझे जरूरी नहीं पता है कि यह किस प्रकार का कोड है।
मोनिका

1
"चलो एक टीम परियोजना कहते हैं, एक नियंत्रक का प्रभारी है, एक और मॉडल, एक और दाओ" ऐसी टीम के पास कुछ भी शिपिंग करने में मुश्किल समय होगा और जब वे ऐसा करेंगे तो संचार ओवरहेड और बग्स में कहीं अधिक लागत आएगी।
रबरडाक

जैसा कि स्वीकृत उत्तर के तहत एक टिप्पणी श्रृंखला में स्थापित किया गया है, आपको एक बिंदु मिला है, लेकिन केवल कुछ मामलों में। जब कोई कंपनी एमवीसी परियोजनाओं पर ध्यान केंद्रित करती है, जो कई विविध ग्राहकों को बेचती है, तो एमवीसी संरचना रखने से पुन: प्रयोज्यता का एहसास होता है। जब एक कंपनी एक आला (जैसे webshops) पर ध्यान केंद्रित करती है और संभवतः कई अलग-अलग तकनीकों का उपयोग करती है, तो यह webshop- उन्मुख संरचना के लिए अधिक समझ में आता है। यह कॉनवे के नियम का एक व्यावहारिक अनुप्रयोग है । कोड (और इसलिए परियोजना संरचना भी) कंपनी की संरचना का पालन करना चाहिए।
फ्लेटर

@ रबरडक: आप किसी भी तरह से अतिरिक्त लागत के लिए एक तर्क दे सकते हैं। आप सही हैं कि जब अलग-अलग लोग अलग-अलग तकनीकी घटक करते हैं, तो आपने व्यावसायिक तर्क संचार को बढ़ा दिया है। हालाँकि, यदि आपके पास अलग-अलग लोग पूरी तरह से अलग-अलग विशेषताओं को लागू करते हैं, तो आपको यह सुनिश्चित करने में लागत बढ़ सकती है कि हर कोई एक ही तकनीकी दृष्टिकोण का उपयोग करके बोर्ड (कुशल + सहमत) पर है। किसी भी तरह से, आपको यह सुनिश्चित करने के लिए संचार ओवरहेड की आवश्यकता है कि लोग एक साथ काम करें।
Flater

हाँ और handoffs हमेशा IME को समाप्त करने के लिए एक विशेषता अंत लागू करने वाले देवों की एक जोड़ी होने से अधिक खर्च होते हैं।
रबरडुक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.