दिलचस्प पोस्ट
JavaScript के साथ एक डिवाइन का स्क्रीनशॉट कैसे लें? जावास्क्रिप्ट में आइफ्रेम एम्बेडिंग का पता लगाएं UINavigationBar में बाईं ओर रिक्त स्थान रिक्त स्थान कैसे संपादित करें, सही UIBarButtonItem किसी शब्द / स्ट्रिंग को बाहर करने के लिए एक नियमित अभिव्यक्ति पायथन अनुरोध मॉड्यूल को छोड़कर / कोशिश करने का सही तरीका है? आप प्रदर्शन परीक्षण जावास्क्रिप्ट कोड कैसे करते हैं? जावास्क्रिप्ट स्ट्रिंग्स और नंबरों के बीच प्लस और माइनस ऑपरेटर्स को अलग तरह से क्यों संभालता है? गतिशील रूप से मैट्रिक्स आवंटित करने के लिए फ़ंक्शन Android संपादनटैच हटाएं (बैकस्पेस) कुंजी ईवेंट एक अंकगणितीय अभिव्यक्ति पार्सिंग और जावा में से एक पेड़ का निर्माण क्यों पो (n, 2) 24 को वापस करता है जब n = 5, मेरे कंपाइलर और ओएस के साथ? कॉलम की अलग संख्या के साथ दो तालिकाओं का संघ बनाना जावास्क्रिप्ट में लांग प्रेस? एंड्रॉइड में बाह्य भंडारण में एक फाइल लिखें Jquery का उपयोग करते हुए स्पैन तत्व के बाद पाठ प्राप्त करें

जावा दिनांक एपीआई (java.util.Date,। कैलेंडर) ऐसी गड़बड़ क्यों है?

जैसा कि अधिकांश लोगों को अब तक के बारे में पता है, कैलेंडर तिथियों को संभालने के लिए जावा एपीआई (विशेष रूप से कक्षाएं java.util.Date और java.util.Calendar ) एक भयानक गड़बड़ हैं।

मेरे सर के ऊपर से चला गया:

  • तिथि अस्थिर है
  • तिथि एक टाइमस्टैम्प का प्रतिनिधित्व करती है, एक तारीख नहीं
  • तिथि घटकों (दिन, महीने, वर्ष …) और तिथि के बीच कन्वर्ट करने का कोई आसान तरीका नहीं है
  • कैलेंडर का उपयोग करने के लिए clunky है, और अलग-अलग कैलेंडर सिस्टम को एक वर्ग में संयोजित करने का प्रयास करता है

यह पोस्ट इसे अच्छी तरह बताता है, और JSR-310 भी इन समस्याओं का विस्तार करता है

अब मेरा सवाल है:

इन कक्षाओं को जावा एसडीके में कैसे बना दिया? इन समस्याओं में से अधिकांश काफी स्पष्ट दिखते हैं (विशेष रूप से तिथि होने योग्य है) और इन्हें बचाना आसान होना चाहिए था तो यह कैसे हुआ? समय दबाव? या क्या केवल पिछली बार समस्याओं में स्पष्ट समस्या है?

मुझे एहसास है कि यह कड़ाई से एक प्रोग्रामिंग प्रश्न नहीं है, लेकिन मुझे यह समझना दिलचस्प लगता है कि एपीआई डिजाइन कितना गलत हो सकता है। सब के बाद, गलती हमेशा अच्छा सीखने का मौका (और मैं उत्सुक हूँ)।

वेब के समाधान से एकत्रित समाधान "जावा दिनांक एपीआई (java.util.Date,। कैलेंडर) ऐसी गड़बड़ क्यों है?"

