思考此问题的一种方法是您所指的时间/日期?计算机不知道这些概念是什么:它们必须以某种方式进行编程。这是很常见的代表在“自纪元秒”的UNIX格式的时间,这是常见的通过OS调用养活一个特定的值到程序。但是,无论这种用法有多么普遍,重要的是要记住,这不是“实际”时间:它只是逻辑表示。
正如其他人指出的那样,如果您使用此机制创建了“最后期限”,则在不同的时间投入并打破该“最后期限”是微不足道的。对于更复杂的机制(例如询问NTP服务器)(甚至通过“安全”连接,因为我们可以替换自己的证书,证书颁发机构甚至修补加密库),也是如此。乍一看,这些人似乎在为您的机制工作上有过错,但可能是出于充分的理由自动完成了。例如,拥有可复制的build是一个好主意,而有助于此的工具可能会自动重置/拦截此类不确定的系统调用。libfaketime正是这样做的,将所有文件的时间戳设置为1970-01-01 00:00:01
,Qemu的记录/重播功能会伪造所有硬件交互作用,等等。
这类似于古德哈特定律:如果您使程序的行为取决于逻辑时间,那么逻辑时间就不再是“实际”时间的良好度量。换句话说,人们通常不会弄乱系统时钟,但是如果您给他们理由,他们会的。
时间还有其他逻辑表示形式:时间之一是软件的版本(您的应用程序或某些依赖项)。这比UNIX时间更适合作为“最后期限”表示,因为它更特定于您关心的事情(更改功能集/ API),因此不太可能践踏正交问题(例如,将UNIX时间摆弄到在截止日期前工作可能会破坏日志文件,cron作业,缓存等)。
正如其他人所说,如果您控制库并希望“推送”此更改,则可以推送一个不推荐使用该功能的新版本(引起警告,以帮助消费者找到并更新其用法),然后另一个新版本删除该功能。完全功能。如果愿意,您可以立即将它们彼此立即发布,因为(再次)版本只是时间的逻辑表示,因此它们不必与“实际”时间相关。语义版本控制可能会有所帮助。
替代模型是“拉”更改。这就像您的“计划B”:将测试添加到使用中的应用程序,该应用程序检查此依赖项的版本至少为新值。与往常一样,红色/绿色/重构可通过代码库传播此更改。如果功能不是“不好”或“错误”,而只是“不适合此用例”,则这可能更合适。
“拉”方法的一个重要问题是,依赖项版本是否算作“(功能)的单位” ,因此值得进行测试;还是仅仅是“私有”实现细节,都应该作为实际的(功能)单元测试的一部分来执行。我会说:如果依赖项版本之间的区别确实算作您应用程序的功能,则进行测试(例如,检查Python版本> = 3.x)。如果没有,那就不要添加测试(因为它将是脆弱的,缺乏信息性的并且过于严格);如果您控制该库,则走“推”路线。如果您不控制库,则只需使用提供的任何版本即可:如果您的测试通过,则不值得限制自己;如果他们不及格,那就是您的“截止日期”!
还有一种方法,如果您想阻止对依赖项功能的某些使用(例如,调用某些无法与其余代码完美配合的功能),尤其是在您无法控制依赖项的情况下:请禁止使用编码标准/不鼓励使用这些功能,并将检查添加到您的短毛猫中。
这些都将适用于不同的情况。