2011-08-10 14 views
6

मैं बस कुछ कोड में आया जो ToString() ओवरराइड करता है और कुछ महत्वपूर्ण जानकारी देता है (केवल डीबग जानकारी नहीं)। इस प्रकार के उपयोगकर्ताओं को ToString() कहा जाता है और उस महत्वपूर्ण डेटा को पार्स कर दिया जाता है।महत्वपूर्ण जानकारी के लिए ToString का उपयोग किया जाना चाहिए?

मेरे राय, पिछले कुछ वर्षों में विभिन्न बिट और टुकड़े पढ़ने से, ToString() है कि एक नहीं बल्कि कमजोर contract, अर्थात प्रदर्शन कुछ सार्थक सामान (यदि आप चाहते ) इसे ओवरराइड है।

देखें मैंने कहा प्रदर्शन? जिस कोड पर मैं आया था, वह इस प्रकार के उदाहरणों के पाठपरक प्रतिनिधित्व पर निर्भर था; जो कुछ भी अपेक्षित है उससे कुछ भी जोड़ना सभी प्रकार की समस्याओं का कारण बनता है।

तो, मेरा सवाल यह है कि, यदि किसी ऑब्जेक्ट का टेक्स्ट प्रतिनिधित्व महत्वपूर्ण है, तो ToString() का उपयोग किया जाना चाहिए या एक और स्पष्ट विधि/प्रॉपर्टी का उपयोग किया जाना चाहिए, उदा। AsText?

उत्तर

4

व्यक्तिगत रूप से मैं आपकी चिंता साझा करता हूं। Microsoft's documentation कहा गया है कि ToString() विधि

[...] अपने स्ट्रिंग प्रतिनिधित्व करने के लिए एक वस्तु में परिवर्तित कर देती है कि यह प्रदर्शन के लिए उपयुक्त है।

Oracle's documentation जावा के Object.toString() के लिए है भी थोड़ा मजबूत:

परिणाम एक संक्षिप्त लेकिन सूचनात्मक प्रतिनिधित्व आसान के लिए एक व्यक्ति को पढ़ने के लिए है कि होना चाहिए।

मैं इन्हें मजबूत संकेत के रूप में देखता हूं कि ToString() को उन सूचनाओं को व्यक्त करना चाहिए जो मनुष्यों के लिए सुविधाजनक हैं। एक विधि जो आवेदन के अन्य हिस्सों द्वारा छेड़छाड़ की जाने वाली डेटा लौटाती है, उसके पास अधिक जानकारीपूर्ण नाम होना चाहिए। मेरी राय में भी AsText() बहुत सामान्य है।

6

यह एक बहुत खराब योजना की तरह लगता है। यदि प्रकार के उपयोगकर्ताओं को डेटा की आवश्यकता है, तो उस प्रकार को उस डेटा को वापस करने के तरीकों का खुलासा करना चाहिए। लोग ऑब्जेक्ट की स्ट्रिंग प्रस्तुति को पार्स क्यों कर रहे हैं जब उनके पास ऑब्जेक्ट ऑब्जेक्ट तक पहुंच है?

पाठ्यक्रम क्रमबद्ध परिदृश्य हैं, लेकिन वे अच्छी तरह से परिभाषित हैं, और शायद ही कभी .ToString() का उपयोग अपनी नौकरी करने के लिए करते हैं।

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

अद्यतन: MattDavey बताते हैं, अगर आप IFormattable लागू के रूप में, तो यह एक अच्छा समझौता है: अपने उपभोक्ताओं को फोन ToString(), लेकिन ध्यान में विशिष्ट प्रारूप, और कहा कि इसका मतलब क्या है की विश्वसनीय अनुबंध के साथ। आपके सहयोगी क्या कर रहे हैं उससे अभी भी अलग है, लेकिन एक विकल्प जो शायद उनके लिए अधिक अनुकूल है।

+1

मैं पूरी तरह से सहमत हूं लेकिन तर्क दूंगा कि जब तक ऑब्जेक्ट IFormattable लागू नहीं करता है तब तक ToString विधि टेक्स्ट डेटा को आउटपुट करने के लिए एक अच्छा उम्मीदवार हो सकता है। वहां कई डेटा बाइंडिंग फ्रेमवर्क हैं जो IFormattable के साथ बहुत अच्छे काम करेंगे। MyCustomTextOutputMethod() के मुकाबले टॉस्ट्रिंग .. लेकिन यह नहीं कहना है कि आपके पास दोनों नहीं हो सकते हैं :) – MattDavey

