- PR -

メソッド内の変数定義位置

投稿者投稿内容
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2006-05-14 14:21
引用:

R・田中一郎さんの書き込み (2006-05-14 14:00) より:

切り出しちゃって良いと思いますよ?(^ー^;)
リファクタでもメソッドの切り出し機能が付いているように、1処理1メソッドに
する方法をお勧めします。
ただ、僕の場合は、一箇所からしか呼び出さないメソッドは、呼び出し元のメソッ
ドとともに、#regin で括っちゃいます。




なるほど一度切り離して、#reginでまとめるですか。
いい感じですね、参考になります(^-^)


[ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2006-05-14 14:22 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-14 14:27
引用:

ハニワ祭りさんの書き込み (2006-05-14 13:12) より:

また、一箇所からしか呼び出されないロジックを
Privateなメソッドとして切り出すのもどうかと思い、


R・田中一郎さんの補足になりますが、ここは臨機応変ですね。

たとえば、複数のデータクラスのインスタンスを生成し初期化して、
アイテムとして追加する場合などは、切り出さない方が良いでしょう。

しかし、計算など、ビジネスロジックが絡むようなブロックは切り出すべきだと思います。
なぜならば、メインとなるフローのコメントが簡素化できるからです。

コード:

    Private Sub GetRetireMoney()
        '  :
        ' (1) 退職金の係数を計算して取得する
        Dim coefValue As Double = GetRetireConfValue(Me.WorkingSpan)
        '  :
    End Sub

    ' (1) 退職金の係数を計算して取得する
    Private Shared Function GetRetireConfValue(ByVal ts As TimeSpan) As Double
        '  :
        ' 省略
        '  :
    End Function


切り出すことでメインとなるメソッドのコメントが 1 行になりすっきりします。
修正が発生した場合も、呼び出し先のメソッドだけに着目すれば良いことになります。

個人的には、メソッドの先頭と呼び出しの先頭にしかコメントを書かない主義なので、そうしています。
(誰が見てもわかるソースを書けば、切り出した単位の概要さえ書くだけで良い)
でもトリッキーな実装の場合は、切り出してもコメントを書きますね...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2006-05-14 14:43
引用:

じゃんぬねっとさんの書き込み (2006-05-14 14:27) より:

しかし、計算など、ビジネスロジックが絡むようなブロックは切り出すべきだと思います。
なぜならば、メインとなるフローのコメントが簡素化できるからです。

コード:

    Private Sub GetRetireMoney()
        '  :
        ' (1) 退職金の係数を計算して取得する
        Dim coefValue As Double = GetRetireConfValue(Me.WorkingSpan)
        '  :
    End Sub

    ' (1) 退職金の係数を計算して取得する
    Private Shared Function GetRetireConfValue(ByVal ts As TimeSpan) As Double
        '  :
        ' 省略
        '  :
    End Function


切り出すことでメインとなるメソッドのコメントが 1 行になりすっきりします。
修正が発生した場合も、呼び出し先のメソッドだけに着目すれば良いことになります。




わかってはいるんですが…、
なかなかVB6の頃の標準モジュールへのCALL連発の悪夢から
逃れられないんですよね(^^;冷汗)
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-05-14 14:53
引用:

ハニワ祭りさんの書き込み (2006-05-14 14:43) より:
わかってはいるんですが…、
なかなかVB6の頃の標準モジュールへのCALL連発の悪夢から
逃れられないんですよね(^^;冷汗)


こ、これってなんでしょう??
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2006-05-14 15:02
以前、
意味のある構造化というレベルを大幅にとおりこして
もはや意味のない段階まで、ただ細切れになったプログラムを
メンテした時の悪夢です(笑)

スレ内容とは直接関係ないので忘れてください。m(__)m

[ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2006-05-14 15:03 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-05-14 15:07
引用:

ハニワ祭りさんの書き込み (2006-05-14 13:12) より:
また、
一箇所からしか呼び出されないロジックを
Privateなメソッドとして切り出すのもどうかと思い、
スコープ狭めるためだけに、
Try 〜 Catch で囲んで、
その中で変数を定義したりすることもあります。


一概には言えませんが、こういうのは別のメソッドにしたほうが良いかもしれません。そもそも変数の宣言位置を気にするということは、それだけひとつのメソッドが巨大になっているという背景がある可能性も考えられます。もっとも、VB.NETやC#/Java等の今時の言語なら、基本的には使う直前で宣言するのが普通でしょう。メソッドの入り口でやる必要性は見当たりません。

ただ、余談ですが、(VB.NET ではなく) VB だと、どこで宣言しようが、メソッド(Sub/Function)の入り口で、もう変数ができあがってしまっているので、本質的には変数の宣言位置は意味がありませんでした。
コード:
Private Sub Command1_Click()
    Dim a
    a = 123
    MsgBox "foo"
    Dim b
    b = 456
End Sub


みたいな場合、デバッガーなどで動かすと分かりますが、この Sub の入り口ですでに変数 a や b もできています。たとえば、MsgBox の地点で止めていても、デバッガー上で変数 b に代入できたりします。
VBScript だともっとひどくて、
コード:
Public Sub a()
    i = 123
    Dim i
End Sub


みたいなことまでできました。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2006-05-14 15:22
引用:

unibonさんの書き込み (2006-05-14 15:07) より:
VBScript だともっとひどくて、
コード:
Public Sub a()
    i = 123
    Dim i
End Sub


みたいなことまでできました。



それはヒドイですね。
なるほど。VB6やVBScriptしかやったことがないと、
変数宣言を冒頭に持ってきたくなる気持ちも
わからなくはないですね。
PG人口的にはまだそういう人も多そうですしね。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-14 15:22
引用:

unibonさんの書き込み (2006-05-14 15:07) より:

コード:
Public Sub a()
    i = 123
    Dim i
End Sub


みたいなことまでできました。



元々、BASIC では変数の宣言不用でしたから、どっちでも書けるよ〜、ってことだっ
たんでしょうね。
BASIC というキーワードを最新の言語と混ぜると、このようになるという、怖いお話
ですね。

スキルアップ/キャリアアップ(JOB@IT)