Bunu düşünmenin bir yolu, zaman / tarih ile ne demek istediğinizi ? Bilgisayarlar bu kavramların ne olduğunu bilmiyor: bir şekilde programlanmaları gerekiyor. Bu oldukça yaygındır temsil "Dönemden beri saniye" nin UNIX formatında kez ve OS görüşmesi ile bir programa belirli bir değer beslemek için yaygındır. Ancak, bu kullanım ne kadar yaygın olursa olsun, "gerçek" zaman olmadığını unutmamak önemlidir: bu sadece mantıklı bir sunumdur.
Diğerlerinin de belirttiği gibi, bu mekanizmayı kullanarak bir "son tarih" koyduysanız, farklı bir zamanda beslemek ve bu "son tarihi" kırmak önemsizdir. Aynı şey, NTP sunucusuna soru sorma gibi daha ayrıntılı mekanizmalar için de geçerlidir ("güvenli" bir bağlantı üzerinden bile, çünkü kendi sertifikalarımızı, sertifika otoritelerini değiştirebilir veya kripto kütüphanelerini ekleyebiliriz). İlk başta, bu tür bireylerin mekanizmanız üzerinde çalışmak için hatalı oldukları görünebilir, ancak otomatik olarak yapılması ve iyi nedenlerden dolayı olabilir . Örneğin, yeniden üretilebilir yapılara sahip olmak ve bunun deterministik olmayan sistem çağrılarını otomatik olarak sıfırlayabilmesi / engellemesine yardımcı olacak araçlar olması iyi bir fikirdir . libfaketime tam olarak bunu yapar,tüm dosyanın zaman damgalarını ayarlar 1970-01-01 00:00:01
; Qemu'nun kayıt / tekrar oynatma özelliği tüm donanım etkileşimlerini vb. taklit eder.
Bu, Goodhart yasasına benzer : bir programın davranışını mantıksal zamana bağlı olarak yaparsanız, mantıksal zaman "gerçek" zamanın iyi bir ölçütü olmaktan çıkar. Başka bir deyişle, insanlar genellikle sistem saatiyle uğraşmazlar, ancak onlara bir sebep verirseniz derler.
Zamanın başka bir mantıksal temsili vardır: bunlardan biri yazılımın sürümüdür (uygulamanız veya bazı bağımlılıklar). Bu, örneğin UNIX zamanından daha "son tarih" için daha çok istenen bir temsildir, çünkü önemsediğiniz şeye özgüdür (özellik kümelerini / API'leri değiştirme) ve bu nedenle ortogonal kaygıları çiğneme olasılığı daha düşüktür (örneğin, UNIX zamanına uyma gibi) son teslim tarihini aşmak, günlük dosyalarının, cron işlerinin, önbelleklerin vb.
Diğerlerinin dediği gibi, kütüphaneyi kontrol ediyorsanız ve bu değişikliği "zorlamak" istiyorsanız, özellikleri kullanımdan kaldıran yeni bir sürümü (tüketicilerin kullanımlarını bulmasına ve güncellemesine yardımcı olmak için uyarılara neden olur) itip, tamamen özellikleri. İsterseniz (hemen sonra) sürümler yalnızca zamanın mantıksal bir gösterimi olduğundan, "gerçek" zamanla ilgili olmaları gerekmiyorsa, bunları hemen sonra yayınlayabilirsiniz. Anlamsal versiyonlama burada yardımcı olabilir.
Alternatif model, değişikliği "çekmek" tir. Bu sizin "B planınız" gibidir: Tüketici uygulamasına bir test ekleyin; bu bağımlılık sürümünün en azından yeni değer olduğunu kontrol eder. Her zamanki gibi, bu değişikliği kod tabanından yaymak için kırmızı / yeşil / refactor. İşlevsellik "kötü" veya "yanlış" değilse, sadece "bu kullanım durumu için uygun" ise, bu daha uygun olabilir.
"Çekme" yaklaşımıyla ilgili önemli bir soru, bağımlılık sürümünün bir "birim" ( işlevsellik ) olarak sayılıp sayılmadığıdır ve bu nedenle test etmeyi hak eder; ya da sadece gerçek birim ( işlevsellik ) testlerinin bir parçası olarak yapılması gereken sadece “özel” bir uygulama detayı olup olmadığı . Diyelim ki: Bağımlılığın sürümleri arasındaki fark gerçekten uygulamanızın bir özelliği olarak sayılıyorsa, testi yapın (örneğin, Python sürümünün> = 3.x olduğunu kontrol edin). Eğer değilse, o zaman yapmatesti ekleyin (kırılgan, bilgisiz ve aşırı kısıtlayıcı olacağından); Kütüphaneyi kontrol ediyorsanız "basma" rotasından aşağı inin. Kütüphaneyi kontrol etmezseniz, sağlanan sürümleri kullanın: testleriniz başarılı olursa kendinizi sınırlandırmaya değmez; eğer geçemezlerse, işte oradaki "son tarihin" budur!
Bir bağımlılığın özelliklerinin belirli kullanımlarından vazgeçmek istiyorsanız (örneğin, kodunuzun geri kalanıyla iyi çalışmayan bazı işlevleri arama), özellikle bağımlılığı kontrol etmiyorsanız başka bir yaklaşım daha vardır: kodlama standartlarınızı yasaklayın. / bu özelliklerin kullanımını engeller ve onlar için linter'ınıza kontroller ekler.
Bunların her biri farklı durumlarda geçerli olacaktır.