【Salesforce】Apex言語のbreak|基礎から使い方

※本サイトにはプロモーション・広告が含まれています。

(最終更新月: 2024年1月)

✔以下の疑問をお持ちの方へ向けた記事です

「Salesforce Apexにおけるbreak文の使用目的とは何か?」
「Apexのループ内でbreak文を使用する方法は?」
「break文を使う際のベストプラクティスと注意点は?」

✔当記事を読むことで得られる知識

  • Salesforce Apexでのbreak文の基本概念
  • ループ処理におけるbreak文の効果的な使用方法
  • break文を使用する際のベストプラクティスと注意点

break文は、forループやwhileループ内で特定の条件が満たされた際に、ループ処理を途中で終了させるもの。

Salesforceの開発者やApexを学び始めた方々にとって、プログラミングスキルを深めるための重要なガイドとなるでしょう。

ぜひ最後までご覧ください。

Salesforce

定義や属性などは公式ガイドを必ず参考にしましょう。

当記事では、主にその使い方を具体例とともに解説します。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

プロダクトマネージャーとして、Apex・Visualforceの開発エンジニアとして、以下のようなプロジェクトに従事してきました

  • 新規事業の立ち上げに伴うビジネスプロセス構築とSalesforceのカスタマイズ
  • SFDXを活用した大規模リリース
  • Visualforce等による一般ユーザー向けサイト・アプリケーションの構築

相談・業務の依頼も承ります。ご質問・ご希望をお問い合わせください。

Breakステートメントの基本

こちらでは、プログラミングにおけるBreakステートメントについて深く掘り下げていきます。

Breakステートメントを理解することで、プログラムの制御をより効果的におこない、コードを効率的に書くための重要なスキルを習得できるでしょう。

  • Breakステートメントとは何か
  • Breakの役割とプログラミングにおける重要性
  • BreakとContinueの違い

Breakステートメントとは何か

Breakステートメントとは、ループの中で特定の条件下で実行を止め、ループから抜け出すために使われるコントロールステートメントです。

例えば、Apex言語では次のように使用します。

for (Integer i = 0; i < 10; i++) {
    if (i == 5) {
        break; // i が 5 の時にループを終了する
    }
    System.debug(i);
}

変数 i が 5 になったときに break ステートメントが実行され、for ループを直ちに終了。

このように break はループの処理を途中で終了させるために使われます。

Breakの役割とプログラミングにおける重要性

Breakの主な役割は、不必要な処理を省略し、プログラムの実行を抑制すること。

これにより、コードの効率が大幅に向上し、プログラムの実行時間を短縮できます。

プログラミングにおいて、とくに大きなデータセットを扱う場合や判断が必要な場合に非常に重要な機能です。

例えば、以下のコードをご覧ください。

for (Integer num = 1; num < 100; num++) {
    if (Math.mod(num, 7) == 0) {
        System.debug('最初に見つかった7の倍数は: ' + num);
        break; // 7の倍数が見つかったらループを抜ける
    }
}

1から100までの間で最初に見つかった7の倍数を表示し、それを見つけた瞬間にループを抜けます。

break によって、無駄な繰り返し処理をおこなわずにプログラムを最適化しているのです。

BreakとContinueの違い

breakがループを完全に終了させますが、continue ステートメントは現在の繰り返しをスキップし、次の繰り返し処理に移るもの。

両者は特定の条件下でループの流れをコントロールするために使用されますが、彼らの行動は根本的に異なります。

次のPythonコードを見てみましょう:

for (Integer i = 1; i < 10; i++){
    if (i==5){
      continue; //iが5のとき以下のコードをスキップして次のループ処理をおこなう
    }
  System.debug(i);
}

/** 出力は以下のとおり。
08:25:46.24 (25239615)|USER_DEBUG|[5]|DEBUG|1
08:25:46.24 (25291768)|USER_DEBUG|[5]|DEBUG|2
08:25:46.24 (25300783)|USER_DEBUG|[5]|DEBUG|3
08:25:46.24 (25308448)|USER_DEBUG|[5]|DEBUG|4
08:25:46.24 (25316753)|USER_DEBUG|[5]|DEBUG|6
08:25:46.24 (25324012)|USER_DEBUG|[5]|DEBUG|7
08:25:46.24 (25331360)|USER_DEBUG|[5]|DEBUG|8
08:25:46.24 (25348179)|USER_DEBUG|[5]|DEBUG|9
*/

