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

このQ&Aのポイント
  • 仮に、フォームにボタンが複数個あり、いずれかのボタンをクリックすると、共通処理のモジュール「shori」を呼び出すプログラムを想定します。
  • 引数を省略しない形だと、コードが煩雑になります。この場合、引数を省略する形、つまり(a)~(c)のコードを(d)の箇所へ書き込む手法は積極的に行うべきでしょうか?
  • ご助言よろしくお願い致します。
回答を見る
  • ベストアンサー

自作したメソッド・・・こんな場合、引数は省略すべき?(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() となる) ご助言よろしくお願い致します。

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

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

  • ベストアンサー
  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.1

全てのボタンでhoge、foo、barが同一の設定であるならば、省略するべきです。 その場合の最良の対応は、VBではできなかったかもしれませんが、コールバックのメソッドを統一することでしょう。 ですが、将来的にでも同一設定ではなくなる可能性があるならば、引数として渡すべきでしょう。 個人的には、メソッドの用途が限定的であるならば、あえて汎用性を持たせる必要はないと思っています。 必要のない、将来使用するアテもない機能を持たせると、後々メンテしにくくなることもあります。 モジュール化において汎用性は重要ですが、メソッドの機能は想定される必要充分なものに限定するべきだと思います。(逆に言えば、汎用性を持たせる必要がある場合は、大量の引数も辞さずということです)

tekan
質問者

お礼

sgwjnさん 詳細な解説ありがとうございます。 やはり省略すべきですか。 大変参考になりました。 ご回答ありがとうございました。

関連するQ&A

  • 自作したメソッド・・・引数はなるべく省略すべき?(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)のようにあえて引数を設定したほうが、呼び出し先のメソッドがどういう処理を行っているかを掴めていいかな?と考え始めています。 ご助言よろしくお願い致します。

  • プロパティを通さなければアクセスできない変数を設定したい(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

  • VB6における事前バインディングの記述方法について

    VB6.0で、ActiveXコンポーネントのインスタンス生成に関連する質問をさせていただきます。 まず前提として、VB6.0では、 ExcelのようなActiveXコンポーネントをコード上で生成する場合、下記の4通りの記述が可能です。 -------------------------------------------- '(1) 参照設定は要らない Dim hoge As Object Set hoge = CreateObject("Foo.Bar") '(2) 参照設定が必要 Dim hoge As Foo.Bar Set hoge = CreateObject("Foo.Bar") '(3) 参照設定が必要 Dim hoge As Object Set hoge = New Foo.Bar '(4) 参照設定が必要 Dim hoge As Foo.Bar Set hoge = New Foo.Bar --------------------------------------------- この中で遅延バインディング(実行時バインディング)は(1)のみで、 (2)~(4)は事前バインディングです。 ここで疑問なのですが、開発者が事前バインディングでコーディングを行う場合、 (4)以外の記述(つまり、(2)と(3)の記述方法)にメリットや必要性はあるのでしょうか。 (2)はコード補完が使えなくなりますし、 (3)はレジストリ経由のせいでパフォーマンスが低下するでしょうし、 デメリットしかないように思われます。 そうであれば、これらの記述方法は推奨されないものなのでは、と思ったしだいです。 回答、よろしくお願いします。

  • 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) と書くものだと思うのですが…。 こういう書き方もできるんだという話であればそれまでなのですが、 どうも腑に落ちないので、説明できる方がいらっしゃれば 教えていただきたいです。

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

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

  • VB6で配列を引数にするときの2通りの方法について

    VB6で引数に配列を渡す方法が2通りあるよう?ですが以下のような配列があり、渡し方によって引数の定義の仕方が異なると思うのですが、(2)番目の関数の書き方が知りたいです。 dim ary_dat(10) as integer (1)test_A( ary_dat ) は、sub test_A( byref ary() as integer)という関数を作れば動作することはわかりましたが、 (2)test_B( ary_dat(0) ) は、関すでどのような引数を定義すればできるのでしょうか?

  • 配列を引数で渡したりするには?

    初心者なので困っています。配列をほかのサブルーチンへ渡して、その中で配列の値を書き換えて、上層のルーチンへ渡すにはどうしたらよいのでしょうか? 初心者なので、みなまさまのお知恵を拝借させてください。よろしくお願いします。 Private Sub Print() Dim C_ALL(3) As Integer Dim D_ALL(3) As Integer Data_Set(C_ALL(), D_ALL()) MsgBox(C_ALL() & " " & D_ALL()) '配列内容すべて表示 End Sub Private Sub Data_set(ByRef C_ALL As Integer, ByRef D_ALL As Integer) Dim i As Integer For i = 0 To 4 C_ALL(i) += i D_ALL(i) += i i += 1 Next End Sub

  • 自作クラスのイベントを外部ハンドラでスレッドセーフ

    ■.NETモジュールプロジェクト(DLL) Public Class MyClass   Public Event hoge( ByVal sender As Object, ByVal e As EventArgs )   Private WithEvents Timer As Timers.Timer   Private Sub New()     Timer = New Timers.Timer : Timer.Interval = 10 : Timer.Start()   End Sub   Private Sub fuga( ByVal sender As Object, ByVal e As EventArgs ) Handles Timer.Elapsed     RaiseEvent hoge( Me, New EventArgs ) ' 一定時間ごとにイベントを発生させる   End Sub End Class ■上の.NETモジュールを参照している Windows Form アプリケーションプロジェクト(EXE) Public Class Form1   Private WithEvents foo As MyClass.MyClass   Public Sub New()     InitializeComponent()     foo = New MyClass.MyClass   End Sub   Private Sub bar() Handles foo.hoge     TextBox1.Text = "baz" ' TextBox1 は デザイナで Form1 に貼り付け済み   End Sub End Class という 2 プロジェクトを含むソリューションを作成しました。実行すると、 有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'TextBox1' がアクセスされました。 というエラーが出てきます。 foo が MyClass ではなく、system.windows.forms.dll などに入っている Button や Form といったコントロールの場合は、上記の bar() のような書き方でもスレッドセーフに扱えるので、MyClass もForm1 のコードを修正する事なく、利用できたらなと思っています。 その場合、どのように MyClass を書けばいいでしょうか。環境は VS2008 で、.NET2.0 ベースです。

  • 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)をどのように修正すればよいか、というものです。 どうぞよろしくお願い致します。

専門家に質問してみよう