क्या 'प्रतिरूपकता' प्राप्त करने के लिए आंशिक कक्षाओं का उपयोग करना आम है?


24

मुझे हाल ही में हमारे कोडबेस में एक स्थिति का सामना करना पड़ा जहां एक अलग टीम ने लगभग 800 विधियों से युक्त एक 'ईश्वर वर्ग' बनाया, एक आंशिक वर्ग के रूप में 135 फाइलों में विभाजित किया।

मैंने दूसरी टीम से इस बारे में पूछा। जबकि मेरी आंत की प्रतिक्रिया इसे कक्षा से अलग करने के लिए थी, वे जोर देकर कहते हैं कि यह एक अच्छा डिजाइन है, एक सामान्य अभ्यास है, और यह 'प्रतिरूपकता' और 'कार्यान्वयन में आसानी' को बढ़ावा देता है क्योंकि नए डेवलपर्स बाकी की लगभग कोई जानकारी नहीं के साथ कार्यक्षमता पर बोल्ट कर सकते हैं प्रणाली में।

क्या यह वास्तव में एक आम बात है या किसी भी तरह से एक अच्छा विचार है? मैं इस जानवर को नीचे लाने के लिए तत्काल कदम उठाने के लिए इच्छुक हूं (या कम से कम इसे और बढ़ने से रोक सकता हूं) लेकिन मुझे विश्वास है कि मैं गलत हूं।


6
अग्नि से उसे मार डालो! लेकिन गंभीरता से, क्या दूसरी टीम इस कथित सामान्य अभ्यास के लिए कोई उद्धरण दे सकती है?
मैटवेवी

1
कोई नहीं। मुझे यकीन है कि वे धुआं उड़ा रहे हैं, लेकिन मैं हथौड़े को छोड़ने से पहले अपना उचित परिश्रम करने की कोशिश कर रहा हूं।
जोशुआ स्मिथ

हर समय ऐसा नहीं करने के लिए उनका तर्क क्या है?
जेफ

3
उन्हें एक वाक्य में वर्णन करने के लिए कहें, 135 फाइलों में जो 800 विधियां हैं वे सभी एक-दूसरे के साथ समान हैं। किसी भी समझदार और उचित वर्ग के लिए इसका उत्तर देना संभव होना चाहिए।
कार्सन 63000

3
@ Carson63000 "यह परियोजना के सभी आवश्यक कार्य करता है।" आपका एक वाक्य है
रायथल

जवाबों:


39

यह किसी भी तरह से एक अच्छा विचार नहीं है।

फॉर्म डिजाइनर की मदद के लिए आंशिक कक्षाएं मौजूद हैं। किसी अन्य कारण के लिए उनका उपयोग करना (और यकीनन उनके इच्छित उद्देश्य के लिए, लेकिन यह एक अलग मामला है) एक बुरा विचार है, क्योंकि यह उन फूला हुआ वर्गों की ओर जाता है जो पढ़ने और समझने में कठिन हैं।

इसे इस तरह से देखें: यदि कोई ईश्वर एक फ़ाइल में 800 विधियों के साथ क्लास करता है, जहाँ आप जानते हैं कि सब कुछ कहाँ है, एक बुरी बात है - और मुझे लगता है कि हर कोई इस बात से सहमत होगा कि यह है - तो 800 तरीकों के साथ एक ईश्वर वर्ग कैसे हो सकता है 135 फाइलों में फैला है, जहां आपको नहीं पता कि सब कुछ संभवतः एक अच्छी चीज कहां है?


1
मैं ज्यादातर सहमत हूं, लेकिन मुझे लगता है कि कुछ दुर्लभ मामले partialहो सकते हैं जहां उत्पन्न कोड के बिना भी उपयोगी हो सकते हैं। हो सकता है कि जब आपके पास एक नेस्टेड क्लास जैसा कुछ हो?
svick

1
@ शविक: आंशिक कक्षाएं दिलचस्प हैं, लेकिन आमतौर पर आवश्यक नहीं हैं। मुझे यकीन नहीं है कि अलग-अलग फ़ाइलों में एक वर्ग को विभाजित करने पर उपयोगी क्यों होगा जब वहाँ नेस्टेड कक्षाएं हों। जब तक आप अपनी भौतिक फ़ाइल में नेस्टेड वर्ग नहीं चाहते हैं। बेनाम: उस मामले में ... maaaaybe यह ठीक है। ;)
FrustratedWithFormsDesigner

