状況指向プログラミングのパラダイム

ご存知のように、線形、分岐、および循環の3種類のアルゴリズムがあります。



画像



オブジェクトプログラミングを含むプログラミング方法論で行われたすべての基礎は、1970年代にEdsger Dijkstroyによって提案された構造プログラミングになりました。 主なアイデアの1つは、問題のあるGOTO演算子の代わりに、ブロック分岐演算子(IF、THEN、ELSE)および周期性(WHILE、FOR、DO、UNTILなど)を導入することでした。



インテリジェントシステムで使用する場合、構造プログラミングには重大な欠点があります。 知的システムは、学習プロセスの存在を意味します-教師との学習による行動の変化、または自分の観察に基づいて経験が得られること。 このような動作の変更は、特別なメタプログラミングツールによって実行する必要があり、最終的には知的プログラムのソースコードの変更につながります。 構造プログラミングのブロックパラダイムの欠点は、一部のブロックを他のブロックに無制限にネストできることです。 1つのブロックのコードを不適切に修正すると、ネストされたブロック、および場合によってはより高いレベルのブロックの誤った動作につながる可能性があります。 このようなソースコードの変更には、特別な訓練を受けた人(ソフトウェア開発者)が必要です。変更を行う前に、修正を目的とするコードブロックだけでなく、埋め込みおよび隣接ブロックも学習する必要があります。



特に難しいのは、プログラミングへの構造的アプローチの「文字列依存性」です。 つまり、特定の変数の値は他の変数の値と関連付けることができるため、特定の変数の値の変更は特定のコード行で行う必要があります。 したがって、誤った行の選択は重大なエラーにつながる可能性があり、さらに、本質的に非体系的であり、検出が困難になる可能性があります。



これはすべて、準備のできていない人がプログラムのソースコードを変更するのに一定の困難をもたらし、プログラムがそれ自体を変更することをほとんど不可能にします。



状況指向プログラミングのパラダイムでは、ソースコードで直接分岐アルゴリズムとループの使用を回避しようとします。 代わりに、2番目と3番目のタイプのアルゴリズムは、状況を記述するための別個のメカニズムに配置されます。 したがって、ソースコードは線形アルゴリズムにすぎません。 プログラムコードを開発する手順は、一連のシチュエーションを宣言し、それぞれの状況にハンドラーを割り当てることに簡略化されています。



シチュエーションは、分岐アルゴリズムまたはループアルゴリズムの条件式に類似しています。 この状況は、プログラム変数の値の状態を一意に説明します。 シチュエーションに記述されているすべての変数が指定された値を取得するとすぐに、シチュエーションハンドラーが制御を取得し、そのソースコードが実行されます。 シチュエーションハンドラーは、ごく少数の命令の線形アルゴリズムです。



このアプローチにより、コードの残りの部分に関係なく、特定の状況のハンドラーを変更できます。 変数を変更するのに適した場所を検索する必要はありません。 システム自体は、特別な実行優先度メカニズムを使用してこれを処理します。 つまり、2つのハンドラーのうち、変数の値が変更されるハンドラーが最初に呼び出され、その後、この変数の値が使用されるハンドラーが呼び出されます。



suto指向のアプローチとブロックアプローチの違いは、例を使用して検討できます。 元の文字列「ABCABCABC」から文字「C」をすべて削除して結果を出力するCプログラムがあるとします。 このようなプログラムのソースコードは次のようになります。



画像



このようなプログラムの結果は次の行になります。
ABABAB
      
      







- :



image



. i , i S2, i, s[i]!=c. s[0]=='A', s[i]!=c . S2 :



s[j]=s[i];
j=j+1;

      
      





S2 S1, i. S1 i :
i=i+1;

      
      





i S2 S1. s. , s[i] «C», S2 , s[i]!=c .



, s '\0', S3. S3 , s[i]=='\0' . S3 :
  S1;
s[j]='\0';
printf ("%s\n", s);

      
      





, S3 S1. S1 , . . , , , «ABABAB» .



, , , 'C' s. «ABCABAB».



k — '' s, , , k==1:



image



, . -, if (s[i]==c) , FOR. , . FOR, . -, FOR , . -,



k++;
if (k==1) s[j++]=s[i];

      
      







. . , .



, , , :



  1. , «C», 'C' s.
  2. , 'C' , .


, , . - :



image



, - :






All Articles