在 #if DEBUG 块中放置开发快捷方式是一个不好的主意吗?

13

在我们的代码中有一些地方使用#if DEBUG块来简化开发。类似于:

#if DEBUG
   serverIP = localhost;
#else
   serverIP = GetSetting()
#endif
或者
private bool isLicensed()

#if DEBUG
   return true;
#endif

return CheckSetting()

我们还有一些地方会进行类似这样的表面上的改动:

#if DEBUG
   background = humorousImage.jpg
#else
   background = standardColor
#endif

依赖于 #if debug 会危险吗?如果危险的话,有什么有效的 #if debug 的用法吗?

7个回答

11

这样做的问题在于,它会让你更难以发现#else中的错误。

一般来说,你的Debug版本应该尽可能与Release版本相似。


9
理想情况下,我认为您应该将这些设置移到配置文件中,并保留 #IF Debug 指令进行测试、记录和其他 "调试" 任务。同时,请记住,如果您需要为客户提供 "调试" 构建版本,则现在的代码行为完全不同。仅代表个人观点。

当然,“调试”版本的构建可能只是在发布版本中发出调试器输出。我认为不这样做的主要原因是发布版本可能包含在调试版本中不存在的错误。 - BlueRaja - Danny Pflughoeft

8

这是一个非常糟糕的想法。如果你试图捕捉生产错误,你的调试子句肯定会在某个阶段绊倒你。你希望尽可能接近在生产中运行的代码。在你的示例中,你永远找不到CheckSetting()中的错误。

从外观上看,你的代码耦合度过高。你要做的是使模块/类之间的依赖性更少,并实践测试驱动开发。还可以查看控制反转(也称为依赖注入)。

《遗留代码效果优化》一书对如何引入TDD有一些有用的见解。它还提供了一些关于如何在各种难以测试的情况下进行TDD的好建议。


7

就我个人而言,我不是很热衷于这样做 - 我在一个环境中工作,在这个环境中,我们的主要应用程序(部署到400多个用户)有60多个模块 - 由于有5个开发人员在项目上工作和发布模块,你只需要知道迟早有人会意外地发布一个调试模块。 :)


同意!无论你多么小心,最终它可能会被曝光,所以不值得冒险。 - RQDQ
2
听起来你需要一个自动化构建,这样你就不会发布在个人开发者工作站上构建的文件了。 - Joe White
非常正确 - 这件事情已经在计划中有一段时间了,乔! - Will A

3

您应该尽可能保持生产环境和开发环境尽量相似,因此避免有两个版本的代码。

#if DEBUG 结构的一个有效用途是在代码中放置额外的检查,这些检查在最终产品中不需要:

#if DEBUG
  if (somehting that normally can't happen) throw new SomeException();
#endif

@Joe:是的,对于这个简单的例子来说没问题,但如果你想检查一些需要更复杂代码的东西,可能需要考虑一下。 - Guffa

1

我第一次使用条件#if块的有效用途:

我们有一个新的许可证/激活系统。我们需要在本地调试时禁用它,但不想使用配置设置来禁用它-因为用户可以通过修改配置文件绕过系统!

因此,我们使用条件编译块:

#if !DISABLE_ACTIVATION
// activation code here
#endif

希望这能更清晰地呈现出整个情况...!

0

我的当前风格是拥有一个名为aadebug.h的文件,其中包含一堆条件定义,每个定义前可能有//以取消其激活状态。该文件开始如下:

//#define DX_DEBUG
#ifdef DX_DEBUG
#define DX_SKIP_LOGIN
// #define DX_ALLOW_BULK_USER_CREATE
#define DX_CREATE_EXCESS_LOGS
// #define DX_RANDOM_PROBE_FAILURES
#define SHORT_KEY_TIMEOUT
// #define DX_OMIT_NET_VIEWER
...
#endif

如果启用DEBUG,则主屏幕显示代码将显示“不适用于生产环境”。所有仅限于调试的选项都可以通过关闭DX_DEBUG来禁用,但大多数选项通常使用单独的标志进行控制。如果我认为某个选项已经没有用处了,就会从源代码中删除其#ifdef,然后从aadebug.h中删除被注释的#define,但否则我会使用这些被注释的#define来跟踪哪些#ifdef标记仍然存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接