robertology / todo_or_die

代码腐化致命提醒

2.1.0 2022-10-01 19:26 UTC

This package is auto-updated.

Last update: 2024-09-29 06:14:57 UTC


README

代码腐化致命提醒。

将您的 // @todo 注释替换为更实用的内容。此库将在适当的时候将这些内容置于您面前。是的,“或死亡”意味着 如果条件满足,将抛出异常

为什么??

我知道你在想什么:为什么有人会故意导致失败?

主要思想是您应该在测试中遇到这些情况,而不是在生产中。但它们 确实 会出现在生产中,没有什么比屁股下面有点火更能让你完成工作了。(但请继续阅读,了解如何不破坏生产)

是的,这有点严厉,但尝试在您的代码库中运行 grep -ri '@todo' . | wc -l 并看看有多少只是在那里被忽视。面对现实,“以后再说”等于永远不会。没有人会查看这些 todo,您的代码只是在腐烂。

给那些“暂时”和“下个版本”的事情设定一个真实的、可操作的最后期限。

安装

composer require robertology/todo_or_die

对于 PHP 7.4,安装版本 1,并阅读该版本的 README 以获取使用说明。

(composer require robertology/todo_or_die:^1)

使用方法

(string $todo_message, bool|Check $check, callable $callable_for_alerting = null)

使用模式

  1. 死亡
new Todo($todo_message, $check_to_die);
  1. 警告
new Todo($todo_message, $check_to_alert, $callable_for_alerting);
  1. 死亡或警告
(new Todo($todo_message, $check_to_die))
  ->alertIf($check_to_alert, $callable_for_alerting);

不死亡

通过设置环境变量 TODOORDIE_SKIP_DIE 为一个 truthy 值来确保“或死亡”部分永远不会发生。这将导致仅触发警告。忽略任何死亡条件。(提示:这可能是生产中的明智之举)

putenv('TODOORDIE_SKIP_DIE=1');

警告节流

为了避免饱和您的警报系统,内置了节流功能(仅针对警告,不针对死亡)。每个 Todo 应每小时警报一次。通过设置环境变量 TODOORDIE_ALERT_THRESHOLD 为所需的秒数来更改此设置。通过将其设置为零来禁用节流。

// Once per day
putenv('TODOORDIE_ALERT_THRESHOLD=86400');
// Disabled (alert every time)
putenv('TODOORDIE_ALERT_THRESHOLD=0');

示例

use Robertology\TodoOrDie\Todo;
use Robertology\TodoOrDie\Check\Dates as DateCheck;

// Die only
new Todo(
  'Remove after the old jobs have attritioned out',
  new DateCheck(strtotime('1 jan 2024'))
);

// Alert only
// Note the use of fromString() which gives the same result as strtotime() above
new Todo(
  'Remove after the old jobs have attritioned out',
  DateCheck::fromString('1 jan 2024'),
  [$logger, 'warning']
);

// A couple Alerts before we Die
(new Todo('Remove after the old jobs have attritioned out', DateCheck::fromString('1 jan 2024')))
  ->alertIf(DateCheck::fromString('22 dec 2023'), [$logger, 'warning'])
  ->alertIf(time() >= strtotime('27 dec 2023'), $my_slack_callable);
//           ^ the constructor and alertIf() can take a Check object or boolean

备注

  • 我在示例中使用了 strtotime() 以提高可读性,但 不要 使用相对日期,如 strtotime('+2 months'),因为它将每次都进行评估,“从现在起两个月后”永远不会到来,因为“现在”一直在移动。

  • 警告节流使用放置在 PHP 的临时目录(sys_get_temp_dir())中的文件,这可能会偶尔发生垃圾收集,但很可能会为此工作得很好。

  • 名称是从 ruby gem searls/todo_or_die)无耻地窃取的。

  • The Changelog (第 463 集) 致敬,我在那里首次听到这个想法。

个人目标

除了有一个实际工作的工具之外,我还有几个自己对这个项目的目标。

  1. 全 TDD (测试驱动开发)
    • 测试是行为和功能测试的混合,对于这个小项目来说,我对此感到满意。
    • 我不关心 100% 的覆盖率,但所有行为都应该有一个测试。
  2. SOLID "极端化"
    • 在得到一个可工作的版本之后,我继续重构,关注 SOLID 原则。
    • 这样一个简单的概念可以用一个类来编写,但在这里非常严格是一种很好的练习,用于定义 单一 责任。

许可证

本项目采用MIT许可证进行许可。