1

以下は、オブジェクトを作成しているコードスニペットです。

Form userexit_save_document_prepare.
  data: /bks/exitmanager type ref to /bks/exit_manager.
  create object /bks/exitmanager
         exporting main_prog = 'SAPMV45A'
                   exit_form = 'USEREXIT_SAVE_DOCUMENT_PREPARE'.
  include /bks/exitman.
ENDFORM.

私はこれをドキュメントから入手しました

パフォーマンス上の理由から、userexitsの場合は、パラメータ「main_prog」と「exit_form」を入力する必要があります。userexitsは、すべての単一画面フィールドに対して呼び出される「SAPMV45A」の「user_field_modification」のように頻繁に実行されます。

1)create object / bks / exitmanagerが呼び出されたとき、正確に何が起こったのですか?オブジェクトなどに割り当てられたメモリ?

2)パフォーマンス上の理由から、createオブジェクトのエクスポートパラメータを入力する必要があるのはなぜですか?

4

3 に答える 3

1

100%確信はありませんが、これが私の最善の推測です。

  1. / bks / exitmanagerと呼ばれるオブジェクトが構築されます(これはクラス/ bks / exit_managerのオブジェクト、またはより具体的にはこのクラスのオブジェクトへの参照/「ポインタ」です)..割り当てられた必要なメモリなどだけでなく、「コンストラクター」コードが呼び出されます(おそらく、呼び出しに渡されるインスタンス変数を設定します)。

  2. これらのパラメーターを明示的に渡す場合は、実行時に「計算」する必要はありません(たとえば、呼び出しスタックを確認することによって)。これにより、特に頻繁に実行する必要がある場合は、時間を節約できます(ドキュメントで説明されています)。

于 2009-12-10T07:34:16.270 に答える
0

/ bks / exit_managerが実際に何であるかを確認し、何を達成しようとしているのかを簡単に説明すると役立ちます。

IronGoofyが書いたことを拡張します:

データ:/ bks / exitmanager type ref to / bks / exit_managerこれにより、フィールドシンボルのように、プログラムのABAPメモリに参照ポインタが作成されます。また、それはすでに拡大されている必要があります。インクルードにある場合は、インクルードを移動する必要があります。

オブジェクトの作成/bks/ exitmanager export main_prog ='SAPMV45A' exit_form='USEREXIT_SAVE_DOCUMENT_PREPARE'。これにより、宣言されたクラスに基づいてオブジェクトインスタンスが作成され、参照ポインタに割り当てられます。これは、最初にコンストラクターメソッドを呼び出すことによって行われます。/ bks / exit_managerを調べるだけで、エクスポートする必要があるものを正確に見つけることができます。

于 2009-12-10T13:38:14.560 に答える
0

/ BKS / EXIT_MANAGERのコンストラクターを確認せずに、何が起こっているのか、なぜパラメーターを渡す必要があるのか​​を判断することは不可能です。ただし、設定のバッファを保持することは一般的なパターンです(キーがパラメータであり、値が複雑で時間のかかるフェッチを保持する静的ハッシュテーブルを考えてみてください)。この場合、直接アクセスできない保護されたコンストラクターを期待していましたが、ハッシュテーブルを使用して出口ハンドラー自体の参照を保持する静的ファクトリメソッドのみを使用します-最適には弱参照を使用します...

于 2009-12-12T19:51:30.767 に答える