具体功能与许多参数与上下文相关

Her*_*che 7 c arguments function global-variables

一个例子

假设我们有一个要写的文本,可以转换为"大写或小写",并可以"​​左,中,右"打印.

具体案例实现(功能太多)

writeInUpperCaseAndCentered(char *str){//..}
writeInLowerCaseAndCentered(char *str){//..}
writeInUpperCaseAndLeft(char *str){//..}
and so on...
Run Code Online (Sandbox Code Playgroud)

VS

许多Argument函数(糟糕的可读性,甚至在没有很好的自动完成IDE的情况下很难编写代码)

write( char *str , int toUpper, int centered ){//..}
Run Code Online (Sandbox Code Playgroud)

VS

依赖于上下文(难以重用,难以编码,使用丑陋的全局变量,有时甚至无法"检测"上下文)

writeComplex (char *str)
{    
    // analize str and perhaps some global variables and 
    // (under who knows what rules) put it center/left/right and upper/lowercase
}
Run Code Online (Sandbox Code Playgroud)

也许还有其他选择..(并欢迎)

问题是:

对于这种(经常性)三难问题,是否有任何良好实践经验/学术建议

编辑:

我通常做的是结合"特定情况"实现,内部(我的意思是不在标题中)一般常见的多参数函数,只实现用例,隐藏丑陋的代码,但我不知道是否有一种我不知道的更好的方式.这种事情让我意识到为什么发明OOP.

tor*_*rak 7

我会避免你的第一个选项,因为你说你最终必须实现的功能数量(虽然可能只是作为宏)可能会失控.当您决定添加斜体支持时,计数会翻倍,并且再次为下划线加倍.

我可能也会避免第二种选择.Againg会考虑当您发现有必要添加斜体或下划线支持时会发生什么.现在,您需要向函数添加另一个参数,找到调用函数的所有情况并更新这些调用.简而言之,令人讨厌,尽管你可以通过适当使用宏来简化过程.

这留下了第三种选择.实际上,使用bitflags可以获得其他替代方案的一些好处.例如

#define WRITE_FORMAT_LEFT   1
#define WRITE_FORMAT_RIGHT  2
#define WRITE_FORMAT_CENTER 4
#define WRITE_FORMAT_BOLD   8
#define WRITE_FORMAT_ITALIC 16
....
write(char *string, unsigned int format)
{
  if (format & WRITE_FORMAT_LEFT)
  {
     // write left
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

编辑:回答格雷格S.

我认为最大的改进是,这意味着如果我决定在此时添加对带下划线的文本的支持,我需要两个步骤

  1. 添加#define WRITE_FORMAT_UNDERLINE 32到标题
  2. 添加对下划线的支持write().

此时它可以调用write(...,... | WRITE_FORMAT_UNLDERINE).更重要的是,我不需要修改预先存在的写入调用,如果我在其签名中添加了一个参数,我将不得不这样做.

另一个潜在的好处是,它允许您执行以下操作:

#define WRITE_ALERT_FORMAT  (WRITE_FORMAT_CENTER | \
                             WRITE_FORMAT_BOLD |   \
                             WRITE_FORMAT_ITALIC)
Run Code Online (Sandbox Code Playgroud)