5
मैं कभी-कभी स्पष्ट इंटरफ़ेस कार्यान्वयन के लिए आंशिक कक्षाओं का उपयोग करता हूं - विशेष रूप से System.IConvertible जैसा कुछ। किसी तरह मेरी कक्षा में बड़े पैमाने पर # भाग लगाने से क्लीनर लगता है।
मत्तीवेदी

1
नेस्टेड क्लास टिप्पणी वास्तव में एक बहुत अच्छा विचार है, मैंने कभी इसके बारे में सोचा भी नहीं था। हालांकि ... कि संगठन के साथ करने के लिए और अधिक है, 'प्रतिरूपकता' से
शेल्डन Warkentin

1
"फॉर्म डिजाइनर की मदद के लिए आंशिक कक्षाएं मौजूद हैं।" सामान्य रूप से सही, लेकिन मैं "... और अन्य कोड जनरेटर जोड़ूंगा।" मैं आपके उत्तर के बाकी हिस्सों से सहमत हूं;)
सीलास

14

तो सवाल था:

क्या यह वास्तव में एक आम बात है या किसी भी तरह से एक अच्छा विचार है?

वर्तमान में उपलब्ध उत्तरों में से एक शानदार नहीं है । इसलिए कुछ अन्य चीजें हैं जिनके बारे में मैं सोच सकता हूं जैसे कि; यहां तक ​​कि प्रक्रियात्मक कोड को मॉड्यूलर बनाया जा सकता है और इसमें सब कुछ शामिल है लेकिन किचन सिंक यह नहीं है कि आप मॉड्यूलरिटी कैसे हासिल करते हैं। कौन सा एक विशाल वर्ग विभाजन में विभाजित होता है, यह सब एक बड़ी गड़बड़ी में जोड़ता है।

हालाँकि यह सवाल वास्तविक आलोचनात्मक हिस्से को एक लाल हेरिंग है जो याद किया गया है; ओपी भी स्थिति के बारे में कहने के लिए निम्नलिखित है:

(...) जबकि मेरी आंत की प्रतिक्रिया को कक्षा से बाहर निकलना था, वे जोर देते हैं ...

(...) मुझे इस जानवर को नीचे लाने के लिए तत्काल कदम उठाने की इच्छा है (या कम से कम इसे और बढ़ने से रोकने के लिए) लेकिन मैं विश्वास करने को तैयार हूं कि मैं गलत हूं।

खुद को संभालो!

यह कुछ ऐसा है जो मेरे आलंकारिक रूप से बोलने वाले मोनोकल ड्रॉप को मेरे आलंकारिक कप चाय में बदल देगा।

मैं ऐसी ही स्थितियों में रहा हूं और आपको बता दूं: ऐसा करने के आग्रह के लिए नहीं। ज़रूर, आप टीम पर न्याय के Nuke हथौड़ा को छोड़ सकते हैं, लेकिन ऐसा करने से पहले कृपया अपने आप को निम्न प्रकार के सामंजस्य के साथ हास्य दें:

क्या होगा यदि आप टीम को बताएं कि उनका कोड बेकार है और बंद करना है ?

(... या ऐसा कुछ लेकिन कम आक्रामक रूप से, यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि वे नाराज होंगे चाहे आप जो भी करें अगर आप उन पर पूरी ताकत लगाने का फैसला करते हैं)

कोड बेस के साथ वर्तमान स्थिति क्या है? क्या यह काम कर रहा है? फिर आपको अपने ग्राहकों को यह समझाने में बड़ी समस्या होगी कि उनका कोड अनिवार्य रूप से बेकार है । इससे कोई फर्क नहीं पड़ता कि उनके पास क्या कारण हैं: जब तक यह काम कर रहा है, अधिकांश ग्राहक इस बात की परवाह नहीं करते हैं कि कोड कैसे व्यवस्थित है।

अपने आप को उनके जूते में भी रखो, वे क्या करेंगे? मैं आपको निम्नलिखित संभावित परिणामों के साथ खुश कर सकता हूं:

टीम के सदस्य # 1: "तो यह आदमी हमें बता रहा है कि हम पिछले वर्षों से इसे गलत कर रहे हैं।"

टीम के सदस्य # 2 और # 3: "क्या झटका है।"

प्रभावशाली टीम के सदस्य # 4: "इसके बारे में चिंता मत करो, मैं सिर्फ प्रबंधन में जाऊंगा और इसे उत्पीड़न के रूप में रिपोर्ट करूंगा।"

