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
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.
我会避免你的第一个选项,因为你说你最终必须实现的功能数量(虽然可能只是作为宏)可能会失控.当您决定添加斜体支持时,计数会翻倍,并且再次为下划线加倍.
我可能也会避免第二种选择.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.
我认为最大的改进是,这意味着如果我决定在此时添加对带下划线的文本的支持,我需要两个步骤
#define WRITE_FORMAT_UNDERLINE 32到标题write().此时它可以调用write(...,... | WRITE_FORMAT_UNLDERINE).更重要的是,我不需要修改预先存在的写入调用,如果我在其签名中添加了一个参数,我将不得不这样做.
另一个潜在的好处是,它允许您执行以下操作:
#define WRITE_ALERT_FORMAT (WRITE_FORMAT_CENTER | \
WRITE_FORMAT_BOLD | \
WRITE_FORMAT_ITALIC)
Run Code Online (Sandbox Code Playgroud)