• ベストアンサー

自作したメソッド・・・引数はなるべく省略すべき?(VB2005)

自作したメソッドに関して、引数はなるべく設定するべきでしょうか?それとも、引数は省略できるなら省略したほうがよいでしょうか? 下記(a)、(b)は例です。 a)引数はなるべく省略   ---------------------------------   Private Sub hoge()     Call foo()   End Sub   Private Sub foo()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     '処理   End Sub   --------------------------------- b)あえて引数を設定   ---------------------------------   Private Sub hoge()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     Call foo(hoga)   End Sub   Private Sub foo(ByVal hoga As integer)     '処理   End Sub   --------------------------------- 現在、(b)のようにあえて引数を設定したほうが、呼び出し先のメソッドがどういう処理を行っているかを掴めていいかな?と考え始めています。 ご助言よろしくお願い致します。

  • tekan
  • お礼率80% (46/57)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

引数は必要な分を設定するべきだと思います。 それを行う為に色々パターンを想定してメソッド作成に 臨むべきでしょう。 a)、b)の違いは#1の方も仰っている通りであり、 挙動として全くベツモノのメソッドになります。 ここで、a)もb)も可能性として存在する場合、 b)にした方がメソッドとしての利用価値が出てきます。 また、省略可能な引数とすることでもa)もb)も実現可能 となります。 例えば基本的にはある定まった値で処理するが、 例外的に指定された値で処理したい、など。   ---------------------------------   Private Sub hoge()     Call foo() '引数無し呼び出し     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     Call foo(hoga) '引数有り呼び出し   End Sub   Private Sub foo(Optional ByVal hoga As integer = Pbar)     '処理   End Sub   --------------------------------- 書き方が正しいかどうかは忘れました。 また、呼び元では呼び出し先でどういった処理を行っているかを 掴む必要はなく、それが何を行うメソッドなのか、必要なパラメータ は何か、どういった値が返却されるのかといったリファレンス さえ用意すればいいと考えます。

tekan
質問者

お礼

naktakさん 例を挙げていただきありがとうございます。 やはり(b)の形の方が、処理に幅があるのですね。 Optionalは存在そのものを忘れかけていました。。 >どういった値が返却されるのかといったリファレンス >さえ用意すればいいと考えます。 なるほど。。参考になります。 ご回答ありがとうございました。 ※以下のリンク先に、この質問の続きを用意しました。なにかご助言を頂ければ幸いです。 自作したメソッド・・・こんな場合、引数は省略すべき?(VB2005) http://oshiete1.goo.ne.jp/qa3410546.html

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

関数 foo() を見ると、 a) の場合は「Pbar のプロパティに対する操作」しかしません。Pbar に依存しています。 b) の場合は「整数に対する操作」ができます。 後者の方がモジュール化されていて、関数として適当だと思います。

tekan
質問者

お礼

koko_u_さん モジュールの構成として、引数の形は(b)であるべきなのですね。 基本を知ることができて良かったです。 ご回答ありがとうございました。 ※以下のリンク先に、この質問の続きを用意しました。なにかご助言を頂ければ幸いです。 自作したメソッド・・・こんな場合、引数は省略すべき?(VB2005) http://oshiete1.goo.ne.jp/qa3410546.html

