函数式编程的例子-谈side effect


在读《Functional Programming in Scala》一书,
关于移除副作用带来的好处,可以用一个简单的场景来模拟。

场景:咖啡店买咖啡

场景构成

  • 场景构成
    • 信用卡
    • 咖啡店
    • 咖啡
    • 外部API(支付时调用)

一个有副作用的函数

副作用

class Cafe:
    def buyCoffee(cc: CreditCard):Coffee = 
        val cup = new Coffee()
        cc.charge(cup.price)
        cup
class CreditCard:
    def charge(price: Double): UInt = 
        println('charging: '+price)
class Coffee:
    val price : Double = 2.0

一个没有副作用的函数

√ 单元测试可行

移除副作用

class Cafe:
    def buyCoffee(cc: CreditCard): (Coffee, Charge) =
        val cup = new Coffee()
        (cup, Charge(cc, cup.price)
case Class Charge(cc: CreditCard, amount: Double):
    def combine(other: Charge): Charge = 
        if cc = other.cc then
            Charge(cc, amount + other.amount)
        else 
            throw new Exception("Can't combine with different card")

√ 可复用、可组合

可复用

class Cafe:
    def buyCoffee(cc: CreditCard): (Coffee, Charge) =
        val cup = new Coffee()
        (cup, Charge(cc, cup.price)
    def buyCoffees(cc: CreditCard, n: Int): (List[Coffee], Charge) = 
        val purchases: List[(Coffee, Charge)] = List.fill(n)(buyCoffee(cc))
        val (coffees, charges) = purchases.unzip
        val reduced = charges.reduce((c1, c2)=>c1.combine(c2))
        (coffees, reduced)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值