これについて考える1つの方法は、あなたが時間/日付で意味するものですか?コンピューターは、これらの概念が何であるかを知りません。何らかの方法でプログラムする必要があります。「エポックからの秒数」というUNIX形式で時間を表すことは非常に一般的であり、OS呼び出しを介してプログラムに特定の値を供給することは一般的です。ただし、この使用方法がどれほど一般的であっても、「実際の」時間ではなく、単なる論理的な表現であることに留意することが重要です。
他の人が指摘しているように、このメカニズムを使用して「デッドライン」を作成した場合、別の時間にフィードしてその「デッドライン」を破ることは簡単です。同じことは、NTPサーバーに問い合わせるなど、より複雑なメカニズムにも当てはまります(独自の証明書、認証局、または暗号ライブラリにパッチを適用できるため、「安全な」接続でも)。最初は、そのような個人はあなたのメカニズムを回避することに責任があると思われるかもしれませんが、それは自動で正当な理由で行われる場合があります。たとえば、再現可能なビルドを使用することをお勧めします。これを支援するツールを使用すると、このような非決定的なシステムコールを自動的にリセット/インターセプトできます。libfaketimeはまさにそれを行い、すべてのファイルのタイムスタンプをに設定し1970-01-01 00:00:01
、Qemuの記録/再生機能はすべてのハードウェアの相互作用などを偽装します。
これはグッドハートの法則に似ています。プログラムの動作を論理時間に依存させると、論理時間は「実際の」時間の適切な尺度ではなくなります。言い換えれば、人々は一般的にシステムクロックを台無しにしませんが、理由を与えれば彼らはそうします。
時間の論理的な表現は他にもあります。それらの1つはソフトウェアのバージョン(アプリまたは依存関係)です。これは、たとえばUNIX時間よりも「期限」の方が望ましい表現です。なぜなら、それは関心のあるもの(機能セット/ APIの変更)に固有であり、したがって、直交する懸念を踏みにじる可能性が低いためです(たとえば、UNIX時間をいじる締め切りを回避すると、ログファイル、cronジョブ、キャッシュなどが破損する可能性があります。
他の人が言ったように、ライブラリを制御してこの変更を「プッシュ」したい場合は、機能を非推奨にする新しいバージョンをプッシュして(警告を発生させ、消費者が使用方法を見つけて更新するのを助ける)、その後、完全に機能します。必要に応じて、これらを次々に公開できます。(再び)バージョンは単なる時間の論理的な表現であり、「実際の」時間に関連する必要はありません。ここでセマンティックバージョニングが役立つ場合があります。
代替モデルは、変更を「プル」することです。これは「プランB」のようなものです。消費アプリケーションにテストを追加し、この依存関係のバージョンが少なくとも新しい値であることを確認します。いつものように、赤/緑/リファクタリングにより、コードベースを介してこの変更を伝播します。これは、機能が「悪い」または「間違っている」のではなく、「このユースケースに合わない」場合に適しています。
「プル」アプローチの重要な問題は、依存関係のバージョンが「機能」の「ユニット」としてカウントされるかどうかであり、したがってテストに値するかどうかです。または、それが単なる「プライベート」な実装の詳細であるかどうか。これは、実際のユニット(機能)テストの一部としてのみ実行する必要があります。依存関係のバージョン間の区別が実際にアプリケーションの機能としてカウントされる場合は、テストを実行します(たとえば、Pythonバージョンが3.x以上であることを確認します)。そうでない場合は、しないでくださいテストを追加します(脆弱で、情報量が少なく、制限が厳しすぎるため)。ライブラリを制御する場合は、「プッシュ」ルートを使用します。ライブラリを制御しない場合は、提供されているバージョンを使用してください。テストに合格した場合、自分で制限する価値はありません。彼らが合格しなければ、それがまさにあなたの「期限」です!
依存関係の機能の特定の使用(たとえば、コードの残りの部分でうまく機能しない特定の関数の呼び出し)を思いとどまらせたい場合、特に依存関係を制御しない場合は、別のアプローチがあります。コーディング標準を禁止してくださいこれらの機能の使用を/ discourageし、それらのチェックをリンターに追加します。
これらはそれぞれ異なる状況に適用されます。