美文网首页
Swift如何优雅的解决鞭尸金字塔

Swift如何优雅的解决鞭尸金字塔

作者: 啧啧同学 | 来源:发表于2020-08-05 07:16 被阅读0次

Swift本身是一门很新的编程语言,借鉴及增添了其他语言的许多优良特性,可以写出很优雅的代码!~

业务中很多的条件判断怎么办,是否需要一长串的if ... else if ... else if .... else if ... else , 这就是传说中的鞭尸金字塔,出现鞭尸金字塔,会导致代码的可读性及维护性都很差,今天利用Swift的一些“优点”,优雅的解决所谓的“鞭尸金字塔”

定义好满足条件的规则, 这里以股票买卖界面的判断条件来做栗子
1.止蚀单价格不能为空,提示“请输入最低卖价”
2.最低卖价不能为空,提示“请输入最低卖价”
3.最低卖价低于止蚀价格时,提示“最低卖价必须低于止蚀价格”
4.股票价格为空且订单类型为非市价单时,提示“请输入价格”
5.股票价格填入0且订单类型为非市价单时,提示“价格不能为0”
6.股数为空时,提示“请输入股数”
7.持仓数量不足时,提示“持仓数量不足”
8.买入或卖出时股数不正确,提示“不能输入碎股”

根据以上条件,首先定义验证规则

1.具有判断的前提条件condition
2.验证结果中,有三种:是否验证通过、判断的参数类型、错误提示
3.依次满足以上所有条件,所以使用数组来处理条件的判断

由此,我们可以定义验证规则的结构, 这里还是喜欢用别名来增加代码的可读性

//验证结果的数据模型:(是否通过, 参数类型,错误提示文案)
typealias CCBTradeInputCellAuthResult = (Bool, CCBTradeInputCellType, String)

//条件判断模型:(condition:验证条件, 验证结果)
typealias CCBTradeInputCellAuthRule = (condition: Bool, result: CCBTradeInputCellAuthResult)

//专门为数组拓展一个方法,遍历数组各条件后输出最后结果

extension Array where Element == CCBTradeInputCellAuthRule {
    
    var tradeAuthQueneResult: CCBTradeInputCellAuthResult {
        
        for rule in self {
            if rule.condition { return rule.result }
        }
        return (true, .none, "")
    }
}

模拟业务场景

1.可能是多个页面下(亦或者是一个页面分不同的class的拆分:如用户的输入是一个类class,用户账户信息是另一个class, 股票信息又拆分至另一个class),所以使用面向协议来处理这样的场景:

首先定义一个protocol,其中,实现一个交易条件是否满足的验证方法doVerify

protocol CCBATradeVerifyProtocol {
    
    func doVerify() -> Bool
}

股票买卖界面的条件判断栗子

class FCBuySellInputController: CCBATradeVerifyProtocol {
         ....

        func doVerify() -> Bool {

            let rules: [CCBTradeInputCellAuthRule] = [
            ((propType == .SLS && wrapStopLossInput.isEmpty), (false, .stopLossPrice, "请输入止蚀价格".local())),
            ((propType == .SLS && priceDouble > stopLossPriceDouble), (false, .price, "最低卖价必须低于止蚀价格".local())),
            ((propType == .SLS && wrapPriceInput.isEmpty), (false, .price, "请输入最低卖价".local())),
            ((wrapPriceInput.isEmpty && propType != .MKT), (false, .price, "请输入价格".local())),
            ((priceDouble == 0 && propType != .MKT), (false, .price, "请输入价格".local())),
            ((wrapAmountInput.isEmpty), (false, .amount, "请输入股数".local())),
            ((tmpAmountInt == 0), (false, .amount, "股数无效。股数须大于零".local())),
            (((tmpAmountInt > viewModel.numInputViewModel.limitAmount) && tradeAction == .buy), (false, .amount, "买入数量超出限额".local().local())),
            (((tmpAmountInt > viewModel.numInputViewModel.limitAmount) && tradeAction == .sell), (false, .amount, "持有量不足".local().local())),
            ((isFragment  && tradeAction == .buy), (false, .amount, "股数不正确。请重新输入".local())),
            ((isFragment  && tradeAction == .sell), (false, .amount, "股数不正确。请重新输入".local()))
             ]
        
             // 使用数组的拓展方法直接验证获取结果
              let result: CCBTradeInputCellAuthResult = rules.tradeAuthQueneResult
              let isAuth = result.0
              //处理验证结果:弹窗或者其他操作
              process(result)
              return isAuth
      }
      private func process(_ authResult: CCBTradeInputCellAuthResult) {
             /* 处理结果: 弹窗信息 */
      }
}

从上面代码看,每个条件下的规则都很清楚,在定位问题及规则增、减、改时均比一堆if else 来得清除,不会弄容易弄错!仅需要在修改对应的条件或者按照对应的顺序删除或者插入“条件判断规则”即可

相关文章

网友评论

      本文标题:Swift如何优雅的解决鞭尸金字塔

      本文链接:https://www.haomeiwen.com/subject/trjirktx.html