2009-04-21 12 views
10

मैं वर्तमान में निचले मामले में अपने SQL सर्वर डेटाबेस में स्ट्रिंग के सामान्यीकृत संस्करणों को संग्रहीत कर रहा हूं। उदाहरण के लिए, मेरे उपयोगकर्ता तालिका में, मेरे पास UserName और LoweredUserName फ़ील्ड है। संदर्भ के आधार पर, मैं या तो Low -UererName फ़ील्ड को भरने के लिए उपयोगकर्ता नाम के निचले केस संस्करण को उत्पन्न करने के लिए टी-एसक्यूएल के लोअर() फ़ंक्शन या सी # की स्ट्रिंग.ToLower() विधि का उपयोग करता हूं। Microsoft's guidelines और Visual Studio's code analysis rule CA1308 के अनुसार, मुझे ToLower() के बजाय C# की स्ट्रिंग.ToUpperInvariant() का उपयोग करना चाहिए। माइक्रोसॉफ्ट के मुताबिक, यह एक प्रदर्शन और वैश्वीकरण मुद्दा दोनों है: ऊपरी मामले में परिवर्तित करना सुरक्षित है, जबकि कम मामले में कनवर्ट करने से सूचना का नुकसान हो सकता है (उदाहरण के लिए, the Turkish 'I' problem)।स्ट्रिंग के साथ स्ट्रिंग्स का सामान्यीकरण। ToUpperInvariant()

अगर मैं स्ट्रिंग सामान्य के लिए ToUpperInvariant उपयोग करने के लिए ले जाते हैं, मैं भी मेरी डेटाबेस स्कीमा को बदलने के लिए, के बाद से मेरी स्कीमा Microsoft's ASP.NET Membership फ्रेमवर्क (this related question देखें) है, जो तार को लोअर केस में को सामान्य पर आधारित है होगा।

क्या माइक्रोसॉफ्ट ने सी # में ऊपरी केस सामान्यीकरण का उपयोग करने के लिए हमें बताकर खुद का विरोधाभास नहीं किया है, जबकि सदस्यता तालिका में प्रक्रिया है और प्रक्रियाएं कम केस सामान्यीकरण का उपयोग कर रही हैं? क्या मुझे सबकुछ ऊपरी केस सामान्यीकरण में बदलना चाहिए, या बस कम केस सामान्यीकरण का उपयोग करना जारी रखना चाहिए?

उत्तर

3

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

सोचें कि आप समय पर स्विचिंग को बर्बाद करने के बजाय प्रोजेक्ट पर कितनी आगे बढ़ सकते हैं। आपका विकास समय उस बदलाव से प्राप्त होने वाली बचत से कहीं अधिक मूल्यवान है।

याद रखें:

समय से पहले अनुकूलन (या कम से कम इसमें से अधिकांश) प्रोग्रामिंग में सभी बुराई की जड़ है। - Donald Knuth

+0

यह केवल एक प्रदर्शन मुद्दा नहीं है, यह एक वैश्वीकरण मुद्दा भी है। माइक्रोसॉफ्ट के मुताबिक, ऊपरी मामले में कनवर्ट करना सुरक्षित है, जबकि कम मामले में कनवर्ट करने से सूचना का नुकसान हो सकता है (उदाहरण के लिए, तुर्की 'आई' समस्या में)। –

+2

@ केविन, तुर्की/एजेरी डॉटलेस I समस्या एक विशेष मामला बनी हुई है, जो भी दृष्टिकोण का उपयोग किया जाता है (वे मुझे अपरकेस I और I से) तक), हालांकि कम करने के लिए एसएस के लिए अस्पष्ट है (यह एसएस या ß होना चाहिए) लेकिन यह भी अपूर्ण है (कुछ ऑर्थोग्राफिक्स अभी भी एसजेड के लिए अपरकेस ß)। हालांकि यह अभी भी बेहतर है। बेहतर है कि यूनिकोड केस-फोल्डिंग नियमों का उपयोग I और ı के लिए तुर्किक स्विच के साथ करना है, लेकिन यह अभी भी सही नहीं होगा, जो केवल प्रति लोकेल हो सकता है :( –

6

CA1308 के अनुसार, यह करने के लिए कारण यह है कि कुछ पात्रों गोल यात्रा को लोअर केस में ऊपरी से नहीं बदला जा सकता है। महत्वपूर्ण बात यह है कि आप हमेशा एक दिशा में आगे बढ़ते हैं, इसलिए यदि आपका मानक हमेशा कम मामले में जाना है तो इसे बदलने का कोई कारण नहीं है।

+4

मुझे यह दृष्टिकोण पसंद है। अगर स्क्रैच से शुरू किया गया है, तो अनुशंसित मानक अन्यथा करने के लिए किसी भी अन्य प्रेरणा के प्रकाश में हमेशा सर्वोत्तम अभ्यास नहीं होता है, लेकिन मौजूदा रखरखाव पर काम करते समय, अक्सर यह कहने के लिए मूर्खतापूर्ण होती है क्योंकि ऐसा कहता है। आपको अनिवार्य साक्ष्य की आवश्यकता है कि इस तरह की परियोजना शुरू करने से पहले आपके प्रोजेक्ट को बदलाव से फायदा होगा एक ओवरहाल - हो सकता है कि जब आप तुर्की को प्रोसेस करना शुरू कर दें और कोई समस्या हो? –

+0

मैं पूरी तरह से सहमत हूं, जेफ, कुछ मार्गदर्शन हैं जिनका आपको पालन करना चाहिए और मैं कहूंगा कि मौजूदा कोड को अपग्रेड करने के लायक हो सकता है (सुनिश्चित करें कि आप अपने डेटा रीडर का निपटान करें उदाहरण)। हालांकि यह उन नियमों में से एक नहीं है और न ही यह करीब है। – JoshBerke

-2

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

यह दुर्भाग्यपूर्ण है, लेकिन सार्थक है। अफसोस की बात है, माइक्रोसॉफ्ट "मानकों" को कम माना जाता है और लगातार कुछ हद तक कम होता है; उनके साथ अनुभव से पता चला है कि जब तक कोई अनिवार्य कारण नहीं है, तब तक काम करने के दौरान जो काम करता है, उसके साथ रहना सर्वोत्तम होता है। ध्यान दें कि यह आमतौर पर गैर-माइक्रोसॉफ्ट प्रौद्योगिकियों के बारे में सच नहीं है; लेकिन माइक्रोसॉफ्ट "मानकों" की मध्यस्थता उन्हें टालने से लायक बनाती है।

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

+5

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

+3

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

+0

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

संबंधित मुद्दे