我有一个程序偶尔会写入状态更新,但我确信有些人会希望它静默运行,所以我提供了一个 -s/--silent CLI 选项。让我的程序遵守该参数的最佳方法是什么?
这个方法添加了一个全局变量,并且仍然执行 fprintf 函数,稍微增加了气味。
FILE *outfile
if (silent) {
*outfile = NULL;}
else {
*outfile = stderr;}
fprintf (outfile, "This program can run silently");
此方法还添加了一个全局变量,并且 if 散落在整个代码中的语句也增加了气味。
if (!(silent)){
fprintf (stdout, "This program can run silently");
}
带有全局变量的三元运算符可能更优雅:
(silent) ? : fprintf(stdout, "This program can run silently");
有没有比这些方法更好的做法?是否有任何我没有看到的缺点?
最佳答案
正如 Don Shankin 在他的评论中所说,最可维护的方法是将 fprintf() 包装在一个实现过滤逻辑的函数中,然后让您的代码调用包装函数而不是直接调用 fprintf()。这样你只需要在一个位置而不是在所有地方实现过滤逻辑。这是一个演示该技术的程序:
#include <stdio.h>
#include <stdarg.h>
bool silent = false;
void my_fprintf(FILE * outFile, const char * fmt, ...)
{
if (silent == false)
{
va_list argsList;
va_start(argsList, fmt);
vfprintf(outFile, fmt, argsList);
va_end(argsList);
}
}
int main(int argc, char ** argv)
{
my_fprintf(stdout, "Not silent now...\n");
silent = true;
my_fprintf(stdout, "But now I'm silent, so you won't see this!\n");
silent = false;
my_fprintf(stdout, "Silent is false again!\n");
return 0;
}
...这是程序的输出:
Not silent now...
Silent is false again!
关于c++ - 创建静默 CLI 选项的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26373586/