इस बारे में सोचने का एक तरीका यह है कि आप समय / तारीख से क्या मतलब रखते हैं ? कंप्यूटर नहीं जानते कि ये अवधारणाएं क्या हैं: उन्हें किसी भी तरह से प्रोग्राम किया जाना है। यह "सेकंड के बाद के युग" के UNIX प्रारूप में समय का प्रतिनिधित्व करने के लिए काफी सामान्य है , और ओएस कॉल के माध्यम से एक कार्यक्रम में एक विशेष मूल्य को खिलाने के लिए आम है। हालांकि, कोई फर्क नहीं पड़ता कि यह उपयोग कितना सामान्य है, यह ध्यान रखना महत्वपूर्ण है कि यह "वास्तविक" समय नहीं है: यह सिर्फ एक तार्किक प्रतिनिधित्व है।
जैसा कि दूसरों ने बताया है, यदि आपने इस तंत्र का उपयोग करके "समय सीमा" बनाई है, तो यह एक अलग समय में खिलाने और उस "समय सीमा" को तोड़ने के लिए तुच्छ है। वही अधिक विस्तृत तंत्र के लिए जाता है जैसे NTP सर्वर ("सुरक्षित" कनेक्शन पर भी, क्योंकि हम अपने स्वयं के प्रमाणपत्र, प्रमाणपत्र प्राधिकारी या क्रिप्टो लाइब्रेरीज़ को पैच कर सकते हैं)। पहले तो यह प्रतीत हो सकता है कि ऐसे व्यक्ति आपके तंत्र के आसपास काम करने के लिए गलती कर रहे हैं, लेकिन ऐसा हो सकता है कि यह स्वचालित रूप से और अच्छे कारणों के लिए किया गया हो । उदाहरण के लिए, यह एक अच्छा विचार है कि प्रतिलिपि प्रस्तुत करने योग्य बनाता है , और इस तरह के गैर-निर्धारक प्रणाली कॉल को स्वचालित रूप से रीसेट / अवरोधन करने में मदद करने के लिए उपकरण। libfaketime वास्तव में यही करता है,सभी फ़ाइल के टाइमस्टैम्प्स को सेट करता है 1970-01-01 00:00:01
, Qemu का रिकॉर्ड / रिप्ले फीचर फेक सभी हार्डवेयर इंटरैक्शन, आदि।
यह गुडहार्ट के नियम के समान है : यदि आप किसी कार्यक्रम के व्यवहार को तार्किक समय पर निर्भर करते हैं, तो तार्किक समय "वास्तविक" समय का एक अच्छा उपाय है। दूसरे शब्दों में, लोग आमतौर पर सिस्टम क्लॉक के साथ गड़बड़ नहीं करेंगे, लेकिन अगर आप उन्हें इसका कारण बताएंगे, तो वे ऐसा करेंगे।
समय के अन्य तार्किक प्रतिनिधित्व हैं: उनमें से एक सॉफ्टवेयर का संस्करण है (या तो आपका ऐप या कुछ निर्भरता)। यह यूनिक्स समय की तुलना में "समय सीमा" के लिए एक अधिक वांछनीय प्रतिनिधित्व है, क्योंकि यह उस चीज़ के बारे में अधिक विशिष्ट है जिसके बारे में आप (फीचर सेट / एपीआई बदलते हैं) देखभाल करते हैं और इसलिए ऑर्थोगोनल चिंताओं (जैसे यूनिक्स के समय के साथ खिलवाड़) पर रौंदने की संभावना कम है आपकी समय सीमा के आसपास काम लॉग फाइल, क्रॉन जॉब्स, कैश आदि को समाप्त कर सकता है)।
जैसा कि अन्य लोगों ने कहा है, यदि आप लाइब्रेरी को नियंत्रित करते हैं और इस बदलाव को "पुश" करना चाहते हैं, तो आप एक नए संस्करण को धक्का दे सकते हैं जो सुविधाओं को चित्रित करता है (चेतावनी के कारण, उपभोक्ताओं को उनके उपयोग को खोजने और अपडेट करने में मदद करने के लिए), फिर एक और नया संस्करण जो हटाता है पूरी तरह से सुविधाएँ। आप इन्हें एक दूसरे के तुरंत बाद प्रकाशित कर सकते हैं यदि आप चाहें, तो (फिर से) संस्करण केवल समय का एक तार्किक प्रतिनिधित्व है, उन्हें "वास्तविक" समय से संबंधित होने की आवश्यकता नहीं है। शब्दार्थ संस्करण यहां मदद कर सकता है।
वैकल्पिक मॉडल परिवर्तन को "खींचने" के लिए है। यह आपके "प्लान बी" की तरह है: उपभोग करने वाले एप्लिकेशन में एक परीक्षण जोड़ें, जो यह जांचता है कि इस निर्भरता का संस्करण कम से कम नया मूल्य है। कोडबेस के माध्यम से इस परिवर्तन को प्रचारित करने के लिए हमेशा की तरह लाल / हरा / परावर्तक। यह अधिक उपयुक्त हो सकता है यदि कार्यक्षमता "खराब" या "गलत" नहीं है, लेकिन सिर्फ "इस उपयोग-मामले के लिए एक खराब फिट" है।
"पुल" दृष्टिकोण के साथ एक महत्वपूर्ण सवाल यह है कि क्या निर्भरता संस्करण "इकाई" ( कार्यक्षमता की ) के रूप में गिना जाता है , और इसलिए परीक्षण के योग्य है; या क्या यह सिर्फ एक "निजी" कार्यान्वयन विवरण है, जिसे केवल वास्तविक इकाई ( कार्यक्षमता ) परीक्षणों के हिस्से के रूप में प्रयोग किया जाना चाहिए । मैं कहता हूं: यदि निर्भरता के संस्करणों के बीच अंतर वास्तव में आपके आवेदन की एक विशेषता के रूप में गिना जाता है, तो परीक्षण करें (उदाहरण के लिए, जाँच कर रहा है कि पायथन संस्करण है> = = 3.x)। यदि नहीं, तो नहींपरीक्षण जोड़ें (चूंकि यह भंगुर, असंक्रामक और अत्यधिक प्रतिबंधात्मक होगा); यदि आप लाइब्रेरी को नियंत्रित करते हैं तो "पुश" रूट पर जाएं। यदि आप लाइब्रेरी को नियंत्रित नहीं करते हैं, तो बस जो भी संस्करण प्रदान किया गया है उसका उपयोग करें: यदि आपके परीक्षण पास हो जाते हैं तो यह स्वयं को प्रतिबंधित करने के लायक नहीं है; अगर वे पास नहीं होते हैं, तो यह आपकी "समय सीमा" है!
एक और दृष्टिकोण है, यदि आप एक निर्भरता की सुविधाओं के कुछ उपयोग को हतोत्साहित करना चाहते हैं (जैसे कुछ कार्यों को कॉल करना जो आपके कोड के बाकी हिस्सों के साथ अच्छा नहीं खेलते हैं), खासकर यदि आप निर्भरता को नियंत्रित नहीं करते हैं: तो आपके कोडिंग मानकों को मना करें / इन सुविधाओं के उपयोग को हतोत्साहित करें, और अपने लिंटर में उनके लिए चेक जोड़ें।
इनमें से प्रत्येक अलग-अलग परिस्थितियों में लागू होगा।