Một cách để nghĩ về điều này là những gì bạn có nghĩa là theo thời gian / ngày ? Máy tính không biết những khái niệm này là gì: chúng phải được lập trình bằng cách nào đó. Nó khá phổ biến để biểu thị thời gian theo định dạng UNIX của "giây kể từ thời đại" và thông thường để cung cấp một giá trị cụ thể vào chương trình thông qua các cuộc gọi của hệ điều hành. Tuy nhiên, cho dù mức độ sử dụng phổ biến này như thế nào, điều quan trọng cần nhớ là đó không phải là thời gian "thực tế": nó chỉ là một biểu diễn logic.
Như những người khác đã chỉ ra, nếu bạn thực hiện một "thời hạn" bằng cách sử dụng cơ chế này, thì việc cho ăn trong một thời điểm khác và phá vỡ "thời hạn" đó là chuyện nhỏ. Điều tương tự cũng xảy ra đối với các cơ chế phức tạp hơn như yêu cầu máy chủ NTP (thậm chí qua kết nối "an toàn", vì chúng ta có thể thay thế chứng chỉ của chính mình, cơ quan cấp chứng chỉ hoặc thậm chí vá các thư viện tiền điện tử). Lúc đầu, có vẻ như các cá nhân đó có lỗi khi làm việc xung quanh cơ chế của bạn, nhưng có thể đó là trường hợp được thực hiện tự động và vì lý do chính đáng . Ví dụ: nên có các bản dựng có thể lặp lại và các công cụ để giúp việc này có thể tự động đặt lại / chặn các cuộc gọi hệ thống không xác định như vậy. libfaketime thực hiện chính xác điều đó,đặt tất cả dấu thời gian của tệp thành 1970-01-01 00:00:01
, tính năng ghi / phát lại của Qemu làm giả mọi tương tác phần cứng, v.v.
Điều này tương tự như luật của Goodhart : nếu bạn thực hiện hành vi của chương trình phụ thuộc vào thời gian logic, thì thời gian logic sẽ không còn là thước đo tốt cho thời gian "thực tế". Nói cách khác, mọi người thường sẽ không gây rối với đồng hồ hệ thống, nhưng họ sẽ làm nếu bạn cho họ một lý do.
Có những cách biểu thị logic khác về thời gian: một trong số đó là phiên bản của phần mềm (ứng dụng của bạn hoặc một số phụ thuộc). Đây là một đại diện mong muốn cho "thời hạn" hơn là thời gian UNIX, vì nó cụ thể hơn với điều bạn quan tâm (thay đổi bộ tính năng / API) và do đó ít có khả năng chà đạp lên các mối quan tâm trực giao (ví dụ như thay đổi thời gian UNIX thành làm việc xung quanh thời hạn của bạn có thể sẽ phá vỡ các tệp nhật ký, công việc định kỳ, bộ nhớ cache, v.v.).
Như những người khác đã nói, nếu bạn kiểm soát thư viện và muốn "thúc đẩy" thay đổi này, bạn có thể đẩy một phiên bản mới làm mất tính năng (gây ra cảnh báo, để giúp người tiêu dùng tìm và cập nhật việc sử dụng), sau đó một phiên bản mới khác sẽ loại bỏ tính năng hoàn toàn. Bạn có thể xuất bản chúng ngay lập tức sau khi bạn thích, vì (một lần nữa) phiên bản chỉ là sự thể hiện logic của thời gian, chúng không cần phải liên quan đến thời gian "thực tế". Phiên bản ngữ nghĩa có thể giúp ở đây.
Mô hình thay thế là "kéo" sự thay đổi. Điều này giống như "kế hoạch B" của bạn: thêm một bài kiểm tra vào ứng dụng tiêu thụ, kiểm tra xem phiên bản của sự phụ thuộc này ít nhất là giá trị mới. Như thường lệ, red / green / refactor để truyền sự thay đổi này thông qua cơ sở mã. Điều này có thể phù hợp hơn nếu chức năng không "xấu" hoặc "sai", nhưng chỉ là "phù hợp xấu cho trường hợp sử dụng này".
Một câu hỏi quan trọng với phương pháp "kéo" là liệu phiên bản phụ thuộc có được tính là "đơn vị" ( của chức năng ) hay không, và do đó xứng đáng được thử nghiệm; hoặc cho dù đó chỉ là một chi tiết triển khai "riêng tư", chỉ nên được thực hiện như một phần của các bài kiểm tra đơn vị thực tế ( về chức năng ). Tôi muốn nói: nếu sự khác biệt giữa các phiên bản của phụ thuộc thực sự được tính là một tính năng của ứng dụng của bạn, thì hãy thực hiện kiểm tra (ví dụ: kiểm tra xem phiên bản Python có> = 3.x) không. Nếu không, thì đừngthêm bài kiểm tra (vì nó sẽ dễ vỡ, không chính xác và quá hạn chế); nếu bạn điều khiển thư viện thì đi xuống tuyến đường "đẩy". Nếu bạn không kiểm soát thư viện thì chỉ cần sử dụng bất kỳ phiên bản nào được cung cấp: nếu các bài kiểm tra của bạn vượt qua thì không đáng để tự giới hạn; nếu họ không vượt qua thì đó là "thời hạn" của bạn ngay tại đó!
Có một cách tiếp cận khác, nếu bạn muốn không khuyến khích sử dụng một số tính năng của phụ thuộc (ví dụ: gọi một số chức năng nhất định không hoạt động tốt với phần còn lại của mã), đặc biệt nếu bạn không kiểm soát phụ thuộc: cấm các tiêu chuẩn mã hóa của bạn / không khuyến khích việc sử dụng các tính năng này và thêm kiểm tra cho chúng cho kẻ nói dối của bạn.
Mỗi trong số này sẽ được áp dụng trong các trường hợp khác nhau.