English

MQL5の書き方(for MQL4デザイナー)

 

2024.09

林貴晴/AMSER Inc.

可読性の向上(ネストの回避)

プログラミングでは、複雑なネスト構造がコードの可読性を低下させ、デバッグやメンテナンスを困難にします。他人とソースコードを共有する場合、可読性の低いコードは理解しづらく、チーム開発におけるコミュニケーションコストを増加させる要因となります。条件分岐やループが深くネストされると、プログラム全体の流れを理解しづらくなり、パフォーマンスにも悪影響を及ぼすことがあります。この記事では、ネストを回避するための方法を解説し、コードの品質向上に役立つ手法を紹介します。

 

ネストとは

ネストとは、プログラム内で1つの構造(条件分岐やループなど)が、別の構造の内部に含まれる状態を指します。これはプログラミングにおいて非常に一般的で、たとえば、if文の中に別のif文が含まれている場合や、forループの中にさらに別のループが含まれている場合などが挙げられます。

 

ネストを回避するためのテクニック

深いネストの典型的な例として、条件が重なる場合があります。こうした場合、条件が満たされない場合に早期に処理を終了させることで、ネストを減らすことが可能です。

改善前(ネストが深い例)

void CheckOrder(double price)
{
    if (price > 0)
    {
        if (AccountInfoDouble(ACCOUNT_FREEMARGIN) > 1000)
        {
            // 注文処理
        }
    }
}
                    
 

改善後(ネストを回避した例)

                    void CheckOrder(double price)
{
    if (price <= 0) return;
    if (AccountInfoDouble(ACCOUNT_FREEMARGIN) <= 1000) return;
    
    // 注文処理
}
                    
 
比較条件の逆転

元のコードではpriceが0より大きい場合に次の処理が実行されます。

if(price > 0)
{
 //次のコード
}
                    
 

一方、早期リターン(early return)を使用する場合は、priceが0以下の時にreturnを実行します。

if(price<=0)return;
//次のコード
                    
 
true条件をfalse条件で処理する

以下のコードは、ポジションがある場合にtrue条件でPrint()が動作します。

if(PositionSelect(_Symbol))
   {
      Print("ポジションがあります。");
   }
                    
 

ネストを回避するためには、NOT(!)を付けてfalse条件でreturnを実行します。

if(!PositionSelect(_Symbol))return;
   Print("ポジションがあります。");
                    
 
OnTick()関数内のreturnの注意点

OnTick()関数内でreturnを使うと、その時点で処理が止まり、後の重要な処理が実行されなくなることがあります。これを避けるためには、処理を別の関数に分けて、return後も必要な処理が続くようにしましょう。

ネストの回避は、コードの可読性やメンテナンス性を高めるだけでなく、パフォーマンス向上にも寄与します。シンプルな構造を維持しつつ、効率的に動作するコードを目標とすることは、すべてのプログラマーにとって重要な課題です。この記事で紹介したテクニックを活用し、日々の開発において質の高いコードを書いていくことを目指しましょう。

 

執筆者紹介
林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。