【发布时间】:2016-08-25 20:01:53
【问题描述】:
现在我知道你在想什么了——我在标题中描述的事情听起来就像超载一样。我知道这不是 C 语言中的事情,无论如何我都不会这样做。我有这 2 个函数 - 它们的主体完全一样,但参数是 2 个不同的结构。基本上它是一个二叉搜索树结构和一个红黑树结构。您可能知道这些结构只有一个区别——红黑树结构包含一个多字段,即颜色字段。此外,函数搜索、最小值、最大值、前任、继任者......这些函数将具有完全相同的主体,但可惜它们采用 2 种不同类型的结构。当然插入和删除方法也会不同。
所以我在想如何避免打破编程中的第一条规则而不重复自己?我想了很多解决方案,但当我试图找到一种方法来实现它时,都没有奏效。我想过只为两者使用一个函数,但我不能这样做,因为结构不同。我考虑过使用宏,但老实说,我不知道如何使这些工作,我什至不确定它们是否可以避免我有 2 个不同结构的问题。我考虑过制作一个通用结构并让 rb 结构包含它和一个颜色变量,但这直接用几个字符改变了代码,因为我必须更深入地进入结构以获得值并且我不再有重复代码。
只是一个问题的例子:
bst_search(bstTree t, char *k)
{
// Searching in tree
}
rb_search(rbTree t, char *k)
{
// SAME code for searching in tree
}
如果我在 java 中编码,我可能会使用抽象超类来解决这个问题,但 C 没有这样的花哨的东西。
一些额外的信息:两个实现都有自己的头文件和类文件,我想保持这种方式。现在我在这 2 个类中都有重复的代码,唯一不同的是函数和结构的名称(c 的插入和删除函数除外)。
很抱歉,如果这有一个明显的解决方案,我只是在不复制代码的情况下找不到解决方法。
【问题讨论】:
-
如果您不想通过使用通用结构来更改所有其余代码,请在两个调用函数中的每一个中执行此操作(每种类型一个)。将相关成员复制到您的公共结构中,并调用搜索功能。
-
第一条规则肯定不是 DRY。我会把KISS放在第一位。但是,当然,您会得到不同的答案