このスクリプトでは、iが 5 の場合、System.debugステートメントは実行されず、次の繰り返しへと移ります。

したがって、出力には 5 が含まれません。

これに対して、もし break を使った場合は、5 が出力されることはなく、ループはその時点で完全に終了してしまいます。

Breakの使用シナリオ

こちらでは、いくつかの典型的なシナリオを通じてBreakステートメントの使用法を解説していきます。

Breakステートメントを状況に応じて適切に利用することで、コードのパフォーマンスを向上させ、読みやすくメンテナンスしやすいプログラムが書けるでしょう。

  • ループ制御と効率化
  • 条件付きループからの脱出
  • 多重ループでのBreakの使用

ループ制御と効率化

ループ制御とは、実行中のループを効果的に管理し、プログラムの実行を最適化するプラクティスです。

「無駄な繰り返しを避ける」ことが、効率化の鍵となります。

ループの中で条件が満たされたと判断した場合、すぐにそのループから抜け出せるBreakステートメントは、非常に効果的です。

List<String> items = new List<String>{'apple', 'orange', 'banana', 'grape'};
for (Integer i = 0; i < items.size(); i++) {
    if (items[i] == 'banana') {
        System.debug(items[i] + ' found at index ' + i);
        break; // バナナを見つけ次第、ループを終了する
    }
}

配列の中から ‘banana’ というアイテムを探しています。

アイテムが見つかると、以下をおこない終了。

  • System.debugでその位置を報告
  • breakでその瞬間にループを終了

これは、必要以上に配列の末尾まで探索することなく、実行時間を効率化する方法です。

条件付きループからの脱出

条件付きループでは、特定の状態が成立したら即座にループを抜け出したい場合があります。

データが大きい場合などに、処理を早めるためです。

例えば、復旧不能なエラーが発生した時やユーザーからの入力が特定の基準を満たした時などが該当します。

public class ExampleClass {
    public static void main() {
        List<Integer> inputs = new List<Integer>{10, 5, -1, 20}; // ユーザー入力の代わり
        Integer index = 0;

        while (true) { // 無限ループ
            if (index >= inputs.size()) {
                break; // 入力リストの終わりに達した場合、ループを終了
            }

            Integer count = inputs[index];
            System.debug('Enter a positive number (or -1 to exit): ' + count);

            if (count == -1) {
                break; // ユーザーが -1 を入力したらループから脱出
            }

            // ... その他の処理 ...
            
            index++;
        }
    }
}

こユーザーが -1 を入力するまで値を要求し続ける無限ループを持っています。

break ステートメントは、このような条件付きループから制御された脱出を実現する手段として重宝します。

多重ループでのBreakの使用

多重(ネストされた)ループでは、内側のループから抜け出すだけでなく、外側のループからも脱出する必要が生じることがあります。

このような場合、break ステートメントはループの束縛から解放するための役割を果たすのです。

public class BreakExample {
    public static void main(String[] args) {
        Boolean breakOuterLoop = false; // 外側のループを終了するためのフラグ

        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (i * j > 6) {
                    System.debug("Loop interrupted at i=" + i + ", j=" + j);
                    breakOuterLoop = true; // フラグを設定
                    break; // 内側のループを終了
                }
            }
            if (breakOuterLoop) {
                break; // 外側のループも終了
            }
        }

        System.debug("Outer loop complete.");
    }
}

この技法により、コントロールフローが複雑に絡まる多重ループを簡単に把握し、管理できます。

Breakを使用したコーディング例

実際のコーディングシナリオにおいて、Breakステートメントの使い方を実例とともにご紹介していきます。

Breakステートメントを効果的に使用することで、コードの明瞭さを高め、パフォーマンスの改善につながるコーディングが実現可能です。

  • 単純なループでのBreakの例
  • 条件判断を伴う複雑なループでの使用
  • パフォーマンス最適化のためのBreakの活用

単純なループでのBreakの例

単純なループでのBreakの使用例を次のPythonコードで示します。

public class ExampleClass {
    public static void main(String[] args) {
        List<String> names = new List<String>{'Alice', 'Bob', 'Charlie', 'Diana'};

        for (String name : names) {
            System.debug(name);
            if (name == 'Charlie') {
                System.debug('Charlieが見つかりました。ループを終了します。');
                break; // チャーリーが見つかったらその場でループを終了する
            }
        }
    }
}

