トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

ABAP/CLEAR の変更点

Top/ABAP/CLEAR

変数や構造の初期化に使用する。

* 概要 [#j4d77dd6]
** 用法 [#m1e61e8f]
[[LOOP>ABAP/LOOP]]命令のキーブレイク時など、変数などの初期化に使用する。

** サンプル [#p8e30ede]
 CLEAR : L_MATNR,
         L_WERKS.

対象が複数ある場合、ちゃんと改行すること。

* その他 [#lb3435f1]
** CLEARとREFRESH [#af60b2fe]
類似命令に[[REFRESH>ABAP/REFRESH]]があり、内部テーブルはそちらを使用する。
ぶっちゃけCLEARでも内部テーブルの初期化はできるのだが、なぜそんな使い分けがあるかというと、昔あった「ヘッダ付き内部テーブル」が下手人である。

「ヘッダ付き」が何を指すかというと、内部テーブルと同じ型をもつ構造が内部テーブル自体に付随しているということだが、例えばIT_SALES_ORDERという内部テーブルがあったとして、それがヘッダの構造を指すのか内部テーブル自体を指すのかが不明確であるという理由で、現在は使用を禁止されている。

記述が有効であったころは、CLEAR:IT_SALES_ORDERと書けばヘッダ構造の初期化、REFRESH:IT_SALES_ORDERと書けば内部テーブル自体の初期化という使い分けがされていたらしい。

個人的にはもうヘッダ付き内部テーブルは余程古いプログラムでないと使用されていないこと、ABAPerにもこの認識が浸透したことから、「REFRESHは使用せず、どんなものもCLEARで初期化する」「iTabはRefresh、それ以外はCLEAR」のどちらかのルールが確立さえできていれば構わないものと考える。

''追記:
いつの間にか、「どっちでも」じゃなくて[[REFRESH>ABAP/REFRESH]]じゃなくCLEARを使うこと!になっていたらしい。''
''追記:いつの間にか、「どっちでも」じゃなくて[[REFRESH>ABAP/REFRESH]]じゃなくCLEARを使うこと!になっていたらしいので、CLEARに統一すること。''

** プログラムやサブルーチン開始時の初期化 [#l3251102]
昔は「[[INITIALIZATION>ABAP/INITIALIZATION]]で使用する変数を初期化するものだ」と教えられたものだ。そして、なぜ?と聞くと「いいからやれ」と言われたことを覚えている。

思うに、いくつか理由が推察される。

*** おまじない説 [#s98c228e]
いいからやっとけ、という思考停止系。
まぁ、CLEAR命令は余計なタイミングで書かない限り、プログラムやサブルーチンの冒頭で書く分には毒にならないため、おまじない感覚で書くのも悪くないのかもしれない。

個人的には、意味のないコードは存在してはならず、必要なコードのみがソースに存在することが許されると考えているため、気に入らない考えではある。

*** 遥か昔のプログラム言語で、そういった作法があった [#f9074b28]
おまじないに比べれば、こっちの方がよっぽど説得力がある。
ただ、これも「昔はこうだった」という思考停止の末の発想であるため気持ち悪くはある。

*** 主プログラムから複数回呼び出される場合を考慮する [#o667b09c]
ロジカルで明確な理由がこれ。
呼び出し先で前回の処理を考慮する必要は殆どの場合なく、呼び出し元でコントロールすべきだが、呼び出し先のプログラム内で前回の処理結果が保持されてしまうと宜しくないということで「クリアしとけ」というもの。

「○○の場合は××」という分岐や例外を定めるより「常に○○」としていた方がよいということで、外部からの呼び出しを前提としない単発のプログラムであっても同じように書きましょうということならば、理解できる。

~
~
CENTER:【スポンサードリンク】
#htmlinsert(amazon_book_sap_system_implement)
~
~
----
#pcomment(reply)