วิธีหนึ่งในการคิดเกี่ยวกับสิ่งนี้คือสิ่งที่คุณหมายถึงตามเวลา / วันที่ ? คอมพิวเตอร์ไม่ทราบว่าแนวคิดเหล่านี้คืออะไรพวกเขาจะต้องมีการตั้งโปรแกรมอย่างใด เป็นเรื่องปกติที่จะแสดงเวลาในรูปแบบ UNIX เป็น "วินาทีนับตั้งแต่ยุค" และเป็นเรื่องปกติที่จะป้อนค่าเฉพาะลงในโปรแกรมผ่านการเรียกใช้ระบบปฏิบัติการ อย่างไรก็ตามไม่ว่าการใช้งานนี้จะเป็นเรื่องธรรมดาเพียงใดก็ตามโปรดทราบว่าไม่ใช่เวลา "จริง": เป็นเพียงการแสดงเชิงตรรกะ
ตามที่คนอื่น ๆ ได้ชี้ให้เห็นหากคุณสร้าง "กำหนดเวลา" โดยใช้กลไกนี้มันสำคัญมากที่จะเลี้ยงในเวลาที่ต่างออกไปและทำลาย "กำหนดเวลา" นั้น เช่นเดียวกันกับกลไกที่ซับซ้อนยิ่งขึ้นเช่นการขอเซิร์ฟเวอร์ NTP (แม้ผ่านการเชื่อมต่อที่ "ปลอดภัย" เนื่องจากเราสามารถแทนที่ใบรับรองของเราเอง, ผู้ออกใบรับรองหรือแม้แต่แก้ไขไลบรารี crypto) ตอนแรกมันอาจปรากฏว่าบุคคลดังกล่าวมีความผิดสำหรับการทำงานรอบกลไกของคุณ แต่มันอาจจะเป็นกรณีที่มันทำโดยอัตโนมัติและสำหรับเหตุผลที่ดี ตัวอย่างเช่นเป็นความคิดที่ดีที่จะมีบิลด์ที่ทำซ้ำได้และเครื่องมือที่จะช่วยให้สิ่งนี้อาจรีเซ็ต / สกัดกั้นการเรียกระบบที่ไม่ได้กำหนดไว้โดยอัตโนมัติ libfaketimeทำอย่างนั้นตั้งค่าการประทับเวลาของไฟล์ทั้งหมดเป็นคุณสมบัติการบันทึก / เล่นซ้ำ1970-01-01 00:00:01
ของ Qemu ทำให้การโต้ตอบของฮาร์ดแวร์ทั้งหมด ฯลฯ
สิ่งนี้คล้ายกับกฎหมายของ Goodhart : หากคุณสร้างพฤติกรรมของโปรแกรมขึ้นอยู่กับเวลาตรรกะแล้วเวลาตรรกะจะสิ้นสุดลงเพื่อเป็นการวัดที่ดีของเวลา "จริง" กล่าวอีกนัยหนึ่งคนทั่วไปจะไม่ยุ่งกับนาฬิกาของระบบ แต่พวกเขาจะถ้าคุณให้เหตุผลพวกเขา
มีตัวแทนเชิงตรรกะอื่น ๆ ของเวลา: หนึ่งในนั้นคือรุ่นของซอฟต์แวร์ (ทั้งแอพของคุณหรือการพึ่งพาบางส่วน) นี่เป็นการนำเสนอที่ต้องการมากขึ้นสำหรับ "กำหนดเวลา" มากกว่าเช่นเวลา UNIX เนื่องจากมันมีความเฉพาะเจาะจงมากขึ้นกับสิ่งที่คุณสนใจ (การเปลี่ยนชุดคุณลักษณะ / APIs) และดังนั้นจึงมีโอกาสน้อยที่จะเหยียบย่ำความกังวลแบบมุมฉาก การทำงานตามกำหนดเวลาของคุณอาจสิ้นสุดการทำลายไฟล์บันทึกงาน cron งานแคช ฯลฯ )
อย่างที่คนอื่นพูดถ้าคุณควบคุมห้องสมุดและต้องการที่จะ "ผลักดัน" การเปลี่ยนแปลงนี้คุณสามารถผลักเวอร์ชันใหม่ที่เลิกใช้งานฟีเจอร์ (ทำให้เกิดคำเตือนเพื่อช่วยให้ผู้บริโภคค้นหาและอัปเดตการใช้งาน) จากนั้นเวอร์ชันใหม่ คุณสมบัติทั้งหมด คุณสามารถเผยแพร่สิ่งเหล่านี้ได้ทันทีหลังจากที่คุณต้องการเนื่องจากรุ่น (อีกครั้ง) เป็นเพียงการนำเสนอทางตรรกะของเวลาจึงไม่จำเป็นต้องเกี่ยวข้องกับเวลา "จริง" การกำหนดเวอร์ชันความหมายอาจช่วยได้ที่นี่
รูปแบบทางเลือกคือ "ดึง" การเปลี่ยนแปลง นี่เป็นเหมือน "แผน B" ของคุณ: เพิ่มการทดสอบลงในแอปพลิเคชันที่ใช้งานมากซึ่งตรวจสอบว่าเวอร์ชันของการพึ่งพานี้เป็นอย่างน้อยค่าใหม่ ตามปกติแล้วสีแดง / สีเขียว / refactor เพื่อเผยแพร่การเปลี่ยนแปลงนี้ผ่าน codebase นี่อาจเหมาะสมกว่าหากฟังก์ชันการทำงานไม่ "เลวร้าย" หรือ "ผิด" แต่เพียงแค่ "เหมาะสมกับกรณีใช้งานนี้"
คำถามสำคัญเกี่ยวกับวิธีการ "ดึง" คือเวอร์ชั่นอ้างอิงนั้นนับว่าเป็น "หน่วย" ( ของฟังก์ชัน ) หรือไม่ดังนั้นจึงสมควรได้รับการทดสอบ หรือไม่ว่าจะเป็นเพียงรายละเอียดการใช้งาน "ส่วนตัว" ซึ่งควรใช้เป็นส่วนหนึ่งของการทดสอบหน่วย ( ของฟังก์ชัน ) จริงเท่านั้น ฉันจะบอกว่า: หากความแตกต่างระหว่างเวอร์ชันของการพึ่งพานั้นนับเป็นคุณสมบัติของแอปพลิเคชันของคุณจริงๆให้ทำการทดสอบ (ตัวอย่างเช่นการตรวจสอบว่าเวอร์ชัน Python นั้นเป็น> = 3.x) ถ้าไม่เช่นนั้นไม่ได้เพิ่มการทดสอบ (เนื่องจากจะมีความเปราะไม่เป็นทางการและเข้มงวดมากเกินไป) หากคุณควบคุมห้องสมุดให้ไปตามเส้นทาง "push" หากคุณไม่ได้ควบคุมไลบรารีให้ใช้เวอร์ชันใดก็ได้ที่มีให้: หากการทดสอบของคุณผ่านไปแล้วก็ไม่คุ้มค่าที่จะ จำกัด ตัวเอง หากพวกเขาไม่ผ่านก็เป็น "วันสุดท้าย" ของคุณที่นั่น!
มีวิธีการอื่นหากคุณต้องการกีดกันการใช้คุณลักษณะบางอย่างของการพึ่งพา (เช่นการเรียกฟังก์ชั่นบางอย่างที่เล่นได้ไม่ดีกับรหัสที่เหลือ) โดยเฉพาะอย่างยิ่งถ้าคุณไม่ควบคุมการพึ่งพา: ให้มาตรฐานการเข้ารหัสของคุณห้าม / กีดกันการใช้งานคุณสมบัติเหล่านี้และเพิ่มการตรวจสอบคุณสมบัติเหล่านั้นใน linter ของคุณ
แต่ละเหล่านี้จะสามารถใช้งานได้ในสถานการณ์ที่แตกต่างกัน