Top > Technology > 2:フローチャート図

2:フローチャート図


概要

 ルールソースコードをベースに、ソースコード(プログラム)の流れをフローチャート図として表します。

フローチャートにすることで、様々なプロフィットが得られます。 

 

1.理解の向上

プログラムの流れを視覚的にあらわすため、複雑なコードの理解を助けます。

これにより開発者や関係者のコードロジックの理解の手助けになります。

 

2.間違え(バグなど)の早期発見

コードロジックの矛盾や欠陥を発見しやすくなります。

 

3.保守性の向上 

プログラムのメンテナンスや拡張を行う際の指針となります。

新しい開発者がプロジェクトに参加する際も、フローチャートがあるこで、スムーズにコードベースに慣れることに期待を持てます。

 

4.ドキュメントの充実

プログラムのドキュメントとして役立ちます。将来的なシステムの改良などが必要になったとき、フローチャートがあることで詳細な理解の手助けをします。


弊社のフローチャート作成技術について

 

弊社のフローチャート作成には、マークダウン形式※を採用しております。マークダウン形式で作られた図は、テキストベースでつくられます。HTMIや画像ファイル、PDFなどアウトプットに対して幅広く対応するほか、テキストベースでつくられてますので、編集や更新も行え、ドキュメントとしての保存、管理にも適しています。

 

最近、利用者が増加傾向にある、生成AIなどにも本技術は活用できます。

生成AIでつくられるプログラムからフローチャートを素早く生成し、自己判断ができれば

短時間でプログラムが開発できます。

 

現在は、3つのプログラム言語に対応しております。(2024.6現在)

 ・RPG(AS/400シリーズ)※日本語変換対応

 ・COBOL ※日本語変換対応

 ・python

 

※マークダウン形式の中の mermaidを採用


フローチャート図の活用例

 

1:理解の手助け―1 日本語変換

COBOL、RPG(AS/400)に関してはソースコードについて、フローチャート図の表示についてソースコードを表示させるのではなく、ソースコードの日本語変換を実現させてます。

 

フローチャート図はプログラムソースコードに更に日本語変換を加えることで、より、一行一行の命令文が何を行っているかの理解の手助けになります。 

 

例です。

赤文字が変数名を表し、青文字は命令文と分けてます。変数名は、お客様の環境によってその解釈が様々です。日本語変数変換テーブルと呼ぶテーブルを設け、そのテーブルに沿って変換を実施することも可能です。テーブル変更はお客様要望で可能です。また、変数名をそのまま残すことも可能です。

データ項目例

ソースコード

DELETE EMPF

 

日本語表示(ソースコードから変換)

従業員ファイルのレコードを削除する

EMPFは従業員ファイルと解釈してます。



EVALUATE WRKNAME

 

選択文を開始する

入力従業員名を評価して条件に応じた処理を行う

WRKNAMEは入力従業員名と解釈してます。



WHEN "D"

 

入力従業員名「D」と等しい場合

WHEN文は対応するEVALUATE文の評価対象名に合わせて日本語に直します。


WHEN "D"

 

WRKNAME「D」と等しい場合

変数のままの場合の日本語表示です。評価対象となるWRKNAMEは日本語変換されません。



ACCEPT WRKNAME.

EVALUATE WRKNAME

     WHEN ""

         CONTINUE

     WHEN "D"

         DELETE EMPF

         DISPLAY "削除しました"

     WHEN OTHER

         MOVE WRKNAME TO EMPNAME

         REWRITE EMPF-REC

END-EVALUATE.

COBOLのソースコード、EVALUATE文(選択文)を図で表現したものです。

ここでは、ピンク:入力、緑:出力、ゴールド:選択文(EVALUATE)、黄色:WHEN文です。色は任意に設定可能です。 


・ソース例1(COBOL)

