ネスティング

構造化プログラミングにおけるネスティング（）、ネスト、入れ子とは、プログラムの構造が再帰的に繰り返されて記述されること。このような構造をネスト構造（）、入れ子構造と呼ぶ。この記事ではC言語風の擬似コードを用いるが、ネスティングの概念はC言語に限らない。また、名前空間などC言語にない機能についても記述している。

 概要 
ネスティングするものには例えば以下がある。
制御構造 - if文、switch文、for文、while文などを内包。これによって実際の処理を示す。
データ構造 - 構造体、クラス、インタフェースなどを内包。プログラム内でのデータの管理方法を示す。
副プログラム - サブルーチン、プロシージャ、コルーチンなどを内包。処理の管理。
名前空間 - 名前空間の内部に別の名前空間を配する。
例えば、二分木と呼ばれるデータ構造はデータ構造のネスティングの好例である。

制御構造におけるネスティング
制御構造（分岐命令、ループ命令）のネスティング。スコープが入れ子になっている。

 条件文のネスティング 
以下の例では条件式1を判定して判定結果が"真"であるなら条件式2を判定し、条件式2の判定結果も"真"なら条件式3を判定する。条件式3も同様に判定結果が"真"であるなら処理1、処理2、処理3を全て処理した後に入れ子から脱出するが、それまでに条件式2が"偽"なら処理3だけを、条件式3が"偽"なら処理2と処理3をして入れ子から脱出する。

（C言語風での記述）
if (条件式1){
   if (条件式2){     // ここの「if」は一番上の「if」の入れ子
      if (条件式3){   // ここの「if」は一つ上の「if」と一番上の「if」の入れ子
         処理1;
      }
      処理2;
   }
　 処理3;
}

 ループ文のネスティング 
基本的に上述の条件文と動きが似ているため、記述も似ている。ループ文同士での入れ子はループ文を多用するために、プログラミングのミスによるバグの一つである無限ループが発生しやすくなる。

一番外側から順番に条件式を判定して行き、条件式の値が満たされなくなるまで内側の処理を繰り返していく。

（C言語風での記述）
for (int x = 0; 条件式1; x++){
   for (int y = 0; 条件式2; y++){   //ここの「for」は一番上の「for」の入れ子
      for (int z = 0; 条件式3; z++){ //ここの「for」は一つ上の「for」と一番上の「for」の入れ子
          処理1;
      }
      処理2；
   }
   処理3;
}

 ループ文と条件文が混合したネスティング 
一番外側から順番に条件式を判定して行き、条件式の値が満たされなくなるまで内側の処理を繰り返していく。ただし外側から二番目のループ文では、条件式3の判定結果が真のときは処理1を、偽のときは処理2を処理する。

（C言語風での記述）
for (int x = 0; 条件式1; x++){
   for (int y = 0; 条件式2; y++){ //ここの「for」は一番上の「for」の入れ子
      if (条件式3){                //ここの「if」は一つ上の「for」と一番上の「for」の入れ子
          処理1;
      }
      else{
          処理2;
      }
　 }
}

データ構造におけるネスティング
構造体、クラス、インタフェースにおけるネスティング。

 構造体のネスティング 
構造体がメンバとして何らかの構造体を持っている状態は、構造体をネストしていると言える。

struct Point
{
	int x;
	int y;
};

struct BitmapImage
{
	struct Point size;
	unsigned char *image;
};

 副プログラムにおけるネスティング 
サブルーチン、プロシージャ、コルーチンにおけるネスティング。単に別のサブルーチンなどを呼び出すだけの場合や再帰呼び出しを指す場合もある。

 サブルーチンのネスティング 
以下の例はgccでのみコンパイル可能。
void message(void){
	void hello(){  }// ネストされた関数定義
	hello();　//ネストされた関数の呼び出し
}
//ここではhello()は呼び出せない

 名前空間のネスティング 
記述方法は先述のデータ構造の入れ子に酷似している。名前空間を分けることでサブルーチンなどの名称が競合するのを防止する。C言語には名前空間の機能はない。
namespace 名前空間1{
	namespace 名前空間2{
		int func(){} //名前空間1::名前空間2::func()のようにアクセスさせることが多い
	}
}

 関連項目 
 プログラミング 
関数
プログラミング
プロシージャ
重複コード
再帰

 その他 
入れ子

 外部リンク 
IT用語辞典-入れ子

ねすていんく