在写双向链表的打印,求和,找出最大数的时候,很明显,都是需要遍历的,因此,可以使用函数回调的方法,写一个遍历函数,留一个回调参数,呵呵,增强了代码的灵活性啊。
1.不要编写重复的代码。
有很多问题:
a.虽然重复的代码很容易写,但是更容易出错。使用相类似的代码,我们更容选择使用“CV”,但是这样很容易犯一些细节上的错误,如果某个地方修改不完整,就容易留下定时炸弹!
b.重复的代码经不起变化。无论是修改BUG,还是增加新的特性,需要修改很多地方,忘掉一个地方就要付出很多代价 ……一个BUG动全身啊……
因此,要学会抽取重复的代码,需要思考,需要精力和耐心。
2.任何回调函数都要有上下文。
typedef DListRet (*DlistDataPringFunc)(void *ctx,void* data);
DListRet dlist_foreach( DList* thiz, DListVisitFunc visit, void * ctx)
{
DListRet ret = DLIST_RET_OK;
DListNode* iter = thiz-> first;
while ( iter != NULL && ret != DLIST_RET_STOP)
{
ret = visit( ctx, iter-> data) ;
iter = iter-> next;
}
return ret;
}
static DListRet sum_cb( void * ctx, void * data)
{
long long * result = ctx;
* result += ( int ) data;
return DLIST_RET_OK;
}
实现了加和功能。
注意,以后在使用回调函数的时候,要保留一个上下文参数,ctx,这样在不停进出回调函数的时候,就能避免使用全局变量。
3.只做份内事。
也就是说,模块功能不是想添就添的,而是根据真正的需要,高内聚,低耦合,清晰明了,呵呵,一个函数100行以内~~