コードの分析およびテスト
データ型およびデータ型変換の正しい使用
文字項目の処理
ABAP SQL でのコードプッシュダウンの使用
内部テーブルのパフォーマンスの改善
権限チェックの実装
効果的なオブジェクト指向コードの設計
例外クラスの定義と処理
ABAP コードへの文書の追加

ABAP テストコックピットを使用したコード品質の改善

Objectives

After completing this lesson, you will be able to:
  • ATC チェックバリアントを登録します。
  • ATC を使用して静的コードチェックを実行します。

静的コードチェック

構文チェック - 拡張チェック - ABAP テストコックピット

ABAP 開発には、静的コードチェックを実行するためのツールがいくつかあります。

構文チェック

ABAP コードを有効化する前に、構文チェックは必須です。構文チェックをマニュアルで実行しない場合、開発環境では有効化時に構文チェックが暗黙的に実行されます。構文エラーがある場合、有効化はできません。元々、ABAP 構文チェックでは構文エラーのみがレポートされていました。現在、構文チェックでは構文警告も発行されます。エラーと警告の主な違いは、警告によって有効化が妨げられないことです。それにもかかわらず、警告を軽く無視しないでください。これを行うと、パフォーマンス上の問題、データの不整合、実行時エラーなど、重大な問題が発生する可能性があります。

拡張チェック

ABAP の歴史のかなり早い時期から、オプションのソースコードチェックによって、必須の構文チェックが補完されました。拡張チェックは有効化に関連せず、有効化には影響しません。開発者は、拡張チェックを呼び出すかどうか、およびその判定の処理方法を自由に決定します。

注記

ABAP 開発ツール (ADT) では、拡張チェックは独自のツールではありません。これは、ABAP テストコックピットの一部としてのみ使用可能です。

ABAP テストコックピット

拡張チェックが制限されすぎて、最新の ABAP 開発に対して柔軟性が低いことが判明した場合、拡張チェックは ABAP テストコックピット (ATC) に置き換えられました。ATC では、パフォーマンスチェックおよびセキュリティチェックから、準拠のチェック、ガイドライン、プログラミング規則まで、さまざまなチェックが提供されます。拡張チェックの機能も新しいチェックツールで提供するために、多数のチェックの 1 つとして ATC に統合されています。

ATC チェックバリアント

ATC チェックバリアント

ATC チェックの各実行は、ATC チェックバリアントによって制御されます。チェックバリアントによって、実行されるチェックが決定され、チェックのパラメータの値が提供されます。

ATC チェック実行を実行する場合は、システムのグローバルデフォルトチェックバリアントを使用するか、使用するチェックバリアントを指定することができます。これは、既存のチェックバリアント、または自分で登録したチェックバリアントにすることができます。

技術的な観点から見ると、ATC チェックバリアントは ABAP 開発オブジェクトです。これらは開発パッケージに属しており、他のシステムに移送することができます。

ATC チェックバリアントの登録方法

このデモでは、ATC チェックバリアントを登録して、実行するチェックを指定します。

ATC チェックの実行方法および結果の分析方法

このデモでは、ABAP クラスで ATC チェックを実行し、結果を分析する方法を確認します。

擬似コメントおよびプラグマ

擬似コメントおよびプラグマ

すべての ATC 結果がクリティカルではなく、無視することもできます。もっと詳しく見ると、偽のアラームであることが判明する人もいるかもしれません。このような誤報の例として、静的コードチェックでは表示されない変数の動的使用があります。

ATC には、判定を非表示にする以下の 2 つの手法があります。

  • 擬似コメント

    結果を含むソースコード行の末尾に特定のコメントを追加することで、特定の ATC 判定を非表示にすることができます。この例では、擬似コメント "#EC NEEDED が使用されています。この場合、EC は拡張チェックを表します。

    他のコメントと同様に、擬似コメントは ABAP 構文チェックおよび ABAP コンパイラには表示されません。これは、拡張チェックおよび ATC に影響するため、擬似コメントと呼ばれます。

  • プラグマ

    ## で始まる特定のキーワードを ABAP 命令に追加することで、その他の結果を非表示にすることができます。これらのキーワードは Pragmas と呼ばれます。プラグマは、その後ではなく、ABAP 命令内に配置することが非常に重要です。この例では、プラグマ ##needed が使用され、DATA 命令を終了するピリオド符号の前に配置されます。

