C++の整理箱

7529 ワード

プログラミングは常に葛藤と切り離せず、次の葛藤はプログラムの可読性に関係している.
1、もつれ:関数が長すぎるから、分解しようか.問題が来て、分解した関数はあまり場所を探しにくくて、クラスの中に置いて、クラスを汚染して、全局の空間の中に置いて、また全体の環境を汚染しました.そしてこれらの関数は実は元の関数呼び出しで、いつも端に置いておきましょう.クラスを見てみると、最初はいくつかの関数があって、はっきりしていて、書いているうちに多くの私有関数が出てきて、コードを読むと、主次が見つかりません.
2、整理箱:このとき、クラスでも関数でも、整理箱が必要です.これらの多くの関数のために適切な場所を探します.整理箱がどこにあるかは、次の例を見てみましょう.3、一例:
 class lexer
  {
    public:
        int insymbol();
        tchar nextch();
    private:
        int eatcomment();
        int eatnumber();
        int eatstring();
        int eatoperator();
    private:
        ....
   }

これは比較的一般的な例であり、lexerクラスの重要な関数はinsymbol、nextch、eatの先頭の関数がinsymbolにサービスしている.4、クラス整理ボックス:以上のlexerクラスではeatの先頭の関数が、自分のクラスの構造を不明確にし、コードを読む難しさを増しています.ここでは、クラス整理ボックスを増やし、これらの関数を整理します.整理ボックスを追加すると、lexerの宣言コードは次のように簡潔になります.
 class lexer
  {
    public:
        int insymbol();
        tchar nextch();
    private:
        struct __; //   
    private:
        ....
   };

今またlexerでcppは実装部分を追加し、コードは以下の通りである.
#include "lexer.h"
    
    struct lexer::__
   {
        static int eatcomment(lexer* plexer)
        {
            ...
        }
        static int eatnumber(lexer* plexer)
        {
            ...
        }
        static int eatstring(lexer* plexer)
        {
            ...
        }
        static int eatoperator(lexer* plexer)
        {
            ...
        }
   };

   lexer::insymbol
  {
    ....
    __::eatnumber(this); //        
    ....
  };

現在、これらの関数はすべて整理箱に入れられており、すなわち類汚染もなく、グローバル環境に汚染もなく、整理の目的を達成している.5、関数整理箱:上にeatこれらの関数をクラスの整理箱に入れました.下にはinsymbolにサービスしている以上、内部で解決し、整理箱を関数の中に入れます.まず整理ボックスをクラスから削除します.lexerの宣言コードは次のとおりです.
class lexer
  {
    public:
        int insymbol();
        tchar nextch();
    private:
        ....
   };

そして整理をinsymbol関数に入れます.
 #include "lexer.h"

   lexer::insymbol
  {
        struct __
       {
          static int eatcomment(lexer* plexer)
          {
             ...
          }
          static int eatnumber(lexer* plexer)
          {
              ...
          }
          static int eatstring(lexer* plexer)
          {
              ...
          }
          static int eatoperator(lexer* plexer)
          {
              ...
          }
       };
    
      ....
      __::eatnumber(this); //            
      ....
  };

今、補助関数を関数整理ボックスに入れました.同じようにクラスもグローバル環境も汚染されていません.コードを読むときは、まず整理箱を閉めて、細かく調べるときは、あれこれ探す必要はありません.直接開けてください.関数の調整があれば、整理も簡単です.下のコードは、整理箱にいくつかの包装をして、きれいに見えますが、箱が一気に閉まらないだけです.  
 #include "lexer.h"

   #define BOX_HEAD struct __ {
   #define BOX_TAIL };

   lexer::insymbol
  {
        BOX_HEAD
        static int eatcomment(lexer* plexer)
        {
            ...
        }
        static int eatnumber(lexer* plexer)
        {
            ...
        }
        static int eatstring(lexer* plexer)
        {
            ...
      }
      static int eatoperator(lexer* plexer)
      {
          ...
      }
      BOX_TAIL
    
      ....
      __::eatnumber(this); //            
      ....
  };  

6、...葛藤があればあるほど、解決方法があるが、多くの場合、いくつかの本に対応するように、葛藤すればするほど、解けない.