我正在从事一个相当大的项目,并承担了为它做一些翻译的任务。有很多标签没有被翻译,当我浏览代码时,我发现了这小段代码。这些注释对自己(以及其他人?)的影响,因为我感到大多数开发人员在完成了一段代码后便会执行应做的事情,因此他们在维护或添加新功能之前从未考虑过。这样一来,TODO就会丢失很长时间。

评论

(某些)IDE跟踪这些。当我还没有完全完善模块的实现,但是对于我(或其他人)可以继续开发其他相关模块的合同感到满意时,我会自由使用它们。
对我而言,TODO更像是“应该做优化,但不必运送”

每当我想到要完成的任务或需要针对当前功能进行检查时,都会停止正在编写的内容(即使是中间陈述),并为其添加待办事项(即使这就是上面的行)。这有助于防止出现“哦,是的,我什至想到了”的错误。提交功能之前,请检查TODO。他们从来没有犯过错,但是自从我开始这样做以来,我的错误数量就大大减少了。

我总是使用#warning TODO:…如果我不想忘记TODO。

@WTP:Visual Studio,R#,Netbeans,Eclipse等。所有这些都包括用于查看解决方案/工作区中所有TODO的工具。不再需要那种旧的技巧。

#1 楼

我倾向于对必须发生的事情使用// todo注释,但是我不能立即这样做。

但是,正如您所说,并不是每个人都对它们勤奋,并且像许多评论一样,它们会随着时间的流逝而腐烂。 br />
我会说这更多是个人喜好-只要您记录需要做的事情并继续进行下去,无论它在// todo,便笺还是白板中都没关系(在这种情况下,它们最终也可能不被采取行动)。

评论


Eclipse突出显示它们并为您合并它们的列表。即使您从未真正去做,只要在您脑海中想起就写TODO注释也不是一个坏主意。某些坦率的人实际上可能正在浏览代码以查找需要做的事情(OSS)。

–滚刀
2011-12-15 14:08

Resharper也有一个很好的TODO清单,它比默认的VS清单更好(在更多文件中查看)。

–CaffGeek
2011-12-15 14:56

是的,在您的IDE中列出了它们,它们会有所帮助。我要说的是,否则它们的用途非常有限,因为代码库可能很大。

–工程师
2011-12-15在16:26



由于评论腐烂,我总是约会并发表评论。如果评论是来自四个承包商的三年前的评论,则可以将其删除。

–user1936
2011-12-15 17:40

由于提到了共享工具和日期,因此我使用了一个简单的共享工具实时模板“ // TODO $ user $($ date $)-”

–深色推子
2011-12-20 18:21



#2 楼

现代的IDE能够识别TODO注释,并且它们在自己的面板/窗口/选项卡中是可见的,因此从理论上讲它们不会丢失(我在思考Eclipse和Visual Studio,我都知道他们能识别出它们)。

您甚至可以配置其他注释词,例如FIXMEBEWARE或您要自定义的其他任何内容。但是,您项目中的其他开发人员将必须以相同的方式自定义他们的IDE。

现在,我写了《理论上》,因为尽管没有丢失,但TODO经常与不需要的东西相关该应用程序“目前”可以正常工作。而“此刻”可能会持续5分钟到5年,具体取决于项目的类型/规模:-)

最后,在我看来,将它们包含在代码在正确的位置,而不是在代码之外的其他地方,恰好回答了“我应该在哪里进行更改”这个问题。并且TODO的所有者被认为是一种好习惯。

评论


我认为TODO的日期和所有者只是喧闹声。这就是版本控制(和指责功能)的用途(如果您确实需要信息)。

–sleske
2011-12-15 11:30

我认为没有维基百科说“建议”是可以引用的。闻到警报。更好地链接到声称这一点的文章。

–菲涅耳
2011-12-15 12:29



@phresnel很好,有与该“建议”相关的引文,因此我不认为需要在此重复,否则我同意以下事实:引用没有任何内容支持的维基百科事实可能很危险

–贾琳
2011-12-15 12:49

@sleske我倾向于同意保持噪音最小,但我想如果不明确编写IDE,IDE不会自动向您提供来自存储库的信息(除非我误会了,您必须手动比较版本) 。

–贾琳
2011-12-15 12:51

Visual Studio的“注释”功能使查看谁最后一次签入对您正在处理的文件的各个部分所做的更改以及更改集的方式变得容易。这并不完美,但是在许多情况下(尤其是在TODO注释中)足够接近有用。

–用户
2011-12-15 13:04

#3 楼

这可能是有道理的,至少我有时会使用它们。关键是要使用一致的标签,例如TODOFIXME,以便通过简单的文本搜索即可轻松找到它们。 :

ConnManager.getConnection("mydatabase"); // FIXME: DB name should be configurable


如果代码执行了应该执行的操作,并且没有人抱怨,那么该注释不会造成任何危害。如果有时间美化代码,则可以从搜索FIXME标签开始。

评论