注記

プラグマは構文チェックに表示されるため、構文チェックからの特定の警告を非表示にするためにも使用されます。これは、擬似コメントでは実行できません。

特定の ATC 判定を非表示にできるかどうかを確認するには、ATC Problems ビューで判定の詳細を参照してください。ここには、使用する必要がある手法に関する情報もあります。

テンプレートクラスのコピーと理解

ABAP プログラミングスキルを向上する必要があります。ABAP 開発環境の準備、新しいパッケージの作成、およびテンプレートクラスのコピーを行います。

テンプレート:

  • /LRN/CL_S4D401_ATT_TEMPLATE (グローバルクラス)

解答:

  • なし

前提条件

このコースの説明に従って演習問題を実行する場合は、専用の実践演習システムにアクセスする必要があります。Learning Journey コア ABAP スキルの取得の最初の部分ですでにシステムを予約している場合は、このシステムを引き続き使用することができます。実践演習システムをまだ予約していない場合は、リンク https://learning.sap.com/practice-systems/intermediate-abap-programming を参照してください。

予約プロセス中に受信する ABAP サービスインスタンス URL に加えて、ABAP Development Tools プラグインがインストールされた Eclipse IDE のローカルインストールが必要です。ステップごとの手順については、こちらのリンクを参照してください。https://developers.sap.com/tutorials/abap-install-adt.html

タスク 1: 準備

