(57)【特許請求の範囲】
【請求項１】
コンピュータを、
それまでの処理が正常に終了した状態にあることを示す第１の値、または、それまでの処理が正常に終了していない状態にあることを示す第２の値のいずれかを記憶する記憶手段と、
前記記憶手段の記憶内容が前記第２の値でないかどうかを判断する判断手段と、
前記記憶手段の記憶内容を前記第２の値に変更する処理状態異常変更手段と、
予め定められた処理を行なう処理手段と、
前記処理手段における処理が正常に終了した場合には、前記記憶手段の記憶内容を前記第１の値に変更する処理状態正常変更手段と、
前記判断手段が前記記憶手段の記憶内容が前記第２の値でないと判断した場合に、前記処理状態異常変更手段、前記処理手段、前記処理状態正常変更手段を順番に動作させることを繰り返す制御手段と、
して機能させるための処理プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、処理を多段階に行なうためのプログラムと、そのようなプログラムを生産する方法に関する。
【０００２】
【従来の技術】
ある関数（ｆｕｎｃｔｉｏｎ）や手続き（ｐｒｏｃｅｄｕｒｅ）の処理をプログラミング言語により記述する場合、通常、その関数や手続きの処理の一部を処理するために、ライブラリ関数、システムコールや自分や他者により作成される関数・手続き（以下、「他の関数」という。）を呼び出す記述が行なわれる。
【０００３】
他の関数を呼び出した場合、何らかのエラーが発生する場合がある。エラーが発生した場合には、それまでに行なわれた処理が行なわれる前の状態に戻すなどのエラー処理を行なう必要がある。エラー処理としては、例えば、それまでにファイルがオープンされていた場合には、そのファイルをクローズしたり、メモリが確保されている場合には、そのメモリを破棄したりすること、などがある。
【０００４】
このため、従来においては、他の関数を呼び出した後で、エラーが発生したかどうかのチェックを行ない、もし、エラーが発生した場合には、エラー処理を行なう記述が行なわれていた。
【０００５】
図３は、従来の記述での処理の流れを説明するフローチャートを示している。ステップＳ３０１において、処理を行なう。例えば、他の関数を呼び出すことを行なう。ステップＳ３０２において、ステップＳ３００１の処理でエラーが発生したかどうかを判断し、もし、エラーが発生した場合には、ステップＳ３０２へ移行し、エラー処理を行なう。
【０００６】
図４は、このような、他の関数を呼び出すごとにエラーが発生したかどうかをチェックするプログラムの例を示す。このプログラムはＣ言語により記述され、ｆという関数を定義しており、ｉｎｐｕｔという名前のファイルから、所定のサイズのデータを読み、ｏｕｔｐｕｔという名前のファイルに書き込む処理を行なう。
【０００７】
３行目から５行目までは、ｆという関数で使用される局所変数を宣言している。
【０００８】
７行目において、ｉｎｐｕｔという名前のファイルを、ｏｐｅｎというシステムコール関数を呼び出すことにより、読み出し専用にオープンし、オープンの結果得られる整数値であるファイルディスクリプタの値をｉｎ＿ｆｄという変数に代入している。また、エラーが発生すると、ｏｐｅｎは負の値を返すので、ファイルディスクリプタの値が負になっているかどうかの判断を行ない、エラーが発生したかどうかの判断も行なっている。もし、エラーが発生した場合には、エラー処理として８行目が実行され、−１という値が返される。
【０００９】
１０行目においては、ｏｕｔｐｕｔという名前のファイルが作成され、書き込み専用にオープンされ、このときエラーが発生したかどうかも判断され、もしエラーが発生していれば、エラー処理として１１行目と１２行目が実行され、読み出し専用にオープンされたｉｎｐｕｔがクローズされ、−１が返される。
【００１０】
１４行目において、ｉｎｐｕｔから、データを読み、そのデータをｂｕｆという文字配列に格納するために、ｒｅａｄというシステムコールを呼び出し、ｒｅａｄが負の値を返したかどうかを判断することにより、エラーが発生したかどうかを判断している。もし、エラーが発生した場合には、エラー処理として１５行目から１８行目までが実行され、ｉｎｐｕｔ、ｏｕｔｐｕｔがクローズされ、ｕｎｌｉｎｋを呼び出すことにより、作成されたファイルであるｏｕｔｐｕｔを削除する。なお、ｓｉｚｅｏｆ  ｂｕｆとは、ｂｕｆという配列型の変数に割り当てられたバイト数を表わす。
【００１１】
２０行目において、ｂｕｆに格納されたデータを、ｗｒｉｔｅというシステムコールを用いて、ｏｕｔｐｕｔへ書き出す。このとき、ｗｒｉｔｅが負の値を返したかどうかにより、エラーが発生したかどうかが判断され、もし、エラーが発生した場合には、２１行目から２４行目がエラー処理として実行される。
【００１２】
ｗｒｉｔｅが正常に終了すると、２６行目、２７行目において、ファイルがクローズされ、２９行目において、処理が正常に終了したことを示すために０が返される。
【００１３】
また、近年では、エラーが発生したかどうかを判断せずに、エラーが発生した場合には、「例外」が他の関数から投げられるプログラミング言語が開発されている（例えば、非特許文献１参照。）。そのようなプログラミング言語では、例外をキャッチしてエラー処理を行なう記述が行なわれる。
【００１４】
また、プログラムの可読性などを向上させるために、データ指向のプログラミング方法論が提案されている（例えば、非特許文献２参照。）
また、プログラムのテストの程度を測定する指標として、「カバレッジ」という概念が用いられている。カバレッジとは、プログラムの記述のうち、実行に関する行の全てのうち、どれだけの行がテストにより実行されたかを示す指標である。このカバレッジの値が高くなるほど、すなわち、テストにより実行された行の数が多くなるほど、テストが十分に行なわれたことになる。
【００１５】
【非特許文献１】
クリスジャムサ，「Ｄｒ．ＪａｍｓａのＣ＋＋超入門」，第３版，アスキー，１９９９年3月，ｐ．２９３−３００
【非特許文献２】
山崎敏，「コードデザイン最前線Ｖｏｌ．０９」，ＳｏｆｔｗａｒｅＤｅｓｉｇｎ，技術評論社，２００３年１月号，ｐ．１００−１０７
【発明が解決しようとする課題】
しかしながら、エラー処理においては、それまでに行なわれた処理が行なわれる前の状態に戻すことを行なうので、以下のような課題がある。すなわち、後で処理が追加されると、その追加された処理より後の処理のエラー処理を修正する必要に迫られ、プログラムの変更の範囲が広くなってしまう。これにより、プログラムの生産性が上がらず、また、エラー処理の修正の漏れが発生し、バグが発生するなどの課題がある。
【００１６】
また、例外を用いることにより、一つの関数や手続きの中のエラー処理の記述を、一箇所に集めることができるという利点はあるが、エラー処理の中で、どこまで処理が行なわれて例外が発生したかを判断しなければならなくなり、以下に説明するようなカバレッジに関する課題がある。
【００１７】
また、テストにおいて、エラー処理が実行されないと、カバレッジが高くならない。例えば、図４に示したプログラムでは、正常に終了するテストに加えて、ｉｎｐｕｔのオープンに失敗するテスト、ｏｕｔｐｕｔのオープンに失敗するテスト、ｉｎｐｕｔの読み出しに失敗するテスト、ｏｕｔｐｕｔへの書き出しに失敗するテストを行なう必要がある。しかし、エラーによっては、発生させることが困難なものが少なくない。例えば、図４に示したプログラムでは、ｉｎｐｕｔが読み出し専用にオープンできたのに、ｉｎｐｕｔの読み出しに失敗する状態や、ｏｕｔｐｕｔがオープンできたのに、ｏｕｔｐｕｔへの書き出しに失敗する状態を作り出すにはかなりの困難が伴う。このため、様々なエラーを発生させることにテスト作業の大半が投じられ、テストの作成に時間がかかったりテストの実施に困難が生じたりする課題がある。
【００１８】
そこで、本発明においては、処理の追加が容易に行なえ、また、カバレッジを高くすることが容易になるプログラムと、そのようなプログラムの生産方法を提供することを目的とする。
【００１９】
【課題を解決するための手段】
本発明においては、それまでの処理が正常に終了した状態にあるかどうかを判断するステップと、そのステップにより、それまでの処理が正常に終了した状態にあると判断された場合には、処理が正常に終了していないと判断される状態にするサブステップと、処理を行なうサブステップと、そのサブステップの処理が正常に終了した場合には、処理が正常に行なわれたと判断される状態にするサブステップを処理ステップと、からなるステップと、を複数回、計算機に実行させるための処理プログラムを提供する。
【００２０】
これにより、それまでの処理が正常に終了した場合に処理が行なわれるようになり、エラー処理を減らすことができる。これにより、処理を追加する際のプログラムの変更範囲が狭くなり、また、テストにおいて、正常に処理が終了する場合のテストを行なうことだけでカバレッジを高くすることができ、課題が解決される。
【００２１】
また、本発明においては、以下のプログラム生産方法が提供される。すなわち、処理が正常に終了したかどうかを示す変数である処理状態変数を宣言する文を生成するステップと、処理状態変数に処理が正常に終了している値を代入する代入文を生成するステップと、処理状態変数の値によりそれまでの処理が正常に終了したかどうかを判断する文を生成するステップと、それまでの処理が正常に終了したと判断された場合には、（１）処理が正常に終了していないことにするサブステップと、（２）処理を行うサブステップと、（３）処理を行なうサブステップにおける処理が正常に終了した場合には、処理が正常に終了したことにするサブステップ次の３つのサブステップが実行されるための文を生成するステップと、を含む処理プログラム生産方法である。
【００２２】
これにより、処理を追加する際の変更範囲が狭くなり、カバレッジを高くすることができるプログラムを生産することができる。
【００２３】
【発明の実施の形態】
以下、本発明の実施の形態について、図を用いて説明する。なお、本発明は、以下に説明する実施の形態に何ら束縛されることなく、その要旨を逸脱しない範囲において、種々なる態様で実施することができる。
【００２４】
本発明に係る処理プログラムは、ユニットステップを、複数回、計算機に実行させるためのプログラムである。「複数回」とあるが、この意味するところは、同一のユニットステップを２回以上実行すること、あるいは、ユニットステップに分類されるが異なる２つ以上のユニットステップを実行すること、のいずれかである。
【００２５】
「ユニットステップ」とは、判断ステップと、処理ステップと、からなるステップである。
【００２６】
「判断ステップ」とは、それまでの処理が正常に終了した状態であるかどうかを判断するステップである。例えば、プログラムの状態を示す変数である処理状態変数を宣言しておき、その処理状態変数の値を調べて、それまでの処理が正常に終了した状態を示すかどうかを判断する。
【００２７】
「処理ステップ」とは、判断ステップにより、それまでの処理が正常に終了した状態にあると判断された場合には、処理状態異常変更サブステップと、処理サブステップと、処理状態正常変更サブステップと、を含むステップである。
【００２８】
「処理状態異常変更サブステップ」とは、それまので処理が正常に終了していないと判断される状態にするステップである。例えば、処理状態変数が宣言されている場合には、その処理状態変数に、処理が正常に終了しないことを示す値を代入するステップである。「処理が正常に終了していないことを示す値」とは、例えば、処理サブステップで発生することが予想されるエラーを示すエラー番号や、処理サブステップのあるファイル名と行番号などであってもよい。
【００２９】
「処理サブステップ」とは、処理を行なうステップである。
【００３０】
「処理状態正常変更サブステップ」とは、処理サブステップにおける処理が正常に終了した場合には、それまでの処理が正常に終了したと判断されるように状態を変更するステップである。例えば、処理状態変数が宣言されている場合には、その処理状態変数をクリアする。
【００３１】
図１は、ユニットステップにおける処理を説明するフローチャートを例示する。
【００３２】
ステップＳ１０１において、それまでの処理が正常に終了した状態であるかどうかを判断する。すなわち、ステップＳ１０１は、判断ステップである。ステップＳ１０１で、それまでの処理が正常に終了した状態であると判断された場合には、ステップＳ１０２へ移行し、そうでなければ、ステップＳ１０２移行をスキップする。
【００３３】
ステップＳ１０２において、それまので処理が正常に終了していないと判断される状態にする。すなわち、ステップＳ１０２は、処理状態異常変更サブステップである。
【００３４】
ステップＳ１０３において、処理を行なう。すなわち、ステップＳ１０３は、処理サブステップである。
【００３５】
ステップＳ１０４において、ステップＳ１０３の処理が正常に終了したかどうかを判断する。もし、処理が正常に終了したと判断される場合には、ステップＳ１０５へ移行し、そうでなければ、ステップＳ１０５をスキップする。
【００３６】
ステップＳ１０５において、それまでの処理が正常に終了したと判断されるように状態を変更する。すなわち、ステップＳ１０３の処理までの処理が正常に終了したと判断されるように状態を変更する。したがって、ステップＳ１０５は、処理状態正常変更サブステップである。
【００３７】
このようなユニットステップを記述することにより、ステップＳ１０３の処理が正常に終了するテストを実行することで、図１の全てのステップが実行されることになる。なお、ステップＳ１０３の処理が正常に終了しなかった場合のエラー処理が必要となるが、このエラー処理は、後に例示されるように、関数あるいは手続きの終了処理に統合することができる。これにより、例外を用いるプログラミング言語では、エラーが発生した場合と正常に終了する場合との２つの終了処理が必要となるが、本発明のプログラムでは、終了処理が統合されることになる。
【００３８】
図２は、図４に示したプログラムの処理を、本発明の処理プログラムの形式により記述したプログラムを例示する。
【００３９】
３行目から６行目までが、変数を宣言している。このなかで、特に、６行目に宣言されるｓｔａｔｕｓが処理状態変数である。ｓｔａｔｕｓの値が０であれば、それまでの処理が正常に終了したことを表わし、−１であれば、それまでの処理が正常に終了しなかったことを表わす。
【００４０】
８行目から１０行目までが、宣言された変数の初期化を行なう部分である。特に、８行目において、処理状態変数であるｓｔａｔｕｓの値を、０に初期化している。
【００４１】
１２行目から１６行目までが、第一のユニットステップである。１２行目で、それまでの処理が正常に終了したかどうかを判断している。それまでの処理が正常に終了していると判断された場合には、１３行目から１５行目までの部分が実行される。１３行目において、ｓｔａｔｕｓに−１を代入し、それまでの処理が正常に終了していないと判断される常態にする。１４行目において、ｏｐｅｎを呼び出し、ｉｎｐｕｔというファイルを読み出し専用にオープンし、ｏｐｅｎの返す値をｉｎ＿ｆｄに代入するとともに、その代入された値を見て、オープンが正常に終了したかどうかを判断している。もし、オープンが正常に終了した場合には、１５行目が実行されることにより、ｓｔａｔｕｓに０が代入され、それまでの処理が正常に終了したと判断される常態にする。
【００４２】
１７行目から２１行目までが、第二のユニットステップである。１７行目で、それまでの処理が正常に終了したかどうかを判断している。それまでの処理が正常に終了していると判断された場合には、１８行目から２０行目までの部分が実行される。１８行目において、ｓｔａｔｕｓに−１を代入し、それまでの処理が正常に終了していないと判断される常態にする。１９行目において、ｏｕｔｐｕｔというファイルを書き込み専用にオープンし、ｏｐｅｎの返す値をｏｕｔ＿ｆｄに代入するとともに、その代入された値を見て、オープンが正常に終了したかどうかを判断している。もし、オープンが正常に終了した場合には、２０行目が実行されることにより、ｓｔａｔｕｓに０が代入され、それまでの処理が正常に終了したと判断される常態にする。
【００４３】
２２行目から２６行目までが、第三のユニットステップである。２２行目で、それまでの処理が正常に終了したかどうかを判断している。それまでの処理が正常に終了していると判断された場合には、２３行目から２５行目までの部分が実行される。２３行目において、ｓｔａｔｕｓに−１を代入し、それまでの処理が正常に終了していないと判断される常態にする。２４行目において、ｒｅａｄにより、ｉｎｐｕｔに格納されているデータをｂｕｆという配列形の変数に読み取ることを行ない、読み取りが正常に終了したかどうかを判断している。もし、正常に終了した場合には、２５行目が実行されることにより、ｓｔａｔｕｓに０が代入され、それまでの処理が正常に終了したと判断される常態にする。
【００４４】
２７行目から３１行目までが、第四のユニットステップである。２７行目で、それまでの処理が正常に終了したかどうかを判断している。それまでの処理が正常に終了していると判断された場合には、２８行目から３０行目までの部分が実行される。２８行目において、ｓｔａｔｕｓに−１を代入し、それまでの処理が正常に終了していないと判断される常態にする。２９行目において、ｗｒｉｔｅにより、ｏｕｔｐｕｔへｂｕｆに格納されているデータを書き出すことを行ない、書き出しが正常に終了したかどうかを判断している。もし、正常に終了した場合には、３０行目が実行されることにより、ｓｔａｔｕｓに０が代入され、それまでの処理が正常に終了したと判断される常態にする。
【００４５】
３２行目以降は、前述した終了処理の部分である。一般に、本発明の処理プログラムでは、初期化が行なわれた変数に対応して終了処理が記述され、この記述とともに、エラー処理が記述される。３２行目と３３行目は、ｉｎ＿ｆｄという変数に関する終了処理であり、ｉｎ＿ｆｄに正の値が代入されていれば、ｉｎｐｕｔがオープンされているので、３３行目でファイルをクローズする。３４行目から３８行目までは、ｏｕｔ＿ｆｄという変数に関する終了処理である。ｏｕｔ＿ｆｄに正の値が代入されていれば、ｏｕｔｐｕｔがオープンされているので、３５行目でクローズする。また、ｓｔａｔｕｓの値が−１であれば、ｏｕｔｐｕｔがオープンされたが、処理全体が正常に終了しなかったので、ｏｕｔｐｕｔをｕｎｌｉｎｋにより削除することを３７行目で行なう。
【００４６】
３９行目で処理が正常に終了したかどうかを、ｓｔａｔｕｓの値を返すことにより伝える。
【００４７】
図２に例示したようなプログラムにおいては、全ての処理が正常に終了するテストを行なうことにより、３７行目除く全ての実行に関する行が実行されることになるので、カバレッジを高くすることが容易である。
【００４８】
なお、３７行目が実行されるテストを行なうのは困難である。しかし、ｕｎｌｉｎｋがプログラムの他の場所でも使用されている場合には、以下のようにすることにより、全ての処理が正常に終了するテストにより、全ての実行に関する行が実行されるようにすることができる。
【００４９】
すなわち、ある条件が成立した場合に、特定の処理を実行するような関数を用意する。３７行目に対応しては、例えば、以下の関数を用意する。
【００５０】
【式１】
ｕｎｌｉｎｋ＿ｏｎ＿ｃｏｎｄｉｔｉｏｎ（ｃｈａｒ  ＊ｆｉｌｅｎａｍｅ，  ｉｎｔ  ｃｏｎｄｉｔｉｏｎ）  ｛  ｉｆ  （ｃｏｎｄｉｔｉｏｎ）  ｕｎｌｉｎｋ（ｆｉｌｅｎａｍｅ）；  ｝
そして、３６行目と３７行目を、次の行に置き換える。
【００５１】
【式２】
ｕｎｌｉｎｋ＿ｏｎ＿ｃｏｎｄｉｔｉｏｎ（“ｏｕｔｐｕｔ”，  ｓｔａｔｕｓ＝＝−１）；
また、プログラムの他の箇所で、例えば、無条件にｕｎｌｉｎｋを呼ぶ箇所があれば、その箇所を、次の行に置き換える。
【００５２】
【式３】
ｕｎｌｉｎｋ＿ｏｎ＿ｃｏｎｄｉｔｉｏｎ（ファイル名，１）；
なお、ｕｎｌｉｎｋの引数を「ファイル名」とした。
【００５３】
以上は、ｕｎｌｉｎｋを用いて説明したが、他の処理、例えば、メモリ領域の破棄などにも応用することができる。
【００５４】
また、一般にＣ言語のようなブロック構造をもつプログラミング言語においては、一つのユニットステップに対してブロック構造が記述されるので、そのブロック構造で局所的な変数を宣言することにより、変数の有効範囲を狭くすることができるので、プログラムの読みやすさも向上する。
【００５５】
【発明の効果】
本発明の処理プログラムによれば、カバレッジを高くすることが容易となり、テストの作業効率が改善される。また、エラー処理が終了処理とともに記述されるので、処理の追加により修正すべき個所が多くならない。また、本発明の処理プログラム生産方法によれば、カバレッジを高くすることが容易な処理プログラムを生産することができる。
【図面の簡単な説明】
【図１】ユニットステップにおける処理の流れを例示するフローチャート
【図２】本発明に係る処理プログラムの一例図
【図３】従来の記述での処理の流れを説明するフローチャート
【図４】従来の記述でのプログラムの一例図
【符号の説明】
Ｓ１０１  判断ステップ
Ｓ１０２  処理状態異常変更ステップ
Ｓ１０３  処理サブステップ
Ｓ１０４  処理サブステップの処理が正常に終了したかどうかを判断するステップ
Ｓ１０５  処理状態正常変更ステップ
【図１】
0003942546.tif 000002
【図２】
0003942546.tif 000003
【図３】
0003942546.tif 000004
【図４】
0003942546.tif 000005