tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルOptional の使用方法
記事No9685
投稿日: 2009/12/03(Thu) 08:32
投稿者はや
Optional の使用方法の質問です。

クラスライブラリ AAA があります。
この AAA の中に以下のコードがあります。
 Public Function Call_K(ByRef MODE As String, _
   Optional ByVal TAISYO As String = "A") As Boolean
  ・・・・ 中身略

Call_K を、呼び出すプログラムは数十本あります。

今回 Call_K の変更で、引数を増やしたいと考えています。
変更した結果
 Public Function Call_K(ByRef MODE As String, _
   Optional ByVal TAISYO As String = "A" , _
      Optional ByRef NM1 As String = "" ) As Boolean
  ・・・・ 中身略
としました。

見本で引数 NM1 を指定するプログラムは正常に動作するのですが、他の未コンパイルのプログラムは
「System.MissingMethodException: メソッドが見つかりません: ・・略 ・・」
で、エラーになってしまいます。

Optional を指定し、ディフォルト値も指定しているので、コンパイルしなくてもDLLの差し替えだけでいけると思ったのですが、この考えは間違えでしょうか?

AAA を呼び出すプログラムは全て再コンパイルになるのでしょうか?

以上、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: Optional の使用方法
記事No9686
投稿日: 2009/12/03(Thu) 09:34
投稿者魔界の仮面弁士
> Optional の使用方法の質問です。
理由は幾つかありますが、Optional な引数を多用する事は避けた方が良いでしょう。

たとえば、省略可能な引数を用いた
 Sub Foo(ByVal a As Integer, Optional ByVal b As Integer = 123)
  '何かの処理
 End Sub
というメソッドを用意する代わりに、オーバーロードを用いて
 Sub Foo(ByVal a As Integer)
  Foo(a, 123)
 End Sub
 Sub Foo(ByVal a As Integer, ByVal b As Integer)
  '何かの処理
 End Sub
として実装しておいた方が、問題が出にくく、後々の拡張もやりやすくなるかと。

# といっても、既に Optional として実装してしまっている場合には、
# 今更それを変更すると、大がかりな修正になってしまうでしょうから、
# これは今後の話と思っておいてください。


> Optional を指定し、ディフォルト値も指定しているので、
たとえば、以下の物を変更した場合、別のメソッド定義とみなされます。
・メソッドの名前
・Sub/Functionの変更
・戻り値の型
・引数の個数
・引数の型
・ByVal/ByRef
・Optionalの付与/除去
・ParamArrayの付与/除去


> コンパイルしなくてもDLLの差し替えだけでいけると思ったのですが、この考えは間違えでしょうか?
CallByName を使うなど、レイトバインドで処理される場合にはその通りですが、
参照設定してアーリーバインドされたコードの場合は NG です。
メソッド定義が異なるため、「そんなメソッドは見当たりません」として
MissingMethodException が発生してしまうことでしょう。


再コンパイルの手間を省きたいのであれば、以前のメソッド定義は残しておいてください。
その上で、引数の異なる同名メソッドをオーバーロードするなどの手法で
解決出来るかと思います(クラス継承やインターフェイス実装を行っている場合は制限あり)。


ただし、省略可能引数のみが異なるメソッドのオーバーロードは
VB.NET では許可されていない点に注意してください。

また省略可能な引数は、C# ではサポートされない(4.0からのサポート)ため、
複数言語混在での開発時にも扱いにくいものとされています。

それゆえ、Optional を使わないで済むのであれば、普段から
使わないようにしておいた方が無難かと思いますよ。

[ツリー表示へ]
タイトルRe^2: Optional の使用方法
記事No9687
投稿日: 2009/12/03(Thu) 10:05
投稿者はや
魔界の仮面弁士さん、先日に引き続き早速のアドバイスありがとうございます。

正直、オーバーロード・レイトバインド・アーリーバインドなどの用語の意味がわかっていない為、完全にはアドバイスを理解することはできていませんが、総括して今回やろうとしていることは、ほぼ呼び出し元のプログラムの再コンパイルが必要と考えます。

>たとえば、以下の物を変更した場合、別のメソッド定義とみなされます。
この部分は今後のDLL作成に非常に参考になります。

オーバーロードに関して、勉強したいと思います。

ありがとうございました。

[ツリー表示へ]