関連するQ&A

  • 自作したメソッド・・・こんな場合、引数は省略すべき?(VB2005)

    #注)この質問は下記のリンク先の質問の続きとなります。 #未読の方はリンク先をお読みくださいませ。 # #自作したメソッド・・・引数はなるべく省略すべき?(VB2005) #http://oshiete1.goo.ne.jp/qa3409289.html 仮に、フォームにボタンが複数個あり(Name = btnA,btnB,btnC…)、いずれかのボタンをクリックすると、共通処理のモジュール「shori」を呼び出すプログラムを想定します。   コード   ------------------------------------------------   Private Sub btnA_Click()     Dim hoge As integer = Phoge 'a)プロパティの値を設定     Dim foo As integer = Pfoo  'b)     Dim bar As integer = Pbar  'c)     Call syori(hoge,foo,bar)   End Sub      Private Sub btnB_Click()     Dim hoge As integer = Phoge 'a)プロパティの値を設定     Dim foo As integer = Pfoo  'b)     Dim bar As integer = Pbar  'c)     Call syori(hoge,foo,bar)   End Sub    :    :      Private Sub shori()    'ボタンクリックイベントの共通処理     'd) 処理   End Sub   ------------------------------------------------ 引数を省略しない形だと、(a)~(c)のコードを、全てのボタンのClickイベントに書き込むことになり、コードが煩雑になります。こういった場合、引数を省略する形、つまり(a)~(c)のコードを(d)の箇所へ書き込む手法は積極的に行うべきでしょうか?(Call文の形は、syori() となる) ご助言よろしくお願い致します。

  • vb.net Charsメソッドについて

    vs2008、.NET Framework 3.5 にてvb.net の勉強をしているのですが、 下記のような場合にビルドエラーにならないことについて 疑問があります。 Public Class ClassA   Private Sub methodA()     Dim a As String = getString(1) ・・・★   End Sub   Private Function getString() As String     Return "abcdefg"   End Function End ClassA getStringメソッドには引数をとらないもののみが定義 されているので、methodAからgetStringメソッドを呼び出した 場合(★)は、ビルドエラーになると思うのですが、なりません。 a の値は"b"になります。 調べてみたところ、引数に1を設定したことによって、 Charsというメソッドが呼ばれているようなのですが、 それであれば、 Dim a As String = getString().Chars(1) と書くものだと思うのですが…。 こういう書き方もできるんだという話であればそれまでなのですが、 どうも腑に落ちないので、説明できる方がいらっしゃれば 教えていただきたいです。

  • プロパティを通さなければアクセスできない変数を設定したい(VB2005)

    下記はメンバ変数とプロパティのコードです。 -------------------------------------- 'メンバ変数 Private _hoge As Integer = 1 'プロパティ Private ReadOnly Property phoge()   Get     Return _hoge   End Get End Property -------------------------------------- 上記の構造だと、同じクラス内であれば、下記のようにメンバ変数へプロパティを通さずアクセスが可能です。 Private Sub aaa()   MessageBox.Show(_hoge)   ' 1 と表示される(ここでエラーを出したい) End Sub 質問内容は、変数_hogeに対してアクセスするには、(同じクラス内からのアクセスであっても)プロパティを通さなければならない形にしたい、というものです。 つまり、下記のような形でないとエラーが発生するようにしたいと考えています。 Private Sub aaa()   Dim foo As Integer = phoge()   MessageBox.Show(foo) End Sub どうぞよろしくお願い致します。

  • VBのfunctionの引数について

    2の Double型と 3の Single型のように送る側と受け取る側の変数の型が 違ってもよいのでしょうか?プログラムはそのまま実行できたのですが・・・・。 Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim koku As Integer Dim san As Integer Dim rika As Integer Dim ave As Double------------------------------------1 koku = Val(TextBox1.Text) san = Val(TextBox2.Text) rika = Val(TextBox3.Text) ave = (koku + san + rika) / 3 Label5.Text = Round(ave)-------------------------------2 End Sub Private Function Round(ByVal sngvalue As Single-----3) As Integer Dim intvalue As Integer intvalue = Int(sngvalue + 0.5) Return intvalue End Function End Class

  • VBScriptで引数を省略したい場合

    VBScript の Function、Sub プロシージャで引数を省略したい場合、Optional キーワードが使えないので、空文字を渡すようにしていますが、これは言語仕様的に正しいやり方でしょうか? Sub MyProc(ByVal a, ByVal b) . . . End Sub Call MyProc(a, "")   '← 引数 b は状況に応じて省略したい。 よろしくお願いします。

  • VB6で作成した自作DLLをVB.NETで呼び出し例外発生時に参照渡しの引数に値を設定する方法

    VB6で作成した自作のDLLをVB.NET2005で作成したEXEから呼び出した際に、DLLメソッドの正常・異常終了に関わらず第2引数の戻り値に第1引数の値を設定したいと考えていますが旨くいきません。 何かよい方法はないでしょうか? 以下、簡単なサンプルです。 =========================== VB6 DLL =========================== Public Sub getDataForTest(ByVal strIn As String, ByRef strOut As String) Dim intData As Integer 'strInの値をstrOutに代入 strOut = strIn 'strInの値を1で割り算 intData = CInt(strIn) / 1 End Sub =============================================================== =================== DLL呼び出し正常パターン =================== Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim objCom As New Project1.Class1 Dim strRet As String = "" Try Call objCom.getDataForTest("1", strRet) Catch ex As Exception MsgBox(ex.Message) Finally MsgBox(strRet) ←←← 1が表示される  End Try End Sub =============================================================== =================== DLL呼び出し異常パターン =================== Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim objCom As New Project1.Class1 Dim strRet As String = "" Try Call objCom.getDataForTest("A", strRet) Catch ex As Exception MsgBox(ex.Message) Finally MsgBox(strRet) ←←← この時にAを表示したいがstrRetが空  End Try End Sub ===============================================================

  • VB.NETで値や参照について ByRefなど

    VB.NETで値や参照について、まだ初学ですがよろしくお願いします。 VBは2008です。 以下のようなs文字列を参照引数にしたSetDataメソッドがあります。 ByRef s As Stringという引数は、SetData内でsを書き換えると、 呼び出したSetDataメソッド外でも中身が変わるので 私のByRefの認識ではポインタと解釈しています。間違っているでしょうか? SetData(1,1, buf)とすれば、DataGridViewの中は、「初期値」という文字が表示されます。 別のメソッド(KaKikae)でbufを"あ"という文字に変えた場合、SetDataメソッドを使わなくても 書き換わっていると思っていたのですが、実際実行してみると書き換わりません。 値や参照について理解が足りないからだと思いますがわかりません。 どのようにすれば、それが実現できるのでしょうか? Public Class HogeClass Private buf As String = "初期値" Private Sub SetData(ByVal x As Integer, ByVal y As Integer, ByRef s As String) As Boolean Dim dg As DataGridView dg = DataGridView1 dg.Item(x, y).value = s End Sub Private Sub KaKikae() buf = "あ" End Sub End Class

  • ユーザ定義関数の引数省略について

    VBAで自分で関数を作成しているのですが、 引数を複数省略したいときはどうすれば良いでしょうか? 例えば、Test(A as integer, Optional B as integer =1, Optional C as integer =1)という関数で Test(1,0)と記述した時に"0"は引数BなのかCなのかどうやって指定するのでしょうか? それとも複数省略は出来ないのでしょうか?

  • Option Strictと構造体とArrayListの関係について(VB2005)

    下記はArrayListに構造体の値を格納し、表示させるプログラムです。 -------------------------------- Option Strict Off '構造体 Public Structure hoge   Dim a As String   Dim b As String   Dim c As String End Structure Private Sub test()   Dim aryhoge As New ArrayList   Dim foo As hoge   foo.a = "aa"   foo.b = "bb"   foo.c = "cc"   aryhoge.Add(foo)           MessageBox.Show(aryhoge(0).a)  'A) Option Strict Off だと"aa"と表示される End Sub -------------------------------- このプログラムはOption Strict Offだとメッセージボックスに"aa"と表示されます。 ですがOption Strict Onだと、(A)の箇所にて「遅延バインディングを使用できません」というエラーが発生し、実行ができません。 質問内容は、Option Strict Onで上記のプログラムを動かすには、(A)をどのように修正すればよいか、というものです。 どうぞよろしくお願い致します。

  • vb.net変数に入れた文字列でメソッドを実行する

    こんにちわ!! Vb.netで文字列を格納した変数を使ってメソッドを呼び出したいのですが、可能でしょうか? サンプル 'メインルーチン public sub test() Dim aaa as string ="testfunction" Dim num as integer=0 '↓の様にメソッドを呼び出したい Dim bbb = aaa(num) Msgbox(bbb ,vbinformation) aaa="testfunction2" bbb=aaa(num) Msgbox(bbb,vbinformation) Endsub 'メソッド1 Private function testfunction1(num) Return num+1 End function 'メソッド2 Private function testfunction2(num) Return num+2 End function 上記はあくまでサンプルです。 実際はメソッド数が多く、aaaにいれる名前も別で取得するので、stringになります。 ですので、bbb=aaaはforで回します。 このようなことは可能でしょうか? やりかたもしくは解決方法があればお願いします。

専門家に質問してみよう