देखें कि प्रभावशाली टीम के सदस्य # 4 ने क्या किया? उन्होंने प्रबंधन में जाकर कंपनी में आपके कर्म को कम कर दिया। वह अमेरिकी-इटालियन हो सकता है, यह बताकर कि सभी लोग इसके बारे में चिंता नहीं करेंगे, लेकिन फिर मैं इसके बारे में नस्लवादी होऊंगा।

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

यहां तक ​​कि अगर आप "टीम को सबक सिखाने" के लिए इस पर हस्ताक्षर करने के लिए लोगों का एक समूह प्राप्त करने में कामयाब रहे, तो याद रखें कि आप काफी स्मार्ट लोगों के लिए ऐसा कर रहे हैं जो स्पष्ट रूप से कुछ चीजें प्राप्त करते हैं। एक बार कोड को फिर से लिखा जाएगा / फिर से प्रकाशित किया जाएगा / निपटाया जाएगा / जो भी होगा और समस्याओं के साथ उत्पन्न होगा कि आपको जवाबदेह ठहराया जाएगा क्योंकि आप फायरस्टार थे

इस तरह की स्थितियों के बारे में प्रतिकूल होने के नाते यह ज्यादातर हारने / हारने का खेल है क्योंकि यह दोषपूर्ण खेल का एक दुष्चक्र बनने का जोखिम रखता है । यह इस स्थिति के लिए एक उप-अपनाने वाला परिणाम है। यहां तक ​​कि अगर आप जीतते हैं, तो आपको अचानक उस गंदगी को सौंप दिया जाता है जो किसी और ने किया था।

अन्य (बहुत परिपक्व) तरीके हैं

मैं एक बार एक समान स्थिति में था, लेकिन फिर मैंने घुटने में एक तीर लिया। इसलिए कुछ समय बाद मेरे दिमाग में अचानक करियर बदलने के कारण मुझे टेरेंस रेयान द्वारा एक बुक ड्राइविंग टेक्निकल चेंज मिला । यह संदेह के कई पैटर्न को सूचीबद्ध करता है, जिस तरह के लोग अच्छे विचारों पर कार्य नहीं करते हैं। वे ओपी के मामले में सबसे अधिक संभावना है:

  • द अनिनोनोफ़र्ड - वे वास्तव में नहीं जानते थे कि अन्य तरीके हैं या बस समझ में नहीं आया। जूनियर डेवलपर्स आमतौर पर इस श्रेणी में फिट होते हैं लेकिन जरूरी नहीं। (ईमानदार होने के लिए: मैं जूनियर डेवलपर्स से मिला हूं जो इससे अधिक उज्जवल होगा।)
  • झुंड - वे आंशिक कक्षाओं का उपयोग करने की तुलना में बेहतर तकनीकों को जानते थे, लेकिन यह नहीं जानते थे कि उन्हें अनुमति दी गई थी।
  • निंदक - वे सिर्फ यह तर्क देना पसंद करते हैं कि सिर्फ बहस करने के लिए आंशिक कक्षाएं आपके विचार से बेहतर हैं। भीड़ के सामने खड़े होने के बजाय भीड़ में ऐसा करना आसान है।
  • द बर्नड - कुछ अजीब कारणों से वे नई कक्षाएं बनाना पसंद नहीं करते हैं, सबसे अधिक संभावना है कि वे इसे बहुत मुश्किल मानते हैं।
  • द टाइम क्रंच्ड - वे इतने व्यस्त हैं कि वे अपने कोड को ठीक करने के लिए परेशान नहीं कर सकते।
  • बॉस - वे सोचते हैं: "ठीक है यह काम करता है? इसलिए परेशान क्यों है?"
  • तर्कहीन - ठीक है, वे बस पूरी तरह से पागल हैं।

पुस्तक रणनीतियों और इसी तरह की एक सूची के साथ आगे बढ़ती है, लेकिन ओपी के मामले में यह अनुनय की बात है। विरोधी पैटर्न पर तथ्यों के साथ मजबूत सिर जाना पर्याप्त नहीं है।

