C++函数式编程(三)纯正度实践

原文:http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/

作者:John Carmack


-潘宏 译

-2013年1月

-email: [email protected]

-weibo.com/panhong101



并非所有程序都是纯正的,除非该程序只和自身代码打交道,而程序多数情况下也需要和外界交互。虽然探险般地将纯正做到极致是一种乐趣,但实际情况也表明:有时候,副作用也是必要的,应该好好管理这些副作用。


在有些函数中,纯与不纯并不是绝对的。函数的纯正度是一个连续值,从“几乎纯正”到“完全纯正”带来的价值要小于从“混乱状态”到“几乎纯正”的价值。把函数朝纯函数的方向改进,就算没有让它变成“完全纯正”,代码也会有所改善。一个函数,如果它累加一个全局计数器,或者检查一个全局调试标识,都不能算是纯函数。不过即使这样,如果它实际只可能做上面两个事,也会获得大多数纯函数的优势。


有些情况下,在容忍范围内避免最差,比达到完美更重要。想想你曾经处理过的毒害性最严重的函数或者系统,严重到你得戴个面罩,拿个钳子才敢去碰。这种系统必然是状态错综复杂,数据状态依赖性强的——绝不仅仅依赖于它的参数。对这些问题采取一定措施,或者至少努力避免更多代码陷入这种境况,比让几个底层数学函数更简洁,有意义得多。


重构函数以使其纯正,主要应从其操作上下文着手,增加更多的参数传递是不二法门。这么说似乎让人觉得奇怪,本来编程语言是以简为美,而函数式编程经常是降低代码量的。有些因素使函数式程序有时候比命令式程序更简洁,它们包括:垃圾回收、强大的内建类型、模式匹配、列表解析、函数合成、各种语法糖等等,而这些因素往往和函数式编程是排斥的。大多数情况下,代码量的减少和函数式编程没太大关系,命令式程序也能够做到。


如果得给一个函数传一大堆参数,估计你得烦死。此时你可以将程序重构一下,减少些参数。


对于C++来说,缺乏一个保持函数纯正度的语言机制略显逊色。如果真有个家伙把一个被大量使用的基础纯函数,以某种不够光彩的方式,改成不纯的了,那么所有调用该函数的其它函数,也都不纯了。从形式系统的角度来看,这简直就是场灾难,但还是那句话,也没那么绝对,死罪可免,活罪难逃。但对于大规模软件开发,情况则只具有统计学意义,很遗憾。


谈了这么多,似乎给以后的C/C++语言标准增加一个pure关键字是比较明智的。它应该和关键字const有相似之处:都是可选修饰符,都在编译期检测用户代码,都对代码百利无一害。D语言就提供了pure关键字(http://www.d-programming-language.org/function.html)。注意D语言里有弱纯正和强纯正之分,强纯正要求给函数的引用或者指针参数加const修饰符。


从某些方面看,语言关键字显得过于严格。其实,一个纯函数也是可以调用一个非纯函数的,只要这个非纯函数的副作用不要波及到它的作用域之外就行。而整个程序也可以看作是纯函数化的,只要它只处理传入的命令行参数,而不会影响到到随机文件系统的状态。

你可能感兴趣的:(编程,c,c,函数式编程,图形,引擎)