“ FIXME”和“ TODO”对我来说具有不同的含义。对于我来说,翻译,硬编码值或用ex.printStacktrace()捕获异常都是TODO。另一方面,FIXME将处理有时发生的异常,内存泄漏或您已找到但尚未完全分析/修复的其他类型的错误。

–rds
2011-12-16 10:31

#4 楼

在我的行业中,鼓励开发人员创建JIRA(或其他)条目,而不要发表评论,因为不是每个人都有机会看到// todo条目。但是有时候在大型项目中,会按照以下方式定义自定义属性:

br />
[AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = true)]
public class DeveloperNote : Attribute
{
    public DateTime EntryDate { get; set; }
    public string Description { get; set; }
    public DeveloperNote(int year, int month, int day, string desc)
    {
        EntryDate = new DateTime(year, month, day);
        Description = desc;
    }
}


更高的起伏可以自动收割。对于简单的// todo提醒来说,这可能会显得有些矫kill过正,但它确实有效。它还需要一个.NET平台。

评论


将TODO注释合并为代码行。我认为,机票的全球化程度更高,层次更高。而且,我确实对此注释进行了矫an过正。 TODO有更多机会从事更多编辑工作。

–rds
2011-12-16 10:33

你的行业?那是什么我不知道整个行业都鼓励使用JIRA ?!

–菲涅耳
2014年2月7日15:55

#5 楼

根据我的经验,这取决于。主要因素是团队是否纪律严明,可以跟进这些“小”评论。如果他们这样做,那么他们是有道理的。如果他们不这样做,那么这些评论只会浪费时间,您可能需要研究其他选项,例如故事卡。

我个人有时会使用TODO注释,但它们通常寿命很短,而且我通常只有很少一部分,例如一,二或三。在代码库中,我将它们更多地用作标记。如果我等了太久才照顾他们,那么我会忘记我认为我需要做的事情。类似。对一种任务使用一种机制。

#6 楼

我过去曾经写过它们,但是我发现您通常不会跟进它们。

因此,现在我只用它们来标记我要完成的事情。忙着。例如,我实现了一个新功能,并注意到我使用的功能有一个小错误;我制作了一个FIXME来解决此问题,以避免在当前任务中出轨。

为了帮助我,如果代码中有FIXME,我们的CI版本将设置为失败:-)。 >
如果您发现无法立即解决的潜在问题,请为它们打开故障单/错误/问题。这样,可以像对待所有错误一样对它们进行优先级排序。我觉得这比在bug数据库中有一些问题以及在代码中有一些问题(如TODO)要好得多。 >

#7 楼

TODO只是评论的子形式。如果作者完全了解要传达的内容和方式,那么评论将很有用。几年后,这里也可以少量使用幽默感,以使维护者感到高兴。令我印象深刻的是,它已经投入生产并在维护中存活了16年。因此请注意,您的代码可能会持续很长时间。对意图,未来需求等进行的评论可以大大帮助从现在开始多年以来首次看到您的代码的人。

评论


如果已经存在了十多年,那么它就不是真正需要的,因此添加TODO注释毫无意义。

–用户
2011-12-15 13:43

假设它们永远不变。就像代码一样,注释可能会随着添加,删除和修改而发生变化。 TODO列表更可能以这种方式更改。我敢肯定,自从我上次接触代码以来的过去十年中,它的注释已更改。

– Pete Mancini
2011-12-24 15:43

#8 楼

如果您编写TODO或FIXME的想法是有人在不确定的将来使用该代码时,其他人将对其进行修复,那么我想说就不要打扰。他们会乱扔代码,并使收集此信息的IDE的报告部分混乱。

为了使它们有用,它们应该提供一种将代码标记为(非常)不久的将来的方法,以便您可以更快地恢复到适当的状态。换句话说,您将它们放置在代码中只是为了尽快将它们删除。

任何寿命更长的东西实际上都应该放在它所属的错误库中。生活中有足够的噪音,别再制造新的事物而引起别人的注意。

我的2美分

#9 楼

我认为TODO的评论在某种程度上是有意义的。尤其是如果您要反复工作(这在敏捷和TDD商店中很常见),那么您不久就会意识到需要一些东西,但是您不想绕开这一步就此实施。 br />
丑陋的是当这些注释保留在代码库中时。在积极地使用某项功能时,最好将它们保留下来,但是一旦您接近完成该功能,就应该着重于摆脱它们。如果您不想完成用适当的有效代码实际替换它们的工作,那么至少要考虑到相关功能。借用@JoonasPulakka的示例,其中代码最初显示为

ConnManager.getConnection("mydatabase"); // FIXME: DB name should be configurable


,您可以将其更改为类似
/>目前,GetDatabaseName()是一个存根,只返回您开始时使用的相同字符串。这样,将来就可以明确地进行扩展,并且您知道在那里进行的任何更改都会反映在需要数据库名称的任何地方。如果数据库名称是一般通用名称,则可以大大提高可维护性。