この例では、リストの中に “”Charlie”” が見つかった時点でループを終了するために break ステートメントを使用。

これにより、残りの要素の処理をスキップしています。

条件判断を伴う複雑なループでの使用

複数の条件が組み合わさった複雑なループでは、Breakの使用がより洗練されます。

public class ExampleClass {
    public static void main(String[] args) {
        Boolean userWantsToContinue = true;

        while (userWantsToContinue) {
            // 擬似的なユーザー入力
            String answer = 'Yes'; // 'No'を代入してループをテストすることもできる

            if (answer.toLowerCase() == 'no') {
                break; // 「No」と回答されたと仮定してループから抜ける
            }

            // ..他の処理..
        }
    }
}

ループの各繰り返し後にユーザーに継続するかどうか尋ね、No が入力された場合にループを終了するものです。

ユーザーからの受取にはVisualforceなど、別の仕組みを使う必要があります。

パフォーマンス最適化のためのBreakの活用

リソースが限られる状況や効率が非常に重要なアプリケーションにおいては、Breakを使用してパフォーマンスを最適化することが求められます。

以下がその例です。

public class ExampleClass {
    public static void main(String[] args) {
        List<Integer> numbers = new List<Integer>{1, 3, 7, 9, 11};
        Integer target = 9;

        for (Integer number : numbers) {
            if (number == target) {
                System.debug('目的の数字が見つかりました: ' + number);
                break; // 目的の数字を見つけたらその場でループを終了する
            }
        }
    }
}

配列内で目的の数字を探しており、それが見つかった瞬間にループを終了する break を利用しています。

これは計算リソースの浪費を避け、プログラムの反応性を向上させる良い例です。

Breakのベストプラクティス

Breakステートメントを使用する際には、いくつかのベストプラクティスに従っておくべきです。

これらのプラクティスはコードの可読性と保守性を確保し、将来的なデバッグとエラーハンドリングを容易にするために重要です。

  • 可読性と保守性のためのループ設計
  • Breakの使用時の注意点
  • デバッグとエラーハンドリング

可読性と保守性のためのループ設計

ループの設計は、可読性と保守性に直接影響します。

Breakを使う際には、ループの目的を明確にし、それがどの条件で終了するかを、コード内で意図を明確に示しましょう

たとえば、無限ループを設計する場合は、ループを終了させるためのbreakステートメントの位置を適切に配置することが不可欠です。

//ユーザーのインプットをリストとして作成
List<String> inputs = new List<String>{'command1', 'command2', 'quit', 'command3'};
Integer index = 0;

while (index < inputs.size()) {
    String user_input = inputs[index];
    System.debug('コマンドを入力してください(quitで終了): ' + user_input);

    if (user_input == 'quit') {
        break;
    }

    // 他のコマンド処理
    // ...

    index++;
}

この無限ループは、ユーザーが “”quit”” を入力するまで継続されるもの。

ループからの脱出手段が明確であり、それによってコードの読みやすさと保守性が向上しています。

Breakの使用時の注意点

break を使用する際には、制御フローが複雑になりすぎないよう注意が必要です。

多すぎるbreakの使用は、プログラムのフローが追いにくくなるため、最低限に留めましょう。

また、ほかの開発者がコードを読んで理解する際に、break がループの何処で、なぜ使われているのかが明確な文脈を持つことが重要です。

while (someCondition) {
    // プロセス1
    if (shouldBreakCondition1) {
        break;
    }
   // 継続のプロセス
   // プロセス2
   if (shouldBreakCondition2) {
       break; // コメントをつけてなぜbreakするのかを説明する
   }
   // 他の処理
}

それぞれの`break`が何のために使われているのか、コメントを通して説明をしておくと、のちほど見返したときにも意図がつかみやすいです。

まとめ

Breakステートメントは、ループ制御の際に非常に便利なツールです。

以下のような多くのケースで利用できます。

  • 効率的なコードを書く
  • プログラムの流れを管理する
  • ユーザー入力やエラー処理に応じた柔軟な動作を実現する

しかし、その使用は慎重におこなう必要があり、コードの可読性や保守性を損なわないよう、正しく理解し実践することが不可欠です。

Breakにまつわる問題を解決するためには、適切なテスト、リファクタリング、慎重なデバッグが重要となります。

プログラム制御のスキルを高め、より良いコーディング技術を身につけるためにも、これらの点に注意してBreakステートメントの使用をマスターしましょう。

タイトルとURLをコピーしました