我的设计故事:剥桔子和切苹果
 
     也许大家吃桔子的方法是一致的,就是剥了皮就可以吃了。但是吃苹果的方法可能就比较多点,可能有的削皮,有的不削皮,有的整个吃,有的切成一块一块吃。但可以肯定的一点就是吃桔子和苹果的方法不同,这里就假定用我的方法:剥桔子和切苹果。
     是剥皮还是切块呢?软件设计中通常也会遇到这样的困惑。
     有时候是类的关系可能是这样的:
            Case 1 ClassA::MethodA()  calls  ClassB::MethodA()  calls  ClassC::MethodA() 
     需要去层层剥开。
 
     有的时候可能是这样的: 
            Case 2 ClassC::MethodA()  calls  ClassC::MethodA1()  &&  ClassC::MethodA2()  &&  ClassC::MethodA3()
     需要分块,以求分而治之。
 
     但如果运用不恰,Case1就可能变成这样:
            Case 3  ClassA::MethodA()  calls  ClassA::MethodA1()  &&  ClassA::MethodA2()  &&  ClassA::MethodA3()
                        ClassA::MethodA1()  calls  ClassB::MethodA1()  calls  ClassC::MethodA1()
                        ClassA::MethodA2()  calls  ClassB::MethodA2()  calls  ClassC::MethodA2()
                        ClassA::MethodA3()  calls  ClassB::MethodA3()  calls  ClassC::MethodA3()

     剥开不充分,就分块了。
 
     多么可怕的膨胀啊!从这样的角度看很清楚看到Case3是个糟糕的决定,但试想下在实际项目的茫茫代码可能这样的问题就不会那么的显而易见了。所以在无论在设计、编码还是检查都应该注意其中蕴藏的剥桔子和切苹果的区别。