2024/04/11

関数のインターフェースと独立性

最近『チーム開発』のラベルを付けて、記事を書いています。中でも『変数や関数の宣言とスコープ』や『関数の独立性』など、作成するプログラムをシンプルにする方法を紹介しました。

今回もその一環で、関数のインターフェースという側面でまとめます。


引数とは?

関数には通常引数が存在しますよね?

引数の役割は、一般的には関数内に値を渡すことを目的としています。

例えば、ある整数までの合計を算出して結果を返す関数を考えます。次のようなコードになるかと思います。

Function xSum(viIndex As Integer) As Integer
   Dim i As Integer
   Dim iSum As Integer

   iSum = 0
   For i = 1 To viIndex
      iSum = iSum + i
   Next

   xSum = iSum
End Function

この関数をメインプログラム(コールする側)では、次のように記述します。

   iTotal = xSum(10)

このように記述することで、1 から 10 までの総和が関数で算出され、最終定期に iTotal に結果が代入されます。

このメインプログラムの 10 を関数側の viIndex で受け取ります。このように、値を受け渡しする機能を引数と言います。

関数の定義では ( ) 内に引数を定義します。

Function xSum(viIndex As Integer) As Integer

この機能を利用すると、関数は、 5 までの総和、50 までの総和でも計算できる汎用的な機能を持ち、再利用しやすい状態にできるということですね。値(引数)を渡すとそれに見合った結果を返す、”関数” と呼ばれる所以ですね。


戻り値

先ほどの関数の定義は以下のようになっていました。

Function xSum(viIndex As Integer) As Integer

xSum が関数名と言い、外部のプログラムからアクセスするための名前です。前述の通り ( ) 内が引数、As 以降が戻り値の定義です。”As Integer” で戻り値は Integer 型だと宣言しています。

関数内では関数名が変数のように振舞い、そこに値をセットすることで戻り値を決定します。

   xSum = iSum
End Function

そして関数を抜けることにより、メインプログラムに戻り値を返します。これで関数内の結果がメインプログラムに与えられます。

   iTotal = xSum(10)

このように、関数名は変数のように振舞います。こういった側面では、関数と変数の宣言に大差がないことがわかりますね。


パブリック変数を使ってみたら

例えば上記関数をパブリック変数を使用して作成することはもちろん可能です。

Function xSum() As Integer
   Dim i As Integer
   Dim iSum As Integer

   iSum = 0
   For i = 1 To piIndex
      iSum = iSum + i
   Next

   xSum = iSum
End Function

呼び出し側では次のように記述することになります。

   piIndex = 10
         ・・・
   iTotal = xSum()

このように関数とパブリック変数の値のセットが近ければまだ救われます。しかし、

   Call xCalc()
         ・・・
   iTotal = xSum()

と記述されていたとしましょう。

たまたま xCalc() 関数を調査すると piIndex にアクセスしていました。

Function xCalc()
         ・・・
   piIndex = iOpt + 5
         ・・・
End Function

ただ、iOpt って何だろう...。という風に、芋づる式に調査範囲が広がります。


インターフェース

IT の世界では、インターフェースという言葉を頻繁に使用します。別のシステムとを接続するためのやり取りをする窓口的な意味合いで使用します。

先ほど紹介した関数の世界では、引数と戻り値が ”関数のインターフェース” になります。

パブリック変数など広いスコープが存在しない前提の場合、引数と戻り値以外のインターフェースが存在しないことになります。この前提に立つと、関数の機能は引数以外に影響を受けることはありません。独立性の高い関数となり、非常に閉じた世界のわかりやすいプログラムであることがわかります。

もし、パブリック変数を使用していた場合、その変数もインターフェースとなります。関数に与える影響を測定するには、先ほどの事例のように、関数を利用している箇所だけでなく、その変数にアクセスしている部分をすべて洗い出す必要があります。

どちらがメンテナンス性が高いか明白ですよね?


チーム開発とインターフェース

上記の通り、引数と戻り値以外、関数に影響を与えないようにすることで、独立性を高め、プログラムをシンプルにできます。スコープの広い変数を使用しないだけで、インターフェースを明確にできます。こういった点に配慮するだけで、後任者に伝わりやすいプログラムになると思います。

インターフェースを絞ったコーディングは少しだけ手間がかかります。しかし、一時の手間をかけるだけで、後任者の調査工数を削減する効果がありますので、是非ともチャレンジしてください。前回、独立性に関するお話を、部分的にでも具体的に紹介できたかと思います。参考になれば幸いです。

0 件のコメント:

コメントを投稿