OOP开发方式,类及内部函数很容易出现最终行为和其他因素关联,如配置、磁盘IO、网络IO、锁的干预。经常出现难于复现的bug,而且一旦引入并发或并行,又有数据安全、死锁风险。
函数式编程强调函数为第一等公民,拒绝状态修改,函数的行为仅和输入有关,函数是自洽的,是更细粒度的业务逻辑抽象,可以提供更好的可重用性,同时也简化了调试和测试过程。去掉锁的干扰,天然支持并行运行,可扩展性也非常好。使用这些基础函数组合成高阶函数(组合高于继承),对于当前多核cpu天然的友好。
这些函数式特性刚好解决OOP的困扰,但函数式程序需要创建大量中间数据结构及更频繁的函数调用,总体性能不如命令式高;另外系统最终还是需要状态存储及管理的(使用MailboxProcessor,单线程Actor模式),也增加复杂度和性能开销。复杂业务场景高阶函数的可读性不佳。
开发过程中,可函数式、命令式混合使用,用函数式做底层技术、业务抽象,高层模块还是用OOP方式设计,取长补短。C#可以调用F#的库,二者结合,为大型系统开发提供了一个新的思路。