+0

@ मैटडेवी फेयर पॉइंट, हालांकि यह सिर्फ इतना अलग है मानक 'ToString()' विधि को ओवरराइड करना। मैं उस पते को अद्यतन करने के लिए अद्यतन करूंगा, यद्यपि। – dlev

+0

हाँ दो तरीकों के बीच भेद पर जोर देना महत्वपूर्ण है। IFormattable के बारे में मुझे क्या पसंद है यह है कि मानक ऑब्जेक्ट पैटर्न में आपका ऑब्जेक्ट। टॉस्ट्रिंग IFormattable.ToString ("G") को रोकता है, जो आपको एक अच्छा प्रगति पथ देता है :) – MattDavey

0

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

1

मुझे नहीं लगता कि एक निश्चित उत्तर है।

मैं बजाय इस तरह के AsText() के रूप में कम परिचित नामों का उपयोग करने, ToString() का उपयोग कर, क्योंकि जब .NET में एक API बनाने यह जब .NET में आम नामकरण सम्मेलनों उपयोग किया जाता है की सराहना की के मामले के लिए तर्क है। इस सम्मेलन का उदाहरण उदाहरण के लिए StringBuilder द्वारा किया गया है, क्योंकि इसकी ToString() महत्वपूर्ण जानकारी लौटा रही है।

+1

सहमत है, उसी परिदृश्य System.IO.StringWriter के लिए लागू होता है। ऐसा लगता है कि जब वस्तुओं का एकमात्र उद्देश्य स्ट्रिंग का उत्पादन करना है, तो ToString विधि का उपयोग करके अंतिम परिणाम का पर्दाफाश करने का एक समझदार तरीका है। – MattDavey

0

कोई प्रश्न नहीं, आपके प्रश्न का कोई निश्चित उत्तर नहीं है। मेरी राय विधियों में ToString या AsText का उपयोग केवल आंतरिक किसी ऑब्जेक्ट की स्थिति प्रदान करने के लिए किया जाना चाहिए, उदा। इसे लॉग करने के लिए।किसी ऑब्जेक्ट उन्मुख भाषा में कार्यात्मक पहलुओं को एक अच्छी तरह से परिभाषित इंटरफ़ेस का उपयोग करके प्राप्त किया जाना चाहिए, उदा। GetOrderId, GetUserName

0

नहीं, मैं ऐसा नहीं करूँगा। उदाहरण के लिए, यदि मेरे पास कोई ऑब्जेक्ट ऑब्जेक्ट था, तो ToString()this.firstname + " " + this.lastname. वापस आ सकता है, यह स्वचालित डिस्प्ले उद्देश्यों के लिए इसका उपयोग कर रहा है, जैसे सूची बॉक्स में आइटम जोड़ना। जब वस्तु जोड़ा जाता है, तो व्यक्ति का नाम प्रदर्शित होता है। मुझे नहीं लगता कि मैं ओवरराइड में महत्वपूर्ण या सीनियर जानकारी डालूंगा।

+0

इस नियम के लिए एक अपवाद होगा यदि ऑब्जेक्ट IFormattable लागू किया गया है, इस मामले में ToString विधि इस तरह के डेटा का खुलासा करने के लिए बहुत अधिक लचीला और शक्तिशाली हो जाता है ... – MattDavey

+0

@MattDavey - सहमत –

1

अच्छा सवाल।

अधिक स्पष्ट होने के लिए, मैं अलग-अलग प्रारूप के लिए अलग-अलग विधि तैयार करूंगा।

पूर्व: toJson() -> ऑब्जेक्ट का JSON प्रतिनिधित्व toXML() -> ऑब्जेक्ट का XML प्रतिनिधित्व। ... आदि

नोट: शायद एक पुस्तकालय है जो आपके लिए करता है .. जावा में है। सी #

जैसा कि आप कहते हैं, एक टॉस्ट्रिंग() को पार्स करने से समय के साथ समस्या हो सकती है, क्योंकि एक नए डेवलपर को यह नहीं पता हो सकता है कि toString() का एक विशिष्ट प्रारूप है।

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