Eclipse で、ABAP クラウドプロジェクトを登録し、お気に入りパッケージの一覧にパッケージ /LRN/S4D401_EXERCISE を追加します。ABAP クラウドプロジェクトで、スーパーパッケージ ZSTUDENTS の下に新しいパッケージを登録し (推奨名: ZS4D401_##、## は各自のグループ番号)、お気に入りパッケージにも追加します。

ステップ

  1. Eclipse を開き、ABAP パースペクティブに切り替えて、ABAP クラウドプロジェクトを作成します。

    注記

    Learning Basic ABAP プログラミングコースを終了したばかりで、ABAP Cloud プロジェクトをすでに Eclipse で開いている場合は、このステップをスキップできます。
    1. Eclipse を開き、すべてのタブを閉じます。

    2. WindowPerspectiveOpen PerspectiveOther... を選択します。

    3. ダイアログボックスで、ABAP をダブルクリックします。

    4. FileNewABAP Cloud Project を選択します。

    5. 表示される New ABAP Cloud Project ダイアログで、以下の手順に従います。

      ABAP サービスインスタンス URL が指定されている場合:

      1. この URL をダイアログの対応するフィールドにコピー & ペーストします。
      2. Next を選択します。

      サービスキーを含むファイルが指定されている場合:

      1. ダイアログで抽出リンクを選択します。
      2. インポート... を選択し、サービスキーを含むファイルを選択します。
      3. インポート後、クリップボードにコピーをクリックして、サービスインスタンス URL をコピーします。
      4. 閉じるを選択します。
      5. ABAP サービスインスタンス URL:* 項目のポップアップボックスの上部で、キーの組合せ Ctrl + V を使用して ABAP サービスインスタンス URL をペーストします。
      6. Next を選択します。
    6. Open Logon Page in Browser を選択します。

    7. システムにログオンするように求められます。

      SAP Learning Hub への登録に使用したユーザおよびパスワードを入力します。

    8. You have been successfully logged on というメッセージが表示されたら、ブラウザウィンドウを閉じて Eclipse に戻ります。

    9. プロジェクトの登録を終了するには、Finish を選択します。

  2. お気に入りパッケージの一覧にパッケージ /LRN/S4D401_EXERCISE を追加します。

    1. 左側の Project Explorer で、ABAP Cloud プロジェクトを展開します。

    2. Favorite Packages を右クリックし、Add Package.... を選択します。

    3. 検索項目に /LRN/S4D401 と入力します。

    4. 一致する明細の一覧から /LRN/S4D401_EXERCISE を選択し、OK を選択します。

  3. ABAP クラウドプロジェクトで、以下の属性を使用して新しいパッケージを作成します。移送を求められたら、自分が関与する移送依頼を選択します。移送依頼が一覧に表示されない場合は、新しい依頼を登録します。

    属性
    NameZS4D401_## (## は各自のグループ番号)
    Description中間 ABAP プログラミング
    Add to favorite packages選択
    SuperpackageZSTUDENTS
    1. Project Explorer で、ABAP Cloud プロジェクトを右クリックし、NewABAP Package を選択します。

    2. パッケージ名 ZS4D401_## (## は各自のグループ番号) を入力します。

    3. テキスト Intermediate ABAP Programming を入力します。

    4. お気に入りパッケージに追加チェックボックスを選択します。

    5. スーパーパッケージ ZSTUDENTS を入力します。

    6. Next を選択します。

    7. Next を選択します。

    8. Choose from requests in which I am involved オプションに移送依頼が一覧表示されているかどうかを確認します。表示されている場合は、このオプションを選択します。一覧が空の場合は、新規依頼の登録オプションを選択し、依頼のテキスト (Exercises S4D401 - Student ## (## は各自のグループ番号) など) を入力します。

    9. Finish を選択します。

タスク 2: テンプレートのコピーと分析

グローバルクラス /LRN/CL_S4D401_ATT_TEMPLATE のコピーを登録します。コピーに ZCL_##_SOLUTION という名称を付け、パッケージ ZS4D401_## に追加します。

ヒント

テンプレートクラスをコピーすると、元のテキスト (テンプレート - 開始点) もコピーされます。コピーされたクラスのこのテキストを変更する場合は、プロパティビューを使用します。これを行うには、このビューの一般タブを選択し、テキスト項目の内容を適宜調整します。変更内容を保存することを忘れないでください。

ステップ

  1. クラス /LRN/CL_S4D401_ATT_TEMPLATE を各自のパッケージのクラスにコピーします (推奨名: ZCL_##_SOLUTION、## はグループ番号)。

    1. グローバルクラス /LRN/CL_S4D401_ATT_TEMPLATE のソースコードを開きます。

    2. Project Explorer ビューをエディタにリンクします。

    3. Project Explorer ビューで、クラス /LRN/CL_S4D401_ATT_TEMPLATE を右クリックしてコンテキストメニューを開きます。

    4. コンテキストメニューから Duplicate.... を選択します。

    5. Package 項目にパッケージの名称を入力します。Name 項目に、ZCL_##_SOLUTION (## はグループ番号) と入力します。

    6. Next を選択します。

    7. 移送依頼を確認し、Finish を選択します。

  2. コードを分析します。

    ヒント

    • ABAP 言語ヘルプ (F1) およびコードエレメント情報 (F2) を使用して、命令およびコードエレメントに関する情報を取得します。
    • 必要に応じて、コードエレメントの定義にナビゲートします (F3 または Strg + 左クリック)。
  3. クラスをコンソールアプリとして有効化して実行します。

    ヒント

    しばらくお待ちください。アプリケーションの実行にはしばらく時間がかかります。(Eclipse ウィンドウの右下隅にある緑色の進捗インジケータに注意してください。)パフォーマンスは、このコースで改善する内容の 1 つです。
    1. Ctrl + F3 を押してクラスを有効化します。

    2. F9 を押して、クラスをコンソールアプリとして実行します。

ABAP テストコックピットを使用したコード分析の実行

コードの出力が適切ではないことに気付きました。特に、コンソールでは、空席数がゼロより大きい場合でも、最大座席数と予約済座席数は同じになります。ABAP テストコックピットのチェックバリアントを登録し、それを使用してコードを分析します。

テンプレート:

  • /LRN/CL_S4D401_ATT_TEMPLATE (グローバルクラス)

ソリューション:

  • /LRN/S4D401_ATS_VARIANT (チェックバリアント)
  • /LRN/CL_S4D401_ATS_CHECKED (グローバルクラス)

タスク 1: チェックバリアントの登録

パッケージで、新しいチェックバリアントを登録します (推奨名: Z##_VARIANT、## は各自のグループ番号)。カテゴリ拡張プログラムチェック (SLIN)のすべてのチェックが実行されるように、チェックバリアントを設定します。

ヒント

デフォルトでは、拡張プログラムチェック (SLIN) では、利用可能なチェックのサブセットのみが実行されます。

ステップ

  1. 新規 ATC チェックバリアントを登録します。

    1. 左側の Project Explorer で、パッケージを右クリックし、NewOther ABAP Repository Object を選択します。

    2. フィルタフィールドに、「atc」と入力します。

    3. ATC Check Variant を選択し、Next を選択します。

    4. NameZ##_VARIANTDescriptionExtended Program Check と入力し、Next を選択します。

    5. 移送依頼を確認し、Finish を選択します。

  2. ATC チェックバリアントに ATC チェック拡張プログラムチェック (SLIN) を含めます。

    1. ATC チェックバリアントの左側にある ATC チェックセクションで、ノード Syntax and activation を展開します。

    2. 拡張プログラムチェック (SLIN) を選択します。

  3. ATC チェック拡張プログラムチェック (SLIN) のパラメータを編集します。パラメータ StandardOrCustom の値を 2 に設定し、他のすべてのパラメータの値が true であることを確認します。

    1. 拡張プログラムチェック (SLIN) を左クリックして、右側の ATC チェック詳細セクションでこの ATC チェックを開きます。

    2. ATC チェック詳細セクションで、パラメータタブを選択し、このチェックのパラメータを照会します。

    3. StandardOrCustom パラメータの値を 1 から 2 に変更します。

    4. 一覧を下にスクロールし、必要に応じて残りのパラメータの値を false から true に変更します。

  4. チェックバリアントを有効化します。

    1. Ctrl + F3 を押して、チェックバリアントを有効化します。

タスク 2: コード改善

チェックバリアント Z##_VARIANT を使用して、前の演習問題で登録したクラス ZCL_##_SOLUTION の静的コードチェックを実行します。結果を分析し、必要に応じてコードを修正します。

ステップ

  1. チェックバリアント Z##_VARIANT を使用して、クラス ZCL_##_SOLUTION のチェックを実行します。

    1. クラスのソースコード内の任意の場所を右クリックし、Run AsABAP Test Cockpit With... を選択します。

    2. チェックバリアントの名称 (Z##_VARIANT) を入力し、OK を選択します。

      注記

      チェックは非同期で実行されます。右下隅の緑色のバーが消えるまで待ちます。
    3. ABAP エディタの下にある ATC Problems ビューを選択して、チェック結果を照会します。

  2. 結果を分析し、SEATS_OCC 項目に関連する警告を修正します。

    ヒント

    コードが正しい場合は、属性 SEATS_MAXSEATS_OCC、および SEATS_FREE が同じ場所で使用されます。
    1. 警告項目 SEATS_OCC で読込が実行されませんでしたという警告が表示されます。

    2. 警告をダブルクリックして、ソースコードにナビゲートします。

    3. 属性 SEATS_MAX にカーソルを置き、ツールバーから使用先一覧取得を選択します。または、Ctrl + Shift + G を押すこともできます。

    4. 使用先一覧から、APPEND 命令の 1 つで SEATS_OCC 属性の代わりに SEATS_MAX 属性が誤って使用されていることがわかります。

    5. 使用先一覧で一致 APPEND |Occupied Seats: { seats_max }| TO r_result. をダブルクリックして、対応する命令にナビゲートします。

    6. APPEND 命令で SEATS_MAXSEATS_OCC に置き換えて問題を修正します。

  3. CURRENCY_CODE 項目に関連する判定を修正します。

    ヒント

    CURRENCY_CODE 属性はまだ使用されていないことがわかっていますが、将来の開発のために保持する必要があります。そのため、プラグマを使用してこの警告を非表示にします。
    1. ATC Problems ビューに戻ります。

    2. 項目 CURRENCY_CODE で読込が実行されませんという警告が表示されます。

    3. 警告を選択すると、警告の詳細が表示されます。

    4. 右側の詳細セクションで、.... を使用して、判定は非表示にできるで始まる文を見つけます。

    5. 警告をダブルクリックして、ソースコードにナビゲートします。

    6. DATA 命令を以下のように調整します。

      Code Snippet
      1
      DATA currency_code TYPE /dmo/currency_code ##NEEDED.
  4. クラスを有効化し、コードチェックを繰り返して、2 つの警告が表示されていることを確認します。

    注記

    現時点では、他の結果は無視します。これらについては、このコースの後のセクションで説明します。
    1. Ctrl + F3 を押してクラスを有効化します。

    2. ATC Problems ビューに戻ります。

    3. 発見事項のいずれかを右クリックして、コンテキストメニューを開きます。

    4. コンテキストメニューから、再チェックを選択します。