PEP 350 – Codetags
- 作者:
- Micah Elliott <mde at tracos.org>
- 状态:
- 已拒绝
- 类型:
- 信息性
- 创建日期:
- 27-Jun-2005
- 发布历史:
- 10-Aug-2005, 26-Sep-2005
拒绝通知
此 PEP 已被拒绝。尽管社区可能对此感兴趣,但没有意愿使标准库遵循此标准。
摘要
此信息性 PEP 旨在为一致使用codetags提供指导,这将有助于构建标准实用程序来利用 codetag 信息,并使 Python 代码在不同项目之间更加统一。Codetags 还代表了一种非常轻量级的编程微范式,对于项目管理、文档、变更跟踪和项目健康监控非常有用。将其提交为 PEP 是因为它的一些想法被认为是 Pythonic 的,尽管这些概念并非 Python 编程所独有。本文档定义了 codetags、它们背后的理念、对标准化约定的动机、一些示例、一个规范、一个工具集描述以及对 Codetag 项目/范式可能的反对意见。
此 PEP 也作为一个 wiki 存在,供人们添加评论。
理念
如果您认同其中大多数价值观,那么 codetags 很可能对您有用。
- 应将尽可能多的信息放在源代码中(应用程序代码或单元测试)。这与使用 codetags 一起可以防止重复。大多数文档都可以从该源代码生成;例如,通过使用 help2man、man2html、docutils、epydoc/pydoc、ctdoc 等。
- 信息应几乎从不重复——应以单一的原始格式记录,所有其他位置应自动从原始位置生成,或仅被引用。这通常被称为单一真相来源(SPOT)或不要重复自己(DRY)规则。
- 进入客户手中的文档应自动生成从单一来源到所有其他输出格式。人们希望以多种形式获得文档。因此,拥有一个能够生成所有这些文档的文档系统很重要。
- 开发人员就是文档团队。他们编写代码,并且应该最了解代码。对于任何非大型项目,不应有专门的、独立的文档团队。
- 纯文本(带有非侵入性标记)是编写任何内容的最佳格式。所有其他格式都应从纯文本生成。
Codetag 的设计受到了以下目标的影响
- 注释应尽可能简短。
- Codetag 字段应该是可选的,并且长度最小。默认值和自定义字段可以由各个代码商店设置。
- Codetags 应极简。 jot 下某事的速度越快,jot 下的可能性就越大。
- codetags 最常见的用法只有零到两个字段,这些字段应该最容易键入和阅读。
动机
- 围绕 codetags 可以构建各种生产力工具。
请参阅 工具。
- 鼓励一致性。
历史上,这些 codetags 的一个子集已在大多数现有源代码(无论是 Python 还是其他语言)中非正式使用。标签的使用方式不一致,拼写、语义、格式和位置各不相同。例如,一些程序员可能包含日期戳和/或用户标识符,限制为单行或不限制,codetag 的拼写方式与其他程序员不同,等等。
- 鼓励遵守 SPOT/DRY 原则。
例如,动态地从 codetags 生成路线图,而不是让 TODO 与单独的路线图文档保持同步。
- 易于记忆。
所有 codetags 都必须简洁、直观,并且在语义上与其他 codetags 不重叠。格式也必须简单。
- 使用不是强制/必需的。
如果您还不使用 codetags,则没有义务开始使用,也没有影响代码的风险(但请参阅 反对意见)。可以采用一小部分 codetags,并且 工具 仍然有用(可能已经在临时的基础上采用了几个 codetags)。此外,识别和删除(以及可能记录)不再被认为有用的 codetag 非常容易。
- 提供代码的全局视图。
可以使用工具生成文档和报告。
- 捕获 CRC/故事/需求的一个逻辑位置。
XP 社区通常不以电子方式捕获故事,但 codetags 似乎是查找它们的一个好地方。
- 极度轻量级的流程。
为每一个想法创建跟踪系统中的票证会降低开发速度。即使采用了票证系统,codetags 对于简单地包含指向这些票证的链接也很有用。
示例
这显示了一个简单的 codetag,正如在各种源代码中常见的(添加了一个尾随的 <>
)
# FIXME: Seems like this loop should be finite. <>
while True: ...
以下人为的例子演示了 codetags 的典型用法。它使用了一些可用字段来指定分配者(一对程序员,首字母缩写为MDE和CLE)、预期完成日期(第 14 周)以及项目的优先级(2)
# FIXME: Seems like this loop should be finite. <MDE,CLE d:14w p:2>
while True: ...
此 codetag 显示了一个 bug,其中包含描述作者、发现(起源)日期、到期日期和优先级的字段
# BUG: Crashes if run on Sundays.
# <MDE 2005-09-04 d:14w p:2>
if day == 'Sunday': ...
以下是演示如何不使用 codetags 的方法。这有很多问题:1)Codetags 不能与代码共享一行;2)助记符后缺少冒号;3)引用 codetags 的 codetag 通常是无用的,而且更糟糕的是,它无法完成;4)对于一个微不足道的 codetag,不需要有一堆字段;5)不应使用具有未知值的字段(t:XXX
)
i = i + 1 # TODO Add some more codetags.
# <JRNewbie 2005-04-03 d:2005-09-03 t:XXX d:14w p:0 s:inprogress>
规范
这描述了格式:语法、助记符名称、字段和语义,以及单独的 DONE 文件。
通用语法
每个 codetag 都应包含在一个注释中,并且可以占用任意多行。它不应与代码共享一行。它应该与周围代码的缩进相匹配。codetag 的结束由一对尖括号 <>
标记,其中包含可选字段,这些字段不得跨越多行。更推荐使用 #
注释而不是字符串注释来放置 codetag。每个 codetag 可以有多个字段,所有这些字段都是可选的。
简而言之,一个 codetag 由一个助记符、一个冒号、注释文本、一个开头的尖括号、一个可选的字段列表和一个结尾的尖括号组成。例如,
# MNEMONIC: Some (maybe multi-line) commentary. <field field ...>
助记符
下面列出了感兴趣的 codetags,格式如下
推荐 助记符 (和 同义词 列表)
TODO (MILESTONE, MLSTN, DONE, YAGNI, TBD, TOBEDONE)
- 待办事项:待完成的非正式任务/功能。
FIXME (XXX, DEBUG, BROKEN, REFACTOR, REFACT, RFCTR, OOPS, SMELL, NEEDSWORK, INSPECT)
- 待修正:需要重构或清理的有问题的或丑陋的代码区域。
BUG (BUGFIX)
- Bug:在 bug 数据库中跟踪的已报告缺陷。
NOBUG (NOFIX, WONTFIX, DONTFIX, NEVERFIX, UNFIXABLE, CANTFIX)
- 将不会修复:已知但由于设计问题或领域限制而永远不会解决的问题。
REQ (REQUIREMENT, STORY)
- 需求:满足特定的正式需求。
RFE (FEETCH, NYI, FR, FTRQ, FTR)
- 增强请求:尚未实现的路线图项目。
IDEA
- 想法:可能的 RFE 候选,但比 RFE 更不正式。
??? (QUESTION, QUEST, QSTN, WTF)
- 问题:误解的细节。
!!! (ALERT)
- 警报:需要立即关注。
HACK (CLEVER, MAGIC)
- 技巧:临时代码,用于强制不灵活的功能,或仅用于测试更改,或作为已知问题的变通方法。
PORT (PORTABILITY, WKRD)
- 可移植性:特定于操作系统、Python 版本等的变通方法。
CAVEAT (CAV, CAVT, WARNING, CAUTION)
- 注意事项:实现细节/陷阱,这些陷阱因不直观而突出。
NOTE (HELP)
- 笔记:代码审阅者发现需要讨论或进一步调查的部分。
常见问题
- 常见问题解答:需要外部解释的有趣领域。
GLOSS (GLOSSARY)
- 词汇表:项目词汇表的定义。
SEE (REF, REFERENCE)
- 参见:指向其他代码、网页链接等的指针。
TODOC (DOCDO, DODOC, NEEDSDOC, EXPLAIN, DOCUMENT)
- 需要文档:仍需要记录的代码区域。
CRED (CREDIT, THANKS)
- 致谢:对外部启蒙的贡献的认可。
STAT (STATUS)
- 状态:此文件成熟度的文件级统计指标。
RVD (REVIEWED, REVIEW)
- 已审阅:文件级指标,表示已进行审阅。
文件级 codetags 可能更适合作为修订控制系统中的属性,但仍可作为 codetag 正确指定。
其中一些是临时的(例如 FIXME
),而另一些是持久的(例如 REQ
)。选择助记符而不是同义词基于三个标准:描述性、长度(越短越好)、常用。
在 FIXME
和 XXX
之间选择很困难。XXX
似乎更常见,但描述性差得多。此外,XXX
是代码中具有未知值的占位符。因此 FIXME
是首选拼写。Sun 表示 XXX
和 FIXME
略有不同,XXX
的严重性更高。然而,在关于这个话题几十年的混乱中,以及数百万不会受到 Sun 影响的开发人员,很容易正确地将它们视为同义词。
DONE
始终是已完成的 TODO
项,但这应该通过修订控制系统和/或完成记录机制(参见 DONE 文件)来指示。
计算 NOTE
标签可能是一个有用的指标:高计数可能表明设计(或其他)问题。但当然,大多数 codetags 都表示需要关注的代码区域。
一个 FAQ
可能更适合在 wiki 中记录,用户可以更轻松地查看和贡献。
字段
所有字段都是可选的。本文档将描述建议的标准字段。请注意,大写的字段字符意图被替换。
发起人/分配人和起源日期/周字段是最常见的,通常不需要前缀。
这份长长的字段列表可能会吓跑人们(目标是极简主义者)而放弃使用 codetags,但请记住,这些字段的存在只是为了支持两种类型的程序员:1)喜欢将 BUG
或 RFE
codetags 保持完整形式;或 2)将 codetags 用作他们完整且唯一的跟踪系统。换句话说,其中许多字段将很少使用。它们主要来自行业范围内的约定,示例来源包括 GCC Bugzilla 和 Python 的 SourceForge 跟踪系统。
AAA[,BBB]...
- 发起人或分配人的首字母缩写列表(上下文决定是哪个,除非两者都应存在)。使用用户名,如
MicahE
而不是首字母缩写也是可以的。首字母缩写(大写)是首选形式。 a:AAA[,BBB]...
- 分配人首字母缩写列表。仅在(罕见的)情况下需要,即 codetag 同时具有分配人和发起人,且两者不同。否则,会省略
a:
前缀,上下文决定意图。例如,FIXME
通常有一个分配人,而NOTE
通常有一个发起人,但如果一个FIXME
是由审阅者发起(并用首字母缩写注明)的,那么分配人的首字母缩写就需要a:
前缀。 YYYY[-MM[-DD]]
或WW[.D]w
- 起源日期,表示注释添加的时间,采用 ISO 8601 格式(仅限数字和连字符)。或起源周,指定起源日期的替代形式。可以单独指定星期几。需要
w
后缀来区分日期。 d:YYYY[-MM[-DD]]
或d:WW[.D]w
- 到期日期 (d) 目标完成(估计)。或到期周 (d),指定到期日期的替代方法。
p:N
- 优先级 (p)级别。范围(N)为 0..3,3 为最高。0..3 分别对应低、中、高和紧急/关键。严重性字段可以合并到这个单一数字中,并且建议这样做,因为同时拥有两者会受到不同解释的影响。范围和顺序应该是可自定义的。此字段的存在对于任何对 codetags 进行分类的工具都很重要。因此,应支持(可自定义的)默认值。
t:NNNN
- 跟踪器 (t)编号,对应于单独跟踪系统中的关联票证 ID。
以下字段也可用,但预计不太常见。
c:AAAA
- 类别 (c),表示受此项影响的特定区域。
s:AAAA
- 状态 (s),表示项的状态。例如,“未探索”、“已理解”、“进行中”、“已修复”、“已完成”、“已关闭”。请注意,当一项完成时,最好删除 codetag 并将其记录在 DONE 文件中。
i:N
- 开发周期迭代 (i)。用于将 codetags 分组到完成目标组。
r:N
- 开发周期发布 (r)。用于将 codetags 分组到完成目标组。
总而言之,无前缀字段是首字母缩写和起源日期,而带前缀的字段是:分配人(a)、到期(d)、优先级(p)、跟踪器(t)、类别(c)、状态(s)、迭代(i)和发布(r)。
应允许团队定义或添加自己的字段,并且这些字段应具有大写前缀,以将其与标准集区分开。自定义字段的示例包括操作系统 (O)、严重性 (S)、受影响版本 (A)、客户 (C) 等。
DONE 文件
某些 codetags 可以被完成(例如 FIXME
、TODO
、BUG
)。保留已完成的项目并通过记录它们带有完成日期戳来保留它们通常很重要。此类已完成的项目最好存储在一个全局项目(或包)的单一位置。建议的格式最容易通过示例来描述,例如 ~/src/fooproj/DONE
# TODO: Recurse into subdirs only on blue
# moons. <MDE 2003-09-26>
[2005-09-26 Oops, I underestimated this one a bit. Should have
used Warsaw's First Law!]
# FIXME: ...
...
您可以看到 codetag 是从原始源文件逐字复制的。日期戳然后输入下一行,并带有可选的事后评论。条目以空行(\n\n
)终止。
每次完成一个 codetag 时都必须删除 codetag 行,这听起来可能很麻烦。但实际上,设置 Vim 或 Emacs 映射以自动以这种格式(不含评论)记录 codetag 删除非常容易。
工具
当前,程序员(有时还有分析师)通常使用grep来生成对应于单个 codetag 的项目列表。然而,各种假设的生产力工具可以利用一致的 codetag 格式。以下是一些示例工具。
- 文档生成器
- 可能的文档:词汇表、路线图、man pages
- Codetag 历史记录
- 跟踪(通过修订控制系统接口)代码段中
BUG
标签(或任何 codetag)的起源/解决时间 - 代码统计
- 项目健康指示器
- Codetag Lint
- 通知 codetags 的无效使用,并协助迁移到 codetags
- 故事管理器/浏览器
- 一种电子方式来替代 XP 便签卡。在 MVC 术语中,codetag 是模型,故事管理器可以是图形化查看器/控制器,用于进行可视化重排、优先级排序和分配、里程碑管理。
- 任何文本编辑器
- 用于更改、删除、添加、重新排列、记录 codetags。
已经存在一些工具利用了一组较小的伪 codetags(请参阅 参考文献)。还有一个正在进行的 codetags 实现示例,称为 Codetag Project。
反对意见
- 反对意见:
- 极限编程认为不应在代码中存在此类 codetags,因为代码就是文档。
- 辩护:
- 也许您应该将 codetags 放在单元测试文件中。此外,从未注释的代码生成文档非常困难。
- 反对意见:
- 现有的代码太多未遵循建议的准则。
- 辩护:
- [简单] 实用工具(ctlint)可以转换现有代码。
- 反对意见:
- 导致与跟踪系统重复。
- 辩护:
- 并非如此,除非字段被滥用。如果一个项目存在于跟踪器中,codetag 的跟踪器字段中的简单票证编号就足够了。也许重复的标题是可以接受的。此外,为开发者随想随想的每一项都创建一个票证太麻烦了。此外,对于适合将相关数据放入 codetag 的简单或小型项目,跟踪系统可能会被淘汰。
- 反对意见:
- Codetags 很难看,并且会弄乱代码。
- 辩护:
- 这是一个很好的观点。但我仍然宁愿将此类信息放在一个地方(源代码)而不是各种其他文档中,这些文档可能会重复或被遗忘。已完成的 codetags 可以发送到 DONE 文件,或发送到垃圾桶。
- 反对意见:
- Codetags(以及所有注释)都会过时。
- 辩护:
- 如果其他来源(外部可见文档)依赖于它们的准确性,则不会有太多过时。
- 反对意见:
- Codetags 很少有任何形式的估计完成日期。好的,字段是可选的,但您想建议那些确实会被广泛使用的字段。
- 辩护:
- 如果一个项目无法估算,则不要费心指定日期字段。使用工具按到期日期和/或优先级对项目进行排序和/或着色,更容易进行估算。让您的路线图成为 codetags 的动态反映,会使您更有可能保持 codetags 的准确性。
- 反对意见:
- 应在
<>
中使用字段参数的命名变量,而不是使用隐晦的单字符前缀。即,<MDE p:3> 应该写成 <author=MDE, priority=3>。 - 辩护:
- 拼写出字段的输入/冗余太多。我认为
p:3 i:2
与priority=3, iteration=2
一样易读,并且更有可能被输入和记住(参见 理念 中的项目 C)。在这种情况下,实用性胜过纯粹性。需要跟踪的字段不多,因此单字母前缀是合适的。
- 反对意见:
- 应弃用同义词,因为最好只有一种拼写方式。
- 辩护:
- 许多程序员偏爱简短的助记符,尤其是在注释中。这就是选择简短助记符作为主要名称的原因。然而,其他人认为明确的拼写不易引起混淆且不易出错。关于这个问题,总会有两个阵营。因此,应继续支持同义词(以及完整的拼写)。
- 反对意见:
- 使用(对于助记符)不透明的缩写和省略元音的缩写是很残酷的,很难弄清楚这些东西。基于这一点,我讨厌:MLSTN RFCTR RFE FEETCH, NYI, FR, FTRQ, FTR WKRD RVDBY
- 辩护:
- 助记符是首选,因为它们很容易记住,并且占用的空间更少。如果程序员不喜欢省略元音,我们就无法在一行中容纳太多代码。对于那些写单行注释的人来说,空间很重要。但是,当随处使用同一个助记符时,将某项内容放在一行上的可能性就大大降低了。
- 反对意见:
- 输入字段花费太长时间。
- 辩护:
- 那么不要使用(其中大部分或全部)它们,特别是如果你是唯一的程序员。用
<>
终止 codetag 是件小事,通过这样做,您就可以使用建议的工具。编辑器对 codetags 的自动完成也很有用:您可以对编辑器进行编程,使其仅用一两个按键就能生成一个模板(例如# FIXME . <MDE {date}>
)。
- 反对意见:
- 工作周是一个模糊且不常见的计时单位。
- 辩护:
- 这是真的,但它是一个高度适合用于估算/定位目的的粒度单位,并且非常紧凑。 ISO 8601 被广泛理解,但它只允许您指定一个特定的日期(限制性)或月份(广泛性)。
- 反对意见:
- 我从美学上不喜欢在字段为空的情况下用 <> 结束注释。
- 辩护:
- 有必要有一个终止符,因为 codetags 可能后面跟着非 codetag 的注释。或者 codetags 可以限制为单行,但这会产生限制。我想不出任何恰当且明显优于 <> 的单字符终止符。也许
@
可以作为终止符,但那样大多数 codetags 都会有一个不必要的 @。
- 反对意见:
- 我无法在编写 HTML 或更具体地说 XML 时使用 codetags。也许
@fields@
会比<fields>
作为分隔符更好。 - 辩护:
- 也许你是对的,但
<>
在适用时看起来更美观。XML/SGML 可以使用@
,而更常见的编程语言则坚持使用<>
。
参考资料
一些其他工具也尝试定义/利用 codetags。请参阅 http://tracos.org/codetag/wiki/Links。
来源:https://github.com/python/peps/blob/main/peps/pep-0350.rst