किसी ने इसे बेहतर कहा है कि मैं कभी यह कह सकता हूं:

  • क्लास Date मिलिसेकंड परिशुद्धता के साथ समय में एक विशिष्ट पल का प्रतिनिधित्व करता है। इस क्लास का डिज़ाइन बहुत खराब मजाक है – एक अच्छा उदाहरण जो कि अच्छे प्रोग्रामर भी पेंच करते हैं। तिथि में अधिकांश तरीकों को अब पदावनत किया गया है, नीचे दिए गए वर्गों में विधियों द्वारा प्रतिस्थापित किया गया है।
  • कक्षा Calendar एक Date ऑब्जेक्ट और पूर्णांक फ़ील्ड जैसे कि वर्ष, महीने, दिन और घंटे के बीच परिवर्तित करने के लिए एक अमूर्त वर्ग है

  • क्लास GregorianCalendar जेडीके में Calendar का एकमात्र उप-वर्ग है। यह सामान्य उपयोग में कैलेंडर सिस्टम के लिए दिनांक-से-फ़ील्ड रूपांतरण करता है सन ने तलिजेंट से इस ओव्हेंटेनिएनेर कचरे का लाइसेंस प्राप्त किया है – यह एक शानदार उदाहरण है कि कैसे औसत प्रोग्रामर पेंच करते हैं

जावा प्रोग्रामर्स एफएक्यू से , 07.X.1998 का ​​संस्करण, पीटर वैन डेर लिंडेन द्वारा – यह हिस्सा बाद के संस्करणों से हटा दिया गया था।

परिवर्तनशीलता के लिए, बहुत जल्द जेडीके कक्षाओं से ग्रस्त हैं ( Point , Rectangle , Dimension , …)। Misdirected अनुकूलन, मैंने कुछ कहना सुना है।

विचार यह है कि आप प्रतियां बनाने के बजाय ऑब्जेक्ट्स ( o.getPosition().x += 5 ) का पुन: उपयोग करने में सक्षम होना चाहते हैं ( o.setPosition(o.getPosition().add(5, 0)) ) आपके पास अपरिवर्तनीय साथ करना यह शुरुआती वीएम के साथ भी एक अच्छा विचार हो सकता है, जबकि यह सबसे अधिक संभावना है आधुनिक वीएम के साथ नहीं।

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

कैलेंडर ऑब्जेक्ट बनाने के लिए यह एक समय भी महंगा था।

वे पिछड़े संगतता कारणों के लिए इस तरह से रहते हैं। शायद अधिक दुर्भाग्यपूर्ण क्या था कि एक बार गलती का एहसास हो गया कि पुरानी कक्षा को नापसंद नहीं किया गया था और सभी एपीआई आगे बढ़ने के लिए नई तारीख / समय कक्षाएं बनाई गई थीं। यह कुछ डिग्री जेडीके 8 एडीआई ( java.time , जेएसआर 310) की तरह जुडाटाइम के अपनाने के साथ हुई है, लेकिन वास्तव में यह बहुत देर हो चुकी है

समय स्वयं उपाय करने के लिए आसान नहीं है बस समय के बारे में विकिपीडिया लेख की लंबाई को देखें और फिर, समय के बारे में अलग-अलग समझ होते हैं: एक बेईमान समय बिंदु (एक निरंतर), एक निश्चित स्थान पर एक समय बिंदु, समय सीमा, समय का संकल्प ….

मुझे याद है, जब मैंने देखा था कि java.util.Date पहली बार (जेडीके 1.0?) मैं इसके बारे में वास्तव में खुश था। जिन भाषाओं को मैं जानता था उनमें ऐसी कोई सुविधा नहीं थी मुझे समय रूपांतरण आदि के बारे में नहीं सोचना था।

मुझे लगता है कि यह गड़बड़ है, क्योंकि यदि आप एक स्तर की समझ (XMLGregorianCaldender vs. Date) और आवश्यकताएँ (नैनोकेकंड्स, पिछले 2030) से उच्च स्तर पर विकसित होते हैं, लेकिन पुरानी अछूता को बनाए रखने में परिवर्तन करने वाली सभी चीजें बदलेगी। और java.util.Date एक अपवाद नहीं है बस I / O सबसिस्टम या एडब्ल्यूटी से स्विंग तक के संक्रमण को देखो …

और इसके कारण, "हमें कभी रीसेट बटन दबाए जाने चाहिए।" (जो कि ने कहा, बीटीड।?)

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

अत्यधिक बेकार डिजाइन की सात आदतें