干掉项目中杂乱 的 if-else,试试状态模式,这才是优雅的实现方式

IF-ELSE 方式

原来以为写一个简单的类型翻译器花不了太多时间,可是真做起来,才发现要注意的点太多了。

首先是处理容器的开启和闭合,这就需要使用栈来保存预期的下一个字符类型,再对比栈顶字符类型和当前处理字符,决定解析的结果。

还要注意类型嵌套的情况下,内层嵌套的容器作为外层容器的元素被解析完成时,需要修改外层容器的预期字符。而且 Map 作为一种相对 Set 和 List 比较特殊的容器,还要处理它的左右元素。同时还不能忘记处理各种异常,如未知字符、容器内是原始类型、容器未正确闭合等。

而这些逻辑混杂在一块就更添复杂度了,通常是一遍代码写下来挺顺畅,找几个特殊的 case 一验证,往往就有没有考虑到的点,你以为解决了这个点就好了,殊不知这个问题点的解决方案又引起了另一个问题。

最终修修补补好多次,终于把代码写完了,连优化的想法都没了,担心又引入新的问题。

最终的伪代码如下:

public String parseToFullType() throws IllegalStateException {  
    StringBuilder sb = new StringBuilder();  
    for (; ; this.scanner.next()) {  
        Character currentChar = scanner.current();  
        if (currentChar == '\uFFFF') {  
            return sb.toString();  
        }  
        if (isCollection()) {  
            if (CollectionEnd()) {  
                dealCollectionEleEnd();  
            }else {  
                throw new IllegalStateException("unexpected char '" + currentChar + "' at position " + scanner.getIndex());  
            }  
        } else if (isWrapperType()) {  
            dealSingleEleEnd();  
        } else if (parseStart()) {  
            if (collectionStart()) {  
                putCollecitonExpectEle()  
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值