あるファイルのPROCEDURE DIVISION内のソース全体 5つのセクションがある

       PROCEDURE DIVISION.

       MAIN SECTION.

       MAIN-PROCEDURE.

            DISPLAY "社員ファイル修正".

            PERFORM INIT-RTN.

            PERFORM MAIN-RTN UNTIL EMPNO = 999.

            PERFORM END-RTN.

            STOP RUN.

       MAIN-END.

           EXIT.

       INIT-RTN SECTION.

       INIT-S.

           OPEN I-O EMPF.

       INIT-E.

           EXIT.

       MAIN-RTN   SECTION.

       MAIN-S.

           DISPLAY "社員番号を入れてください".

           ACCEPT  EMPNO.

           IF EMPNO = 999

               GO TO MAIN-E.

           READ  EMPF  KEY IS EMPKEY

             INVALID

                 DISPLAY "《追加》"

             NOT INVALID

                 PERFORM UPD-RTN

                 GO TO  MAIN-E

           END-READ.

           DISPLAY "社員名をいれてください".

           ACCEPT EMPNAME.

           WRITE EMPF-REC.

       MAIN-E.

           EXIT.

       END-RTN SECTION.

       END-S.

           CLOSE EMPF.

       END-E.

           EXIT.

       UPD-RTN SECTION.

       UPD-S.

           DISPLAY "《更新》".

           DISPLAY "社員名をいれてください:" EMPNAME.

           ACCEPT WRKNAME.

           EVALUATE WRKNAME

           WHEN ""

               CONTINUE

           WHEN "D"

               DELETE EMPF

               DISPLAY "削除しました"

           WHEN OTHER

               MOVE WRKNAME TO EMPNAME

               REWRITE EMPF-REC

           END-EVALUATE.

       UPD-E.

           EXIT.

プログラム全体のフローチャート図

クリックで拡大して表示します。



2:理解の手助け―2 複雑なネスト構造の把握

下記のソースコード例は、ネスト構造、ELSEやTHENの命令文が一行にまとめられている、おおよびEND-IFが省略されている※など、IF文がどこから始まり、どこで終わるなどの開始~終了などの構造が把握しにくいものになってます。 

 

弊社のフローチャート作成技術は、ただ図に表すだけでなく、こうした省略されているもの、および一行にまとめられているような一構文複数機能を有している命令文についてを一つ一つ解析し、それぞれ表示させるようにしてます。

 

そして、フローチャート化することにより、日本語変換した内容の理解の手助けに加え、ネストの構造などが把握しやすくなります。

ソース例2(COBOL)

下記はソースの中の一セクションのソースコード例です。IF文の中にIF文というネスト構造が多数みられます。

 

また、THENやELSE文が複数行であったり、単行であったり、END-IFが省略されていたりするなど、ソース自体のステップ数は短いですが、複雑なソースコードとなってます。

 

フローチャート図に表すことで、どの分岐でどの処理へ行き、その処理の内の更にどの分岐でどの処理へ進むかが可視化されるようになります。

       CHECK-DATE-RTN SECTION.

       CHECK1-S.

           MOVE  0 TO FLAG.

           IF DATEYY NOT NUMERIC

               THEN MOVE 1 TO FLAG

               ELSE

               IF DATEYY > CYY

                   THEN MOVE 19 TO DATECENT

                   ELSE MOVE 20 TO DATECENT.

           IF DATEMM NOT NUMERIC

               THEN MOVE 1 TO FLAG

               ELSE  IF DATEMM < 0 OR DATEMM > 12

                  THEN MOVE 1 TO FLAG.

           IF DATEDD NOT NUMERIC

               THEN MOVE 1 TO FLAG

               ELSE IF  DATEDD > DDT(DATEMM)

                  THEN MOVE 1 TO FLAG.

           IF FLAG = 1

               THEN DISPLAY "生年月日が正しくない".

       CHECK1-E.

           EXIT.

※特殊な日本語変換

ELSEは「そうでない場合」、THENは「条件を満たす場合」

END-IFは「条件文を終了する」

THENおよび、END-IFが省略されている箇所は追加して、可視化します。



3:早期間違えの発見

一見すると同じようなソースだがこの2つのpythonソースには違いがあります。

 

例のプログラムは「じゃんけん」のプログラムです。

 

ユーザーがじゃんけんの手を出し、コンピューターも手を出し勝負をします。引き分けならもう一度勝負を繰返し、勝ち負けがつくまで、実行するという要件定義をもつプログラムです。

ソース例3_1(python)

要件に沿った通常のソース

