Salah satu cara untuk berpikir tentang ini adalah apa yang Anda maksud dengan waktu / tanggal ? Komputer tidak tahu apa konsep-konsep ini: mereka harus diprogram dalam cara apa pun. Ini cukup umum untuk merepresentasikan waktu dalam format UNIX "detik sejak zaman", dan itu umum untuk memasukkan nilai tertentu ke dalam program melalui panggilan OS. Namun, tidak peduli seberapa umum penggunaan ini, penting untuk diingat bahwa ini bukan waktu "aktual": ini hanya representasi logis.
Seperti yang orang lain tunjukkan, jika Anda membuat "tenggat waktu" menggunakan mekanisme ini, itu sepele untuk memberi makan di waktu yang berbeda dan memutus "tenggat waktu" itu. Hal yang sama berlaku untuk mekanisme yang lebih rumit seperti meminta server NTP (bahkan melalui koneksi "aman", karena kami dapat mengganti sertifikat kami sendiri, otoritas sertifikat atau bahkan menambal perpustakaan crypto). Pada awalnya mungkin terlihat bahwa orang-orang tersebut bersalah karena bekerja di sekitar mekanisme Anda, tetapi mungkin itu terjadi secara otomatis dan untuk alasan yang baik . Sebagai contoh, adalah ide yang baik untuk membuat build yang dapat direproduksi , dan alat untuk membantu hal ini dapat secara otomatis mereset / mencegat panggilan sistem non-deterministik tersebut. Libibaketime melakukan hal itu,menyetel semua stempel waktu file ke 1970-01-01 00:00:01
, fitur record / replay Qemu memalsukan semua interaksi perangkat keras, dll.
Ini mirip dengan hukum Goodhart : jika Anda membuat perilaku program bergantung pada waktu logis, maka waktu logis berhenti menjadi ukuran yang baik dari waktu "aktual". Dengan kata lain, orang pada umumnya tidak akan mengacaukan jam sistem, tetapi mereka akan melakukannya jika Anda memberi mereka alasan.
Ada representasi waktu logis lainnya: salah satunya adalah versi perangkat lunak (baik aplikasi Anda atau ketergantungan). Ini adalah representasi yang lebih diinginkan untuk "tenggat waktu" daripada misalnya waktu UNIX, karena itu lebih spesifik untuk hal yang Anda pedulikan (mengubah set fitur / API) dan karenanya cenderung menginjak-injak masalah ortogonal (misalnya mengutak-atik waktu UNIX untuk mengatasi batas waktu Anda bisa berakhir dengan memecah file log, tugas cron, cache, dll.).
Seperti yang dikatakan orang lain, jika Anda mengontrol perpustakaan dan ingin "mendorong" perubahan ini, Anda dapat mendorong versi baru yang mencemari fitur (menyebabkan peringatan, untuk membantu konsumen menemukan dan memperbarui penggunaannya), lalu versi baru lainnya yang menghilangkan fitur sepenuhnya. Anda dapat mempublikasikan ini segera setelah satu sama lain jika Anda suka, karena (lagi) versi hanyalah representasi waktu yang logis, mereka tidak perlu terkait dengan waktu "aktual". Versi semantik dapat membantu di sini.
Model alternatif adalah "menarik" perubahan. Ini seperti "paket B" Anda: tambahkan tes ke aplikasi yang menggunakan, yang memeriksa bahwa versi ketergantungan ini setidaknya nilai baru. Seperti biasa, merah / hijau / refactor untuk menyebarkan perubahan ini melalui basis kode. Ini mungkin lebih tepat jika fungsi tidak "buruk" atau "salah", tetapi hanya "cocok untuk kasus penggunaan ini".
Pertanyaan penting dengan pendekatan "tarikan" adalah apakah versi ketergantungan dihitung sebagai "unit" ( fungsionalitas ), dan karenanya layak untuk diuji; atau apakah itu hanya detail implementasi "pribadi", yang seharusnya hanya dilakukan sebagai bagian dari tes unit ( fungsionalitas ) yang sebenarnya. Saya akan mengatakan: jika perbedaan antara versi dependensi benar-benar dihitung sebagai fitur aplikasi Anda, maka lakukan tes (misalnya, memeriksa bahwa versi Python>> = 3.x). Jika tidak, maka jangantambahkan tes (karena akan rapuh, tidak informatif dan terlalu membatasi); jika Anda mengontrol perpustakaan maka turunkan rute "push". Jika Anda tidak mengontrol perpustakaan maka gunakan saja versi apa pun yang disediakan: jika tes Anda lulus maka tidak layak membatasi diri Anda; jika mereka tidak lulus maka itulah "tenggat waktu" Anda di sana!
Ada pendekatan lain, jika Anda ingin mencegah penggunaan fitur dependensi tertentu (misalnya memanggil fungsi-fungsi tertentu yang tidak cocok dengan sisa kode Anda), terutama jika Anda tidak mengontrol ketergantungan: minta standar pengkodean Anda melarang Saya tidak menyarankan penggunaan fitur-fitur ini, dan tambahkan tanda centang pada fitur-fitur Anda
Masing-masing akan berlaku dalam keadaan yang berbeda.