यदि कोड गुणवत्ता को बढ़ाना आपके हित में है, तो कम से कम आपत्तिजनक टीम को अपने स्वयं के गड़बड़ को दोहराने और सुधारने का मौका दें । व्यक्तिगत रूप से मैं उन्हें सुनने और प्रमुख प्रश्न पूछने के लिए उन्हें बोलबाला करने की कोशिश करूंगा, उन्हें अपनी कहानी बताएं:

  • वास्तव में उनका देव वर्ग क्या कर रहा है?
  • क्या वे किसी समस्या में भाग गए हैं? क्या उनके पास कोई कीड़े हैं? ऐसा करने के लिए बिना उन्हें बताए, फ़िक्स सेंस का सुझाव दें।
  • यदि आप इस ईश्वर वर्ग के एक एपीआई के रूप में एक उपयोगकर्ता हैं: क्या कोड का उपयोग करने के लिए पूरी तरह से उपयोग करने की तुलना में सरल तरीके हैं? सरल उदाहरणों का सुझाव दें, देखें कि वे कैसे प्रतिक्रिया करते हैं।
  • क्या आप फ़ंक्शन को लिखने के बिना, किसी अन्य के साथ कुछ कार्यक्षमता को स्विच कर सकते हैं?
  • क्या उन्हें कुछ प्रशिक्षण की आवश्यकता है? क्या आप प्रबंधन को उन्हें ऐसा करने के लिए मना सकते हैं या पैटर्न और प्रथाओं के बारे में लंच मीटिंग कर सकते हैं?

... और इसी तरह। उन्हें छोटे सुझाव दें ताकि वे आगे बढ़ सकें। इसमें समय लगता है और इसके लिए कुछ ऑफिस पॉलिटिक्स ग्रेड एल्बो ग्रीज़ की ज़रूरत होगी, लेकिन धैर्य और मेहनत एक पुण्य अधिकार है?


यह बहुत ही व्यावहारिक जवाब है। यदि आप एक नए डेवलपर हैं, तो आपको इसे समझने की जरूरत है। अधिकांश अनुभवी डेवलपर्स इसे कई वर्षों के बाद महसूस करते हैं, कुछ कभी नहीं करते हैं।
फिशस्वीड

6

MSDN आंशिक कक्षाएं और विधियाँ पृष्ठ आंशिक कक्षाओं के उपयोग के लिए दो स्थितियों का सुझाव देती हैं:
1. एक विशाल वर्ग को कई अलग-अलग फ़ाइलों में विभाजित करने के लिए।
2. स्वचालित रूप से उत्पन्न स्रोत कोड डालने के लिए एक जगह है।

2 का उपयोग विजुअल स्टूडियो द्वारा किया जाता है (उदाहरण के लिए, aspx फ़ाइलों के लिए और winforms के लिए)। यह आंशिक वर्गों का एक उचित उपयोग है।

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

यद्यपि यदि आप समझदारी से काम करने के लिए अलग-अलग उपयोगकर्ताओं के लिए अलग-अलग फ़ाइलों में एक वर्ग को विभाजित कर सकते हैं, तो क्या आप इसके बजाय इसे अलग-अलग वर्गों में विभाजित नहीं कर सकते हैं?


+1 के लिए "क्या आप इसे अलग-अलग वर्गों में विभाजित नहीं कर सकते?" यह वही है जो हम सुझा रहे हैं। सामान्य ज्ञान की तरह लगता है कि यह मूल रूप से उस तरह से किया जाना चाहिए था।
जोशुआ स्मिथ

4

इसलिए अंत में, वे ओओपी के किसी भी टुकड़े के बिना सामान्य प्रक्रियात्मक विकास कर रहे हैं। उनके पास सभी तरीकों, चर और whatnot के साथ एक वैश्विक नाम स्थान है।

या तो उन्हें मना लें कि वे इसे गलत कर रहे हैं या नरक को वहां से निकाल सकते हैं।


1

एक उपयोगिता वर्ग में ऐसी विधियाँ होती हैं जिन्हें समझदारी से एक वर्ग बनाने के लिए अन्य विधियों के साथ नहीं जोड़ा जा सकता है। यदि आपके पास 800+ विधियाँ हैं, तो 135 फ़ाइलों में विभाजित करें, ऐसा लगता है कि कोई व्यक्ति कुछ सामान्य तरीके खोजने में कामयाब रहा है ...

सिर्फ इसलिए कि आपके पास एक उपयोगिता वर्ग है, इसका मतलब यह नहीं है कि आपके पास एक और उपयोगिता वर्ग नहीं हो सकता है।

यहां तक ​​कि अगर आपके पास 800 ज्यादातर असंबंधित विधियां हैं, तो समाधान एक बड़ी श्रेणी और बहुत सारी फाइलें नहीं है। समाधान एक नाम स्थान, कुछ उप नाम स्थान और बहुत कम वर्ग है। यह थोड़ा और काम है (आपको कक्षा के साथ-साथ विधि के लिए एक नाम के साथ आना होगा)। लेकिन इस गड़बड़ को साफ करने का समय आने पर यह आपके जीवन को आसान बना देगा, और इस बीच यह उपयोग करने के लिए इंटेलीजेंस को आसान बना देगा (अर्थात यह पता लगाना आसान है कि एक विधि का उपयोग कहां करना है)।