我个人使用自己的关键字而不是严格的TODO,尽管目的是相同的:标记事物我知道需要重新审视。另外,在签入代码之前,我会在全局源代码中搜索该关键字,该关键字的选择通常应使其不出现在代码中的任何位置。如果找到它,我知道我忘记了什么,可以继续进行修复。

至于在注释中包含程序员名称/签名,如果您拥有源代码版本控制系统(您知道,对吗?),我认为这太过分了。在这种情况下,其怪异功能会告诉您添加评论的人,或更准确地说是谁最后一次检查了涉及评论的更改。例如,在Visual Studio中,这可以通过使用源代码控制功能中的“注释”功能轻松实现。

#10 楼

通常我不//做TODO注释,而是将所有注释保存在单独的文件中。仍然无法找到/编写在线软件来轻松管理它们,因此TODO文件对我来说仍然是最有用的,因为即使在很短的时间后打开项目,我都忘记了现在该怎么办,然后我查看TODO文件并完成工作。我有“ filename.cpp 354:重新编码此bla bla bla”,然后在文件中搜索// TODO注释会更加有用。我懒惰的时候就做// TODO耳环,但是我只是从源文件中删除了那些旧的// TODO-s,并且在项目运行良好时不修复它们。我强烈建议将所有// TODO从源移到单独的位置,并将它们与其他待办事项保持在一起,以便您可以轻松地优先处理任务。当您将所有TODO放在各种文件和项目中时,优先级确实是一件难事。

评论


然后,在filename.cpp中插入一个新函数,在本示例的情况下,在第200行左右插入,因为发现重构某些代码很有用。突然之间,您的引用毫无意义。我更喜欢IDE向他们指出我现在的位置,而不是当我看到需要做任何东西时向他们指出的位置。

–用户
2011-12-15 13:07

是的,您是对的)有时候,我很难找到这条线,但我会处理。是的。我可以使用它们在文件或IDE中轻松查找,但要知道在单独的位置该怎么做。

–cnd
2011-12-15 13:12

#11 楼

与其他一百万种创建任务列表的方式相比,待办事项注释的巨大优势在于,待办事项注释随代码一起传播,因此它们不会分离。

可能是更合适的地方像这样的东西是问题跟踪器,而不是代码。

#12 楼

我认为那很棒,但并不孤单。例如:

//TODO: ADD MY CLICK EVENT LOGIC
throw new Exception();
//Even a simple messageBox could suffice


这种方法非常谨慎。尽管我不得不说,养成引发异常以提醒您完成一些代码的习惯并不是真正最专业的方法。但这在某些情况下为我省了一笔钱,因为您认为自己已经完成了某些工作,甚至写下了您尚未完成的工作。

评论


在那种情况下,您可以简单地抛出一个新的NotImplementedException(),这意味着一个ToDo。

– CodesInChaos
13年3月11日在10:03

在C语言中,我喜欢使用assert(0 &&“ TODO [cmaster]:添加点击事件逻辑”);。如果我忘记了TODO,向我发送消息非常简单有效。

–cmaster-恢复莫妮卡
15年11月19日在21:03

#13 楼

我强烈建议您将每个TODO或FIXME输入正式日志中。如果不是,则可以轻松搜索它们,并且应该在每次迭代中检查未完成的TODO和FIXME。然后可以对这些文件进行分类,并设置为立即补救,或者团队可以计划在适当的时间对其进行修复。解决后,如果以系统的方式进行处理,它们将失去效力。

#14 楼

如果您尝试提交具有新TODO的代码,则IntelliJ实际上会警告您。因此,您始终可以将TODO解释为“这确实应该在我提交时发生”。

#15 楼

当您将“ TODO”作为注释的语义标签时,我认为它们确实有意义。

在我公司的编码标准中,我们指定负责开发人员的姓名缩写必须包含在TODO中(即,我将输入“ SAA TODO:”)。我认为这很有用,至少是作为一个约定,因为否则有一种诱惑,那就是将不合格的代码留在TODO注释中,以供将来的开发人员使用。将这些注释添加到任务列表中,以类似方式处理它们,以生成内容,并且不会被无限期遗忘。

#16 楼

一个更令人讨厌但又有效的方法可能是将待办事项注释转换为编译器消息,这样您和其他所有人都可以在编译程序时看到它。

在Delphi中:

{$message 'todo: free this thing when you know its not going to blow up'}


#17 楼

以我的经验,应该使用TODO来指示一段代码不可用,并告诉读者使其(在本地或其他地方)可用是什么。

TODO注释不应该用于表示如果以某种方式修改某些代码会更好。例子包括脏代码,如果重写,它们将更易于维护,或者尚无人需要的额外功能。这些注释会堆积起来,使grep TODO返回无用的结果。

评论


这只是您的意见,还是可以通过某种方式进行备份?

– gna
15年11月19日在21:23

这是我根据我的经验提出的意见和建议。有人用TODO注释说:“我知道如何编写良好的代码,但我不会这样做,因为我不在乎,但是,嘿,我在这里编写了TODO,因此它确实表明我知道如何编写干净的代码”。

–马丁·詹邦(Martin Jambon)
15年11月19日在22:05