import random

 

# じゃんけんの選択肢

choices = ["グー", "チョキ", "パー"]

 

while True:

    # ユーザーの入力

    user_choice = input("グー、チョキ、パーの中から選んでください: ")

 

    # コンピューターの選択

    computer_choice = random.choice(choices)

    print("コンピューターの選択: " + computer_choice)

 

    # 勝敗判定

    if user_choice == computer_choice:

        print("あいこです。もう一度選んでください。")

    elif (user_choice == "グー" and computer_choice == "チョキ") or \

         (user_choice == "チョキ" and computer_choice == "パー") or \

         (user_choice == "パー" and computer_choice == "グー"):

        print("あなたの勝ちです!")

        break

    else:

        print("あなたの負けです。")

        break

 

要件に沿った通常のフローチャート図

ソース例3_2(python)

要件とは一部誤りのあると思われるソース

import random

 

# じゃんけんの選択肢

choices = ["グー", "チョキ", "パー"]

 

# ユーザーの入力

user_choice = input("グー、チョキ、パーの中から選んでください: ")

 

 

# コンピューターの選択

computer_choice = random.choice(choices)

print("コンピューターの選択: " + computer_choice)

 

# 勝敗判定

if user_choice == computer_choice:

    print("引き分けです。")

 

elif (user_choice == "グー" and computer_choice == "チョキ") or \

     (user_choice == "チョキ" and computer_choice == "パー") or \

     (user_choice == "パー" and computer_choice == "グー"):

    print("あなたの勝ちです!")

else:

    print("あなたの負けです。")

 

 

要件とは一部誤りのあるフローチャート図


これは短いプログラム例ですが、可視化すると一目瞭然で、「引き分けならもう一度勝負を繰返し、勝ち負けがつくまで、実行するプログラム」としては、右の図は明らかにおかしいことがわかります。右側の図は繰返しが確認されません。今回の例のように短いステップ数であれば、目視ですぐに判断もできますが、長いステップ数になればなるほどソースの目視での判断は難しくなり、フローチャート図の効果はより期待できます。


4:呼出関係図

 

弊社のフローチャート作成技術はソースコードのフローチャート図だけでなく、ソースコードの中には、どの言語にもみられるサブルーチン(COBOLの場合は、セクション、pythonの場合はメソッドなど)ごとの処理が分かれていることが通例です。

このどのサブルーチンがどんな流れで呼び出されたかの関係図も合わせて作成してます。

 

この呼出関係図により、どのサブルーチンがどんな流れで呼び出されているのか、使われていないサブルーチンがないか(デッドコードがないか) など より確認しやすくなります。

以下は、例1のCOBOLソースコードのセクション関係図です。この図を見るかぎり、

MAINセクションに始まり、INIT-RTNおよびMAIN-RTNおよびEND-RTNが呼び出されているのがわかります。また、MAIN-RTNからUPD-RTNが呼び出されていることもわかり、どのセクションも使われていることがわかります。

 

PERFORM は 呼出です。呼出元 -- perform--> 呼出先 で呼出関係を示してます。

呼出が見られないサンプル例(RPG(AS/400シリーズ)プログラムにおいて

 

以下の例はステップ数が1000近くあるソースのサブルーチンの関係を図を表したものです。

 

赤色枠は、呼出関係が見つからないものとして表示されたサブルーチンです。

赤色枠が表示されているということは、使われないサブルーチンという結果を返しております。使われないサブルーチンはデッドコードの可能性があります。このようなデッドコードの早期発見などの使い方にも役立ちます。


プログラム本体


サブルーチン


別プログラム



呼出なしサブルーチン(呼出元未検出サブルーチン)

このサブルーチンは図をみると、どこからも呼び出されておりません(浮島になります)。不要なサブルーチン、つまりデッドコードの可能性があります。


C演算仕様書 サブルーチン関係図

※+EXSR(Execute Subroutine):サブルーチン呼出 /

 +CALL:プログラム呼出 / calls:呼び出す

※赤色枠は、呼び出しがみつからないサブルーチンです。


フローチャート図の作成サンプルの例については、

以下のリンクにおいてまとめております。

 

フローチャート図サンプル集へ