在《程序员成长计划》中,提到的函数指针的运用,今天更明白了一些。分两种情况讨论。(主调函数,被调函数)
第一点,可以传入的函数指针实参。这是平时应用最多的。通过传入的函数指针实现一定的功能,使用一个被调函数,在不需要修改任何代码的情况下,就可以通过传入的函数指针实现多种功能。
这是《程序员成长计划》中最先提到的,着重讲解的,这也是自己最先理解的。
第二种,在一个主调函数中,在不改变其代码的情况下,实现多种功能。同样也是使用函数指针。但是由于是主调函数,不可能通过传入的函数形参,传入函数指针的方式。这样为了传入函数指针,就需要调用一个函数,在此函数中给相应的函数指针变量赋值。之后再返回到主调函数中,有主调函数调用这些函数指针,实现功能。
不过,同时又想到,这样为何不在主调函数中,调用的那个用来得到函数指针的函数,使用if或者switch在被调函数中实现那些功能,而不用返回主调函数中呢?他们之间又有什么优劣。
自己的想法:
使用if/switch:
1、修改时,需要修改两个函数,即主调函数,和它的被调函数。
2、用来实现,选择功能,同时通过switch调用实现函数。实现功能。
使用函数指针:
1、函数的调用顺序已经确定,灵活性没有switch好,
2、实现函数的调用,因为函数指针在主调函数中
3、修改起来,只需要修改被调函数中的的东西,(添加需要的函数指针)
关于这两种方式,
没有绝对的优劣,关键看程序需要实现的需求是什么。根据需求,选择的合适的方式,这就需要经验。
由此想到,
鱼是最后一个看到水的,
很多时候,不是那种方式绝对管用,只有具体问题在使时具体分析,在合适的时候使用合适的方法,要做到不为哪种所困。这样,我们才不会被外界所困,而看不清实质。
这或许就是为什么在《倚天屠龙记》中,张三丰教完张无忌之后,不问其记住多少,而是问其忘记多少——在意不在形。
就像《暗时间》所提:
与其:手中有锤,一切都是钉子;
不如:手中有锤,心中无锤。