佐々木屋

技術的なことから趣味まで色々書きます

無意味なスコープ

変数スコープは出来るだけ短くするとバグの発生を抑えることができます。

課題①

変数iはメソッドの最初の方に宣言されていますが、実際はfor文でしか使用されていません。

int i;

//処理①

for (i = 0; i <= 10; ++i) {
    //処理②
}
Dim i As Integer

'処理①

For i = 0 To 10
    '処理②
Next


リファクタリング

特にIfやUsingなど構造化される場合は、構造化の内部で宣言すれば、スコープを構造化内部だけにすることが出来ます。これによって変数名を無駄にいくつもそろえる必要が無くなりますし、何と言っても意図しない値の衝突、バグの発生を抑えることができます。

//処理①

for (int i = 0; i <= 10; ++i) {
    //処理②
}
'処理①

For i As Integer = 0 To 10
    '処理②
Next



複数回同じ変数を違った意味で使いまわすことはバグの温床となります。

課題②

int m;

//変数mは分を保持する
m = DateTime.Now.Minute;

//変数hを使用した処理

//変数mは月を保持する
m = DateTime.Today.Month;

//変数mを使用した処理
Dim m As Integer

'変数mは分を保持する
m = DateTime.Now.Minute

'変数hを使用した処理

'変数mは月を保持する
m = DateTime.Today.Month

'変数mを使用した処理


リファクタリング

本来は別変数名を使用すればよいのですが、わざと構造化させて処理を分断して変数スコープを宣言する方法もあります。

{
    //変数mは分を保持する
    int m = DateTime.Now.Minute;

    //変数hを使用した処理
}

{
    //変数mは月を保持する
    int m = DateTime.Today.Month;

    //変数mを使用した処理
}
With Nothing
    '変数mは分を保持する
    Dim m As Integer = DateTime.Now.Minute

    '変数hを使用した処理
End With

WIth Nothing
    '変数mは月を保持する
    Dim m As Integer = DateTime.Today.Month

    '変数mを使用した処理
End With

但し、この場合mだけでなく他の変数スコープも狭くなりますので注意が必要です。