0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

インスタンス変数を変更する時は、メソッドの先頭か最後に変更した方がいい

Last updated at Posted at 2019-02-10

インスタンス変数の変更は関数の途中でしてはいけない


class Xxxx {
    var m_hoge; // 状態を表すメソッドだったりする
    ・・・
    function(){
        m_hoge = a;
        ~いろんな処理~
        m_hoge = xx1;
        ~いろんな処理~
        m_hoge = xx2;
    }
    ・・・
}

インスタンス変数がメソッドの「先頭と途中」もしくは「途中と最後」に
変更している処理を見たことはありませんか?

結構経験値が多いプログラマでも普通にやっている事が多い処理なんですが、
このようなコードはバグを呼びやすい、完成度が落ちるコードです

__推奨されないコードパターン__というやつですね

変数の意味が不正確になる


function(){
    ~いろんな処理~
    xxLabel1->setText(m_nowHp); // ※1
    ~いろんな処理~
    m_nowHp = a; // ※3
    ~いろんな処理~
    xxLabel2->setText(m_nowHp); // ※2
}

このように変数名を書けば分かりやすいと思う

1と2の行だけを見れば、
どちらも同じように
「“nowHp(現在のHP)”をテキスト描画する」処理と読めるはずです

しかし3のところでnowHp(現在のHP)を書き換えている処理が存在しているということは、
__1の現在のHPと3の現在のHPは、同一ではない__ということになります

これは、
3の処理を読み飛ばしてしまうと
1と3の違いに気が付けない
という現象が発生するということ
ここから高い確率で新しいバグが発生してきます

厳密に正しい変数名を


function(){
    var preHp = m_nowHp;
    m_nowHp = a;
    ~いろんな処理~
    xxLabel1->setText(m_nowHp);
    ~いろんな処理~
    ~いろんな処理~
    xxLabel2->setText(m_nowHp);
}

インスタンス変数は__関数の先頭か最後__でのみ書き換え、関数内のメイン処理中は意味が変わらないようにする
上記以外のタイミングでクラス変数を書き換えると、厳密に正しい変数名ではなくなる
それでも値が欲しいなら、
__一時変数に値をコピー__しておくことで__厳密に正しい変数名を維持__すべきである

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?