やってはいけないオブジェクトの検索とは!

セレパン(自称動物)にも、コロナワクチンの無料接種の案内が届くことを今か今かと待っているセレブパンダだお。

自分が作成したアローや水平線を移動させたり、存在チェックをしたい時に、やってはいけない方法を書きます。

こんな方におすすめ
  • オブジェクトの検索方法がわからない。
  • 早く検索する方法を知りたい。

自分が作成した水平線をボタンを押したタイミングで消したり、移動させたりしたい時のやり方です。
まずはサンプルをご覧ください。

悪い例

// 探したい水平線のオブジェクト名称 
string hlineMe = "hline_test";

// メインチャートのオブジェクトの数を取得
int total = ObjectsTotal();  
for(int i = 0; i < total; i++)
{
    string name = ObjectName(i);
    if ( name == hlineMe ){
        Print("name = ", name );
    }
}

何が悪いかというと処理速度を考えていないコーディングだからです。

水平線のみを取得したいなら、水平線オブジェクトのみを対象とすればよいです。

変更したいオブジェクトが見つかったら、ループは抜けた方が処理は早いです。

良い例

// 探したい水平線のオブジェクト名称 
string hlineMe = "hline_test";

// メインチャートのオブジェクトの数を取得
int total = ObjectsTotal(0,0,OBJ_HLINE);  
for(int i = 0; i < total; i++)
{
    // 水平線オブジェクトに対して、名称を取得
    string name = ObjectName(0,i,0,OBJ_HLINE);
    if ( name == hlineMe ){
        Print("name = ", name );
        break;  // 一致したら、ループは抜ける
    }
}

改善ポイント1

水平線のオブジェクトを探したいので、全てのオブジェクトの数を取得しない方がよいです。

int total = ObjectsTotal();  
int total = ObjectsTotal(0,0,OBJ_HLINE);  

改善ポイント2

名称を取得する関数も水平線オブジェクトのみに限定した方が、処理は早くなります。

string name = ObjectName(i);
string name = ObjectName(0,i,0,OBJ_HLINE);

改善ポイント3

今回は、一致した時点でPrintしています。本来なら何らかの処理をするはずです。
一致した時点で、ループを抜けた方が絶対的に処理は早くなります。

オブジェクトの数が少ないから大丈夫という安易な考え方をせず、最善をつくすのがよいと思います。

for(int i = 0; i < total; i++)
{
    string name = ObjectName(i);
    if ( name == hlineMe ){
        Print("name = ", name );
    }
}
for(int i = 0; i < total; i++)
{
    // 水平線オブジェクトに対して、名称を取得
    string name = ObjectName(0,i,0,OBJ_HLINE);
    if ( name == hlineMe ){
        Print("name = ", name );
        break;  // 一致したら、ループは抜ける
    }
}

ループを抜けるにはbreak命令を書けば終わりです。

些細なことですが、大きな問題に繋がることもあるので、意識してみてほしいです。

では、まただお。

Twitterでフォローしよう

おすすめの記事