親を包装する抽象的な方法によって構造と行為が統一される.


注:Hadoopテクノロジーフォーラムで発表された
OOを行うと、構造統一が容易になり、これも理解しやすくなり、以下のようになります.

  
  
  
  
  1. class Parent  
  2.  
  3. {  
  4.  
  5. public:  
  6.  
  7.     virtual void hello() = 0;  
  8.  
  9. };  
  10.  
  11.  
  12.  
  13. class Child1: public Parent  
  14.  
  15. {  
  16.  
  17. private:  
  18.  
  19.     virtual void hello() {  
  20.  
  21.         printf("Child1
    "
    ); //  , Parent  
  22.  
  23.     }  
  24.  
  25. };  
  26.  
  27.  
  28.  
  29. class Child2: public Parent  
  30.  
  31. {  
  32.  
  33. private:  
  34.  
  35.     virtual void hello() {  
  36.  
  37.         printf("Child2
    "
    ); //  , Parent  
  38.  
  39.     }  
  40.  
  41. };  
  42.  
  43.  
  44.  
  45. int main() {  
  46.  
  47.     Parent* p = new Child2;  
  48.  
  49.     p->hello();  
  50.  
  51.     return 0;  
  52.  

上記の設計では、構造は統一されており、外部にはParentが示されているが、動作は統一されていない.gdb印刷呼び出しスタックを使用すると、Parentの影が見えず、システムが膨大になると、新人にシステムを理解するのに抵抗が増加する.どうやってこの問題を解決しましたか.行動を統一することで、これを明確化することができます.メソッドは、Parentに非抽象メソッドを追加し、この新しく追加された非抽象メソッドによってhelloを呼び出すことで、呼び出しスタックにParentの姿が見え、呼び出しスタックに階層感が表示され、システムの理解に役立ちます.

  
  
  
  
  1. class Parent  
  2.  
  3. {  
  4.  
  5. public:  
  6.  
  7.     /* virtual */ void hello() {  
  8.  
  9.         do_hello();  
  10.  
  11.     }  
  12.  
  13.       
  14.  
  15. private:  
  16.  
  17.     virtual void do_hello() = 0;  
  18.  
  19. };  
  20.  
  21.  
  22.  
  23. class Child1: public Parent  
  24.  
  25. {  
  26.  
  27. private:  
  28.  
  29.     virtual void do_hello() {  
  30.  
  31.         printf("Child1
    "
    ); //  , Parent -> Child1  
  32.  
  33.     }  
  34.  
  35. };  
  36.  
  37.  
  38.  
  39. class Child2: public Parent  
  40.  
  41. {  
  42.  
  43. private:  
  44.  
  45.     virtual void do_hello() {  
  46.  
  47.         printf("Child2
    "
    ); //  , Parent -> Child2  
  48.  
  49.     }  
  50.  
  51. };  
  52.  
  53.  
  54.  
  55. int main() {  
  56.  
  57.     Parent* p = new Child2;  
  58.  
  59.     p->hello();  
  60.  
  61.     return 0;  
  62.  
  63. }  

上記の修正は、簡単に見ると、コードや呼び出し回数を増やす欠点のほかに、何のメリットもありませんが、ソフトウェア開発は実際にはエンジニアリング的な仕事であり、全体性や外部要因を考慮する必要があるなど、個人的には価値があると思います.特にUMLを設計する場合、タイミングチャートはより理性的に見えます.