是时候重构了!

是时候重构了!
    实习的时候,自己的时间明显没有在学校的时候多啊。这次Kernel FP拖了很久,一个多月都还没写完。幸好语法分析器用了之前开发的Syngram,要不得多花一个月。Kernel FP的类型推导的代码实在是很难看,趁着又发现了一个Bug,重构一下。

    类型推导的时候需要频繁地修改符号的类型。譬如说现在有符号Type1 A和Type2 B。突然发现函数的分支里面,一条返回A,一条返回B,立刻就断定Type1与Type2相等了。现在事情就来了,需要将所有类型里面的Type1通通换成Type2。以前的做法是在推导之前将类型入栈,推导之后出栈,每次替换栈内的类型。这种做法导致了代码写起来非常难受而且很容易出错。因此今天针对这个问题,重写了这个用来实现类型推导的类。

    现在需求如下。主类叫TypeSolver。TypeSolver::SolverAndReplace(OldType , NewType)的时候需要更新所有相关的类型。现在怎么办呢?我提供了一个TypeWrapper用来装Type的智能指针,实现operator->。使用TypeSolver创建Wrapper的时候,将Wrapper和类型记录在Solver里面。多个Wrapper可能共享一个Type,这个时候Solver中还维护了一个引用计数。

    于是,我在Wrapper用其他Wrapper构造,或使用Wrapper或Type赋值,或者析构的时候都通知Solver。Solver析构的时候通知所有Wrapper。代码如下:

    h文件:
 1  class  VL_KfpIdTypeWrapper :  public  VL_Base
 2  {
 3      friend  class  VL_KfpIdTypeSolver;
 4  protected :
 5      VL_KfpIdTypeSolver *                         FSolver;
 6      VL_KfpIdType::Ptr                        FType;
 7 
 8      VL_KfpIdTypeWrapper(VL_KfpIdTypeSolver *  Solver);
 9 
10       void                                     Inc();
11       void                                     Dec();
12  public :
13      VL_KfpIdTypeWrapper();
14      VL_KfpIdTypeWrapper( const  VL_KfpIdTypeWrapper &  Wrapper);
15       ~ VL_KfpIdTypeWrapper();
16 
17      VL_KfpIdTypeWrapper &                      operator = ( const  VL_KfpIdTypeWrapper &  Wrapper);
18      VL_KfpIdTypeWrapper &                      operator = (VL_KfpIdType::Ptr Type);
19      VL_KfpIdType *                              operator -> ();
20  };

    cpp文件:
 1  void  VL_KfpIdTypeWrapper::Inc()
 2  {
 3       if (FSolver)
 4      {
 5           if (FType)
 6          {
 7              VInt Index = FSolver -> FAssociatedTypeCounter.IndexOfKey(FType.Object());
 8               if (Index ==- 1 )
 9              {
10                  FSolver -> FAssociatedTypeCounter.Add(FType, 1 ,FType.Object());
11              }
12               else
13              {
14                  FSolver -> FAssociatedTypeCounter.ValueOfIndex(Index) ++ ;
15              }
16          }
17      }
18  }
19 
20  void  VL_KfpIdTypeWrapper::Dec()
21  {
22       if (FSolver)
23      {
24           if (FType)
25          {
26              VInt Index = FSolver -> FAssociatedTypeCounter.IndexOfKey(FType.Object());
27               if ( -- FSolver -> FAssociatedTypeCounter.ValueOfIndex(Index) == 0 )
28              {
29                  FSolver -> FAssociatedTypeCounter.DeleteByIndex(Index);
30              }
31          }
32      }
33  }
34 
35  VL_KfpIdTypeWrapper::VL_KfpIdTypeWrapper(VL_KfpIdTypeSolver *  Solver)
36  {
37      FSolver = Solver;
38      FSolver -> FAssociatedWrappers.Add( this );
39  }
40 
41  VL_KfpIdTypeWrapper::VL_KfpIdTypeWrapper()
42  {
43      FSolver = 0 ;
44  }
45 
46  VL_KfpIdTypeWrapper:: ~ VL_KfpIdTypeWrapper()
47  {
48      Dec();
49  }
50 
51  VL_KfpIdTypeWrapper::VL_KfpIdTypeWrapper( const  VL_KfpIdTypeWrapper &  Wrapper)
52  {
53      FSolver = Wrapper.FSolver;
54      FType = Wrapper.FType;
55      Inc();
56  }
57 
58  VL_KfpIdTypeWrapper &  VL_KfpIdTypeWrapper:: operator = ( const  VL_KfpIdTypeWrapper &  Wrapper)
59  {
60      Dec();
61      FSolver = Wrapper.FSolver;
62      FType = Wrapper.FType;
63      Inc();
64       return   * this ;
65  }
66 
67  VL_KfpIdTypeWrapper &  VL_KfpIdTypeWrapper:: operator = (VL_KfpIdType::Ptr Type)
68  {
69      Dec();
70      FType = Type;
71      Inc();
72       return   * this ;
73  }
74 
75  VL_KfpIdType *  VL_KfpIdTypeWrapper:: operator -> ()
76  {
77       return  FType.Object();
78  }

你可能感兴趣的:(是时候重构了!)