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株式会社代表取締役。