2025/02/17

”コボラー” に気をつけろ!?

以前に『変数や関数の宣言とスコープ』をいう記事を投稿しました。

ビジネスでチーム開発を行うのであれば、

  • チーム開発を意識したプログラミングではスコープはできる限り絞った方が良い
  • そうすれば後任者がプログラムの解読時間が短くなる
  • 『動けばいいのではなく後任者にも配慮する』開発者のビジネスマナー

というまとめをさせていただきました。先日、この記事を思い出すプログラムに出くわしたので紹介します。

今回の記事では、COBOL 開発者に触れていますが、COBOL 開発者全体を区別する話ではありません。今回出くわしたプログラムの開発者が『COBOL 開発者だったのではないか?』という想定の下、そのコーディング癖について記載したものです。決して COBOL の言語仕様や開発者全体を揶揄するものではありません。予めご了承ください。


問題のプログラム

生々しいコードをそのまま出すわけにもいかないので、別ライブラリとして抽出してみました。

プログラムの全体は次の通りです。

Private xV01 As Variant
Private xV02 As Variant
Private xV03 As Variant
Private xV04 As Variant
Private xV05 As Variant
Private xV06 As Variant

Public Sub UpdateContorolItems(vndTarget As NotesDocument, vsType As String)
   Dim iYear As Integer
   Dim iMonth As Integer

   iYear = Year(Today())
   iMonth = Month(Today())
   If iMonth < 4 Then
      iYear = iYear - 1
   End If

   ReDim xV01(0)
   ReDim xV02(0)
   ReDim xV03(0)
   ReDim xV04(0)
   ReDim xV05(0)
   ReDim xV06(0)

   If vsType = "1" Then
      xV01(0) = Format(Today(),"yyyy/mm/dd")
      xV02(0) = iYear
      xV03(0) = iYear + 1
      xV04(0) = CStr(iYear + 1) & "/04/01"
      xV05(0) = CStr(iYear + 2) & "/03/31"
   ElseIf vsType = "2" Then
      xV01(0) = Format(Today(),"yyyy/mm/dd")
      xV02(0) = iYear
      xV03(0) = iYear
      xV04(0) = Format(Today(),"yyyy/mm/dd")
      xV05(0) = CStr(iYear + 1) & "/03/31"
   End If
   xV06(0) = vsType

   vndTarget.CrtYMD = xV01
   vndTarget.Year_1 = xV02
   vndTarget.Year_2 = xV03
   vndTarget.DateFrom = xV04
   vndTarget.DateTo = xV05
   vndTarget.AppType = xV06
End Sub

プログラムの機能はさておき、プログラムの構造について感じることはありませんか?


私が気になった点は次の 2 点です。

  1. 変数がライブラリで Private 宣言されていてスコープが広い
  2. フィールドに設定したい値を変数に入れて最後にまとめて文書にセットしている

この癖がコボラーっぽいと感じた理由です。というのも COBOL のプログラムは以下の 4 つに分けて記述します。

  • IDENTIFICATION DIVISION(見出し部)
  • ENVIRONMENT DIVISION(環境部)
  • DATA DIVISION(データ部)
  • PROCEDURE DIVISION(手続き部)

ざっくりいうと DATA DIVISION で入出力ファイルの定義などを行い、PROCEDURE DIVISION にプログラムを書くという感じです。ファイルの定義はデータベースのレコードといっても差し支えないと思いますが、これに相当するのが Private 宣言されている変数たちということです。

COBOL ではファイルに値をセットしてそれをまとめて処理するのが一般的です。UpdateContorolItems 関数のコードを見ると値をいったん Private 変数にセットしてから最後に文書にまとめてセットしています。この書き方が COBOL を連想させるのです。


問題は ”コボラー” ではない

とはいっても、サンプルプログラムがわかりにくい理由は COBOL 的記述の癖が原因だけではありません。ざっと挙げるなら次の通りです。

  • xV01 など変数の役割を想像できない無意味な変数名
  • 単一の値をセットするのになぜか配列化して、要素 0 に値をセット
  • 変数が Variant 型となっており、データ型を意識していない

そして、前述しましたが

  • 変数が Private 宣言されていて、無意味にスコープが広い

という点も問題です。

この開発者の改善点は、2つです。

まず、言語仕様にあった適切なコーディングをすることです。Private 宣言された変数はライブラリ内のどこからでもアクセスできます。値がいつセットされて、どのように使われているかライブラリ全体を理解しないと判断できません。UpdateContorolItems 関数内で宣言すればその影響範囲は関数内だけになります。値を共有しないのであれば関数内で宣言すべきです。また、Variant 型ですべて解決するのではなく、適切なデータ型を使うことも必要ですね(データ型は COBOL にもあります)。

2つ目はコーディングの姿勢です。ビジネスでプログラミングするのであれば、”動けばいい” ではありません。動くのは当たり前で、その先の保守性など将来のことを見据えたコーディングができていないことが問題です。ビジネスでは自分のためではなく、(自分を含む)誰かのためにプログラミングしていることを忘れないようにしましょう。

このような理由から今回の問題は ”コボラー” に起因するのではなく、開発者個人の意識の問題だということがわかりますね。


最後に

今回の記事は COBOL について記載しておりますが、筆者は約 40 年ほど前に、工業高校の授業で文法と実習を1年間実施した経験しかなく、実務経験はありません。当時を思い出しながら記述しましたが、間違いがあった場合はご容赦くださいませ。

また、プログラムの掲載にあたり、スペルミスやローマ字混在の変数名を修正、無用な引数を削除しました。さらに、記事と無関係なコードや他の関数を削除しています。その結果、私が混乱し頭を抱えた状態より、ずいぶん見通しが良いプログラムとなってしまいました。

私が訴えたかったことが、うまく伝わればいいのですが...


0 件のコメント:

コメントを投稿