1.6 函数式编程与面向对象式编程
现在停下来看看已经做的。已经有了一个有用的函数,total_size(),它包含了在其他应用中遍历目录结构的有用代码。所以为使total_size()更具普遍意义,把所有与计算大小相关的部分提出来,替换成用户指定的任意函数的调用。结果就是dir_walk()。现在,对于任何需要遍历目录结构并做某事的程序,dir_walk()处理遍历部分,参数函数处理“做某事”部分。通过传递合适的函数对给dir_walk(),可以使它做任何想要它做的事情。已经获得了灵活性与复用dir_walk()的机会,通过提取有用的部分并参数化成两个函数参数。这便是函数式编程风格的核心。
面向对象式(Object Oriented,OO)的编程风格最近受到了更多关注。OO风格的目标和函数式风格的一样:期望通过把软件分割成通用的部分提高它的可复用性。
在一个OO系统中,可以类似地转换total_size(),但是结果看起来会不同。可以把total_size()做成一个目录遍历对象的抽象基类,这些对象有一个方法,dir_walk(),它依次调用两个未定义的虚方法file与directory。 (在C++中,它们称为纯虚方法(pure virtual method)。)这样一个类本身还没有用处,因为缺少file方法与directory方法。为了使用这个类,你要产生一个子类定义file方法与directory方法,然后产生子类的对象。这些对象将全部继承相同的dir_walk方法。
在这个例子中,我认为函数式的风格会带来一个更轻量级和更易用的解决方案,并使参数函数靠近它被使用的地方,而不是陷入一个类文件里。但重要的一点是尽管风格不同,原函数分解成的有用的组成部分却有完全相同的结构。函数式风格使用函数式参数,面向对象式风格使用纯虚方法。虽然本书的剩余部分是关于函数式编程的,但许多技术也将直接适用于面向对象式编程风格。