SQLを使用して重複ソースコードを検索する
ブライアン・トレーシー氏によると、「良い習慣は身に付けるのは難しいが人生をともにするのは簡単で、悪い習慣は身に付けるのは簡単だが人生をともにするのは難しい。あなたが身に付けている習慣とあなたを支配している習慣で、あなたが達成するか達成し損なうほぼすべてのことが決まる」のだそうです。この名言は、普段の生活において当てはまるのと同様に、プログラミングにおいても当てはまるようです。
残念なことに、良い作業習慣を身に付けようと努力している人でも、そうしなかった人の作業習慣に従わなければならないことがよくあります。時折出くわす悪い習慣の1つは、ソフトウェアエンジニアリングの業界でWETソリューションとして知られているものです。WETは、「write everything twice(何でも2度書く、同じことを繰り返す)」を略したものです。あるいは「we enjoy typing(タイピング大好き)」、さらには「waste everyone's time(みんなの時間を浪費する)」の略とされることもあるようです。これに対抗するのは、 DRY原則、すなわち「don't repeat yourself(同じことを繰り返すな)」です
つい先日、私は13,000行のRPGプログラムを修正する必要がありました。私の小さな頭脳が理解できるキャパシティーを越える作業でした。コードに繰り返しがあることは分かりましたが、私はどのようにして、それを見つけたでしょうか。私はSQLを使用しました。
ソースコードでSQLを使用するのは奇妙に思えるかもしれませんが、ソースコードはデータです。プログラマーから出力され、コンパイラーへ入力されます。ソースコードはソース物理ファイルに保存されるため、SQLを使用して照会することは(そしてそれを修正することさえも)、たやすいことです。
ソース物理ファイルには3つのフィールドがあり、それらは、Display File Field Description(ファイル・フィールド記述の表示)(DSPFFD)コマンドによって表示されます。それらのフィールドは、SRCSEQ(シーケンス番号)、SRCDAT(変更日)、およびSRCDTA(ソースデータ)です。ここではおそらく、ソース日付は無視してよいでしょう。
ソースメンバーを照会するために、エイリアスを作成します。ソース物理ファイル本体を照会する場合は、最初のメンバーにアクセスすることになりますが、これはアルファベット順の最初のメンバーではなく、最初に追加されたメンバーです。おそらくそれは照会したいメンバーではないことが多そうです。
この例では、抜け目なく、エイリアスにTEMPALIASという名前を付け、QTEMPライブラリーに置きました。SQLステートメントでTEMPALIASを参照すると、データベースマネージャーはライブラリーSOMELIBのソース物理ファイルSOMEFILEのメンバーSOMEMBRにアクセスします。
それでは、重複コードを探してみましょう。
私は、共通表式SOURCEから始めて、クエリーに含めたいレコードを選択しました。この式の重要な部分はWHERE節です。そこでクエリーに含めたいソースコードの行を指定するからです。私は、空白行と、列7にアスタリスクがある行と、後続の空白だけを除去しました。また、この例では、列6に空白がある行のみを選択するための行を含めています。13,000行のプログラムでは、これはフリーフォームの計算だけになることを意味しました。WHERE節は、分析するソース コードの種類(固定フォームRPG、フリーフォームRPG、DDS、CLなど)や、コードを書いた人の好みによって大きく異なったものになります。
メインクエリーで、私はソースメンバーをそれ自身と結合して、一致するがシーケンス番号が異なる行を探しました。1番目のファイルでのシーケンス番号が、2番目のファイルでのシーケンス番号より小さいレコードを選択することによって、結果セットのサイズを減らし、それでも私が探していた重複コードは見つかりました。
この例では、joinでTRIM関数を使用しました。これは、プログラム内のある場所から別の場所へコードをコピーしたことでコードの位置が移動した場合に備えてのことでした。他の状況では、空白のトリミングは行わなくてもよいのかもしれません。クエリーが完璧である必要はありません。それを本番稼働させるわけではないのですから。重複コードを見つけられれば良いのです。
もちろん、SQLを使用して、2つのソースメンバー間で重複したコードを探すこともできます。2つのエイリアスを作成する必要があるだけです。
SQLを使用して、他の人の仕事の手助けをしておられるのだと思います。だとしたら、ご自分の仕事の手助けをするのにSQLを使用しない手はないでしょう。