और नहीं, यह आम नहीं है (मुफ्त कार्यों की संख्या से अधिक फ़ाइलों की संख्या)।


0

मुझे यह बिल्कुल पसंद नहीं है। हालांकि, शायद आंशिक वर्गों ने विकास के दौरान डेवलपर्स के लिए समझ बनाई क्योंकि इसने बड़ी संख्या में तरीकों के समवर्ती विकास की अनुमति दी, खासकर अगर उनके बीच बहुत अधिक निर्भरता नहीं है।

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

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

इसलिए सावधान रहें और मार के फैसले को सही ठहराएं। इसके अलावा, विचार करें कि परीक्षण की आवश्यकता क्या होगी।


0

एक व्यावहारिक डिजाइन के नजरिए से यह पूरी तरह से ठीक है कि 135 फाइलें वास्तव में समूह विधियों को एक समान करती हैं जो पारंपरिक कक्षाएं करती हैं। यह केवल 6 विधियों-प्रति-फ़ाइल का औसत है। निश्चित रूप से यह सबसे लोकप्रिय या पारंपरिक तरीका नहीं है कि एक परियोजना को डिजाइन करें। इसे बदलने की कोशिश सिर्फ समस्याओं का एक गुच्छा पैदा करेगी और कोई वास्तविक लाभ के लिए बीमार नहीं होगा। परियोजना को OO मानकों के अनुरूप बनाने से कई समस्याएं पैदा हो जाएंगी। यह एक पूरी तरह से अलग मामला है अगर कई फाइलें वास्तव में कोई सार्थक अलगाव प्रदान नहीं करती हैं।


3
OO में प्रक्रियात्मक कोड को रिफ्लेक्ट करने से आम तौर पर यह समस्या होती है - मुझे लगता है कि इसे ठीक करना एक बहुत बड़ा काम होगा और टीम को ठीक से गले लगाने के लिए सही तरीके से कोड सिखाना, जोशुआ के ऊपर अगले वर्ष (और उसके बाद) होने वाली हर चीज के लिए दोषी ठहराया जाएगा। ) अगर वह उन्हें रिफ्लेक्टर के लिए मना करता है। यही कारण है कि कोई भी कभी भी इस तरह के रिफ्लेक्टर करने के लिए बहुत मुश्किल नहीं करता है (कम से कम एक बार उन्होंने परिणाम देखा है)। यदि आपको लगता है कि यह एक अच्छा डिज़ाइन है - अच्छी तरह से - 5 वर्षों में इस उत्तर को फिर से देखें और हमें बताएं कि आप क्या सोचते हैं (ऐसा लगता है कि मैं हर 5 साल या उससे पहले की डिज़ाइन के बारे में जानता हूँ)।
बिल के

@BillK यदि आप दस साल इंतजार करते हैं जो आप जानते हैं कि संभवतः "डिजाइन दर्शन" में वर्तमान होगा।
रायथल

135 फाइलें आम तौर पर समूह से संबंधित विधियां करती हैं, लेकिन वह (मुझे) अभी भी यह एक अच्छा विचार नहीं है। मैं इस प्रणाली को परीक्षण के तहत प्राप्त करना चाहता हूं, लेकिन 800-विधि हाइड्रा को ठोकर / मॉक करना गधे में एक बदसूरत दर्द होने जा रहा है।
जोशुआ स्मिथ

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

0

पहले से इंगित किए गए उत्तरों से परे, आंशिक कक्षाएं एक स्तरित डिजाइन में उपयोगी हो सकती हैं, जहां आप कार्यक्षमता को व्यवस्थित करना चाहते हैं जो आपके वर्ग पदानुक्रम को अलग-अलग परत-विशिष्ट फ़ाइलों में काटती है। यह प्रति-परत कार्यक्षमता (फ़ाइल संगठन द्वारा) और वर्ग-दृश्य को प्रति-वर्ग कार्यक्षमता नेविगेट करने के लिए समाधान एक्सप्लोरर का उपयोग करने की अनुमति देता है। मैं एक ऐसी भाषा का उपयोग करना पसंद करूंगा जो मिक्सिन्स और / या लक्षणों का समर्थन करती है, लेकिन आंशिक रूप से उपयोग किए जाने पर आंशिक कक्षाएं एक उचित विकल्प हैं और अच्छे वर्ग के पदानुक्रम डिजाइन के लिए प्रतिस्थापन नहीं होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.