Eine Möglichkeit, darüber nachzudenken, ist, was Sie unter Zeit / Datum verstehen . Computer wissen nicht, was diese Konzepte sind: Sie müssen irgendwie programmiert werden. Es ist durchaus üblich, Zeiten im UNIX-Format "Sekunden seit der Epoche" darzustellen , und es ist üblich, einen bestimmten Wert über Betriebssystemaufrufe in ein Programm einzugeben. Unabhängig davon, wie häufig diese Verwendung verwendet wird, ist es wichtig zu berücksichtigen, dass es sich nicht um die "tatsächliche" Zeit handelt, sondern nur um eine logische Darstellung.
Wie andere darauf hingewiesen haben, ist es trivial, eine andere Zeit einzugeben und diese "Frist" zu überschreiten, wenn Sie mit diesem Mechanismus eine "Frist" festgelegt haben. Das gleiche gilt für aufwändigere Mechanismen wie das Fragen an einen NTP-Server (auch über eine "sichere" Verbindung, da wir unsere eigenen Zertifikate, Zertifizierungsstellen oder sogar die Kryptobibliotheken ersetzen können). Auf den ersten Blick mag es so aussehen, als ob solche Personen daran schuld sind, an Ihrem Mechanismus herumzuarbeiten, aber es kann sein, dass dies automatisch und aus guten Gründen geschieht . Zum Beispiel ist es eine gute Idee, reproduzierbare Builds zu haben , und Tools, die dies unterstützen, könnten solche nicht deterministischen Systemaufrufe automatisch zurücksetzen / abfangen. libfaketime macht genau das,1970-01-01 00:00:01
Setzt alle Zeitstempel der Datei auf , die Aufnahme- / Wiedergabefunktion von Qemu fälscht alle Hardware-Interaktionen usw.
Dies ähnelt dem Goodhartschen Gesetz : Wenn Sie das Verhalten eines Programms von der logischen Zeit abhängig machen, ist die logische Zeit kein gutes Maß für die "tatsächliche" Zeit mehr. Mit anderen Worten, die Leute werden sich im Allgemeinen nicht mit der Systemuhr anlegen, aber sie werden es tun, wenn Sie ihnen einen Grund dafür geben.
Es gibt andere logische Darstellungen der Zeit: Eine davon ist die Version der Software (entweder Ihre App oder eine Abhängigkeit). Dies ist eine wünschenswertere Darstellung für eine "Frist" als z. B. die UNIX-Zeit, da sie spezifischer für das ist, was Sie interessieren (Ändern von Feature-Sets / APIs) und daher weniger wahrscheinlich auf orthogonalen Bedenken herumtrampeln (z. B. mit der UNIX-Zeit herumspielen) Die Umgehung Ihrer Frist kann dazu führen, dass Protokolldateien, Cronjobs, Caches usw. beschädigt werden.
Wie andere bereits gesagt haben, können Sie, wenn Sie die Bibliothek steuern und diese Änderung "pushen" möchten, eine neue Version pushen, die die Funktionen nicht mehr unterstützt (was zu Warnungen führt, um den Verbrauchern das Auffinden und Aktualisieren ihrer Verwendung zu erleichtern) Funktionen vollständig. Sie können diese sofort nacheinander veröffentlichen, wenn Sie möchten, da (wieder) Versionen lediglich eine logische Darstellung der Zeit sind, müssen sie nicht mit der "tatsächlichen" Zeit zusammenhängen. Die semantische Versionierung kann hier Abhilfe schaffen.
Das alternative Modell ist das "Ziehen" der Änderung. Dies ähnelt Ihrem "Plan B": Fügen Sie der konsumierenden Anwendung einen Test hinzu, der überprüft, ob die Version dieser Abhängigkeit mindestens dem neuen Wert entspricht. Wie üblich, Rot / Grün / Refaktor, um diese Änderung durch die Codebasis zu verbreiten. Dies ist möglicherweise angemessener, wenn die Funktionalität nicht "schlecht" oder "falsch" ist, sondern nur "schlecht für diesen Anwendungsfall geeignet".
Eine wichtige Frage beim "Pull" -Ansatz ist, ob die Abhängigkeitsversion als "Einheit" ( der Funktionalität ) gilt oder nicht und daher einen Test verdient. oder ob es sich nur um ein "privates" Implementierungsdetail handelt, das nur im Rahmen tatsächlicher Unit ( of Functional ) -Tests ausgeführt werden sollte. Ich würde sagen: Wenn die Unterscheidung zwischen den Versionen der Abhängigkeit wirklich als Merkmal Ihrer Anwendung gilt, führen Sie den Test durch (überprüfen Sie beispielsweise, ob die Python-Version> = 3.x ist). Wenn nicht, dann nichtFügen Sie den Test hinzu (da er spröde, nicht aussagekräftig und zu restriktiv ist). Wenn Sie die Bibliothek kontrollieren, gehen Sie die "Push" -Route hinunter. Wenn Sie die Bibliothek nicht kontrollieren, verwenden Sie einfach die mitgelieferte Version: Wenn Ihre Tests erfolgreich sind, lohnt es sich nicht, sich einzuschränken. Wenn sie nicht bestehen, ist das genau dort Ihre "Frist"!
Es gibt einen anderen Ansatz, wenn Sie bestimmte Verwendungszwecke der Funktionen einer Abhängigkeit verhindern möchten (z. B. das Aufrufen bestimmter Funktionen, die mit dem Rest Ihres Codes nicht gut funktionieren), insbesondere, wenn Sie die Abhängigkeit nicht kontrollieren: Lassen Sie Ihre Codierungsstandards verbieten Ich rate von der Verwendung dieser Funktionen ab und füge Ihrem Linter Überprüfungen hinzu.
Jedes von diesen ist unter verschiedenen Umständen anwendbar.