2010-06-13 17 views
5

स्टैकओवरफ्लो उपयोगकर्ता: मूल प्रकार, या का उपयोग कर प्रोग्रामों में बहुत सी चीजों का प्रतिनिधित्व किया जा सकता है, हम इसके लिए एक नई कक्षा बना सकते हैं।मूल प्रकार (इंटीजर, स्ट्रिंग) का उपयोग कब करें, और कब एक नई कक्षा लिखनी है?

उदाहरण: एक सामाजिक सुरक्षा संख्या एक संख्या, स्ट्रिंग या अपनी वस्तु हो सकती है।

(अन्य सामान्य उदाहरण: फ़ोन नंबर, नाम, पिन कोड प्रयोक्ता आईडी, आदेश आईडी और अन्य पहचान-पत्र।)

मेरा प्रश्न है: जब बुनियादी प्रकार इस्तेमाल किया जाना चाहिए, और जब हम अपने आप को एक लिखना चाहिए नई कक्षा?

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

मैं उन मामलों में आया हूं जहां इनमें से कई चीजें जावा इंटेगर्स और/या स्ट्रिंग्स के रूप में प्रदर्शित होती हैं। हमने टाइप-चेकिंग के लाभ को खो दिया है, और मैंने अक्सर function(Intever, Integer, Integer, Integer) पर कॉल में मिश्रित पैरामीटर के कारण बग को देखा है।

क्या हमें function(OrderId, ExternalOrderId, UserId, SalesManId) इस्नटेड होने से लाभ नहीं हो सकता है और टाइपिंग जांच से लाभ हो सकता है, भले ही इनमें से कोई अकेला अपनी कक्षा नहीं लेता है?

जाहिर है, जवाब "यह निर्भर करता है"। लेकिन, आप क्या सोचते हैं, और आप आम तौर पर क्या करते हैं?

+1

कक्षाओं के साथ प्राइमेटिव को प्रतिस्थापित करने के विचारों के बारे में एक सवाल है, यदि आप तय करते हैं कि आप कब चाहते हैं: http://stackoverflow.com/questions/24981278/design-patterns-for-type-safe-integers – Morad

उत्तर

2

पूछने का सवाल यह नहीं है कि "मैं इस डेटा को कैसे स्टोर कर सकता हूं?", बल्कि "मैं इस डेटा पर कैसे कार्य कर सकता हूं?"।

अपने कुछ उदाहरणों का उपयोग करने के लिए: एक एसएसएन संख्यात्मक है, XXX-XX-XXXX के रूप में। यदि आप शायद इसके लिए उपयोगकर्ता-इनपुट मान पढ़ रहे हैं, तो आपको यह सुनिश्चित करने के लिए कि किसी प्रकार का प्रारूप ठीक से इनपुट किया गया है, आपको कुछ प्रकार की सत्यापन प्रदान करने की आवश्यकता है। आप अलग-अलग 3 नंबरों को इनपुट करने के लिए एक विधि भी प्रदान करना चाहेंगे (जैसे किसी फॉर्म पर 3 टेक्स्ट बॉक्स), लेकिन उन्हें आंतरिक रूप से एसएसएन में जोड़ दें। अकेले स्ट्रिंग क्लास या इंटीजर का उपयोग करना इन कार्यों को करने का माध्यम प्रदान नहीं करेगा, इसलिए इसे अपने स्वयं के प्रकार देने का अच्छा विचार है, और सुनिश्चित करें कि केवल वैध मान ही संग्रहीत किए जा सकते हैं। वास्तव में डेटा को वास्तव में रखने के लिए आंतरिक रूप से एक इंट या स्ट्रिंग होगा, लेकिन encapsulating क्लास यह सुनिश्चित करता है कि आप वैध तरीके से मान को पढ़/लिखें।

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

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

2

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

1

जब तक निर्मित प्रकारों के लिए आप जो कुछ भी उपयोग कर रहे हैं उसके लिए समझ में आता है, तो कोई विशेष वर्ग बनाने का कोई कारण नहीं है। जब यह स्पष्ट नहीं होता है कि एक चर में डेटा वास्तव में क्या मतलब है, तो आप इसे स्पष्ट करने के लिए कक्षा बना सकते हैं।

उदाहरण के लिए एक फोन नंबर की तरह एक मान एक स्ट्रिंग के रूप में अच्छी तरह से काम करता है।यह प्रकृति में संख्यात्मक है, हालांकि आप इस पर कोई गणना नहीं करेंगे, इसलिए आप इस पर कोई भी सत्यापन कार्य के लिए महत्वपूर्ण नहीं हैं, यह केवल उपयोगकर्ताओं को बकवास करने से रोकना है।

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

+0

किसी भी तरह से आपके उदाहरण मेरे अंतर्ज्ञान के सटीक विपरीत प्रतीत होते हैं, एक फोन नंबर एक वर्ग होना चाहिए क्योंकि यह कई अलग-अलग प्रारूपों में आ सकता है और हम नहीं चाहते हैं कि हर कोई पार्सिंग को संभालने और इसे जांचने के लिए, दूसरे पर जब दूरी की तरह चर की बात आती है तो मुझे इसे अपनी कक्षा बनाने की ज़रूरत नहीं होती है, मैं आमतौर पर चर के नाम पर इकाइयों को नोट करता हूं (उदाहरण के लिए 'int commandTimeoutSec') – Morad

+0

@MoradAbdelrahman: हाँ, यह हो सकता है कि आप इसे कार्यान्वित करना चाहते हैं, लेकिन यह उदाहरणों के लिए वास्तव में प्रासंगिक नहीं है। वे केवल उदाहरण हैं कि कुछ घूमने के लिए कुछ है, और यह प्रासंगिक उदाहरणों में तर्क है। – Guffa

1

यह एक व्यापार-बंद है। बुनियादी प्रकारों को समझना आसान होता है जबकि कस्टम प्रकारों को पहले समझा जाना चाहिए। यह आपके प्रोजेक्ट डोमेन की मुख्य संस्थाओं में से एक होना चाहिए जिसे कस्टम प्रकार के रूप में घोषित किया जाना चाहिए।

एक मानदंड है: यदि यह एक कस्टम प्रकार के लायक है, तो इसके लिए पहले से ही एक डोमेन-विशिष्ट समकक्ष शब्द है। उदाहरण के लिए हम यात्रियों को परिवहन करते समय "एक आदमी जो कार चलाते हैं" एक "चालक" कहते हैं और ... चिकित्सा डोमेन में सभी ड्राइवर और यात्री मानव होते हैं और मानदंड कुछ और होगा।

0

यदि वह क्षेत्र हमेशा अन्य क्षेत्रों के साथ संयोजन में उपयोग किया जाता है, तो तार्किक समूह बनाना समझ में आता है। यह देखा जा सकता है जब वहाँ विधियों जो लगातार पैरामीटर के एक ही सेट लेते हैं।

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

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

1

बहु-तर्क कार्यों के लिए प्रकार-सुरक्षा प्रदान करना एक ऐसा मामला है जहां आईएमओ वास्तव में उस वर्ग को बनाने के लायक होगा जिसके पास कोई कार्यक्षमता नहीं है (मान लीजिए कि आपके पास लाभ के लिए आपके कोड में पर्याप्त कार्य हैं)।

नामांकित तर्क आसान समाधान होगा, हालांकि दुर्भाग्य से वे सभी भाषाओं में उपलब्ध नहीं हैं।

+0

यह कुछ समय हो गया है जब से मैंने सवाल पूछा था, लेकिन मैं काफी निष्कर्ष पर पहुंचा हूं। सुरक्षा टाइप करें और भ्रम से परहेज करना अक्सर कुछ नए (छोटे) वर्गों को पेश करने के लायक है। – andrel

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