c - DRY 如何与 "Separation of concern"和 "One function, one task"组合?

标签 c refactoring dry code-cleanup

<分区>

Possible Duplicate:
How many lines of code should a function/procedure/method have?

Out 团队有一个结构不佳的 ansi-c 代码项目。我想使用一些 CC 技术来整理代码库。

至于 C 代码,我们有很多指针和很多 NULL 指针陷阱需要捕捉。因此有很多看起来很相似的片段。这就像

if (pointer == NULL)
{
  function1();
  function2();
}

无处不在。然后有大量的函数将以相同的方式相互调用,只是有一些变化,比如

function1();
function2a();
function3();

function1();
function2b();
function3();

无处不在。

我想将这些 block 提取为单个函数以减少 LOC 和复制粘贴。但这不仅会创建一个(有点)正交层,还会创建一些功能,除了一些细节外,它们或多或少地做着相同的事情。更糟糕的是,它会创建同时做很多事情的函数。

那么,什么是好的策略?更重要的是,高层精益代码、低层精益功能或精益架构?哪个原则胜过另一个?关注点分离还是 DRY?

我想重构那个野兽,但不知道从哪里开始。

展开下面的示例并放入相同的名称。假设我们有

morningBath();
drinkCoffee();
if (checkMail())
{
  answerMail();
}

并将其放入 morningRoutine()。现在我们有

drinkTea();
morningBath();
if (checkMail())
{
  answerMail();
}

并将其命名为 sundayMorningRoutine()。但是然后有重复的代码。或者将 morningRoutine(day) 扩展为

if (day == sunday){
  drinkTea();
  morningBath();
} else {
  morningBath();
  drinkCoffee();
}    
if (checkMail())
{
  answerMail();
}

或者也许

if (day == sunday){
  drink(Tea);
  morningBath();
} else {
  morningBath();
  drink(Coffee);
}    
if (checkMail())
{
  answerMail();
}

我想知道这是否是好的风格..也许..感谢您的提示!

最佳答案

对于 C 代码,经常遇到 NULL 指针检查是完全正常的,尤其是涉及到函数参数时。就个人而言,我更愿意让调用者解决问题,如:

if (p == NULL) {
    /* maybe do some cleanup and then: */
    return errcode;
}

公共(public)函数,即作为 API 一部分的函数,应始终检查 NULL 指针。指定为 static 的函数可能会被 IMO 放弃这些检查。最后,总是有 assert()。编译器标志 -NDEBUG 可以抑制这些检查。我在 static 函数中使用 assert() 而不是 if 语句,并在“公共(public)”函数中用于显示调用者没有进行测试的测试实际上从整体上理解 API,例如在链表库中:

void list_print(list **l)
{
    assert(l != NULL);    /* no valid list passed by reference can ever be NULL */

    if (*l == NULL)       /* but it can be empty */
        return;

    /* print list */
}


至于你的第二个问题,我可以看到三个选项:

1) 让一切保持原样 - 毕竟,它正在运行。

2) 引入新功能:

int function_1_2a_3();
int function_1_2b_3();

3) 引入新的参数化函数:

int function_1_2_3(int type);

就个人而言,我更喜欢后一种方法,但这实际上只是一种风格问题。

关于c - DRY 如何与 "Separation of concern"和 "One function, one task"组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11686776/

相关文章:

python 基于实例的类型检查

用于 HashMap 的 Clojure DRY 模式?

元音大写,辅音小写

c++ - 有没有可靠的工具可以去除 ASM/C/C++ 代码中的注释?

ruby - 以 block 的形式调用方法

c# - 重构 “procedural” WCF服务

c++ - 如何将 char 编码为 2 位?

c - 你是素数吗

c - 围绕 MD5 代码的段错误

javascript - 干燥 JavaScript 片段