Personal tools
You are here: Home サポート PASSCELL Personal 入門用マニュアル 4. 計算や処理を行わせる 4. 計算や処理を行わせる: 7) 高度なスクリプト記述 (1) 修飾子 "super.":親ノード参照
Document Actions

4. 計算や処理を行わせる: 7) 高度なスクリプト記述 (1) 修飾子 "super.":親ノード参照

← [4. 計算や処理を行わせる: 6) スクリプトの中で使う、演算子・構文・修飾子]へ戻る | ↑ [目次]へ戻る | [4. 計算や処理を行わせる: 7) 高度なスクリプト記述 (2) 修飾子 "node." + setnode() 関数:下位ノード参照]へ進む →


■このページで説明している内容

a) 修飾子による他ノードエレメントの指定
b) 自ノードと親ノードに同じエレメントがある時の識別方法:"super."



ここでは、修飾子の使い道とスクリプト欄でのポップアップメニューについて、実例を挙げて解説します。


a) 修飾子による他ノードエレメントの指定

修飾子は、エレメント名の前につけることによって、特定のノードが持つエレメントを指定する機能です。

修飾子には、以下の3種類があります。
    ・"super."
    ・"node."
    ・親ノードのNameプロパティを指定

また、修飾子ではありませんが任意のノードのエレメントを参照するための関数としてrefer() 関数がありますので、あわせてご紹介します。
    ・refer()関数


図4.7.a-1.jpg
(図4.7.b-1) 修飾子は、それぞれ自分から見たノードから値を参照するのに用いる



b) 自ノードと親ノードに同じエレメントがある時の識別方法:"super."


あるノードとその親ノードに同じ名前を持つエレメントが定義されている場合、通常は親ノードの値を子ノードでの定義で上書きされます。
したがって、親ノードで定義されているエレメントの値は参照できません。

しかし、例えば金額や数量などの累計を計算させたい場合、親ノードの値を利用したいケースもあります。

このような場合、修飾子 "super."を使って、自ノードと親ノードのエレメントを区別することができます。
では、実際の例を見てみましょう。

以下の図に示すようなプロジェクトを例にご説明します。

全てのノードに、「数量」というエレメントを持っているものとします。


図4.7.b-1.jpg

(図4.7.b-1) 「親ノード」の定義(1)


図4.7.b-2.jpg

(図4.7.b-2) 「子ノード」の定義(1)


図4.7.b-3.jpg

(図4.7.b-3) 「孫ノード」の定義(1)



この状態では、親ノードの「数量」エレメントはその子ノードの同名エレメントによって上書きされます。
この例では、ノードは3つしかありませんが、もっと多くの子孫ノードがあるものと考えてください。

では、ここで各ノードで『ここまでの「数量」の合計』を求めたいとします。どうしたらよいでしょうか?
各ノードに「数量の累計」を保存するエレメントを追加し、ここに

    親ノードまでの数量累計+自ノードでの数量

の結果を代入するようにすればよさそうです。つまり計算式はこうなります。

    (自ノードの)数量の累計 = (親ノードの)数量の累計 + (自ノードの)数量

これをそのまま実現しようとすれば、それぞれのノードで数量の累計を保存するエレメントを定義すればよいのですが、エレメント値の上書きを発生させないためには、

    [親ノード]
        "親ノードの数量累計"
    [子ノード]
        "子ノードの数量累計"
    [孫ノード]
        "孫ノードの数量累計"

のように、ノードごとにエレメント名を変えていく必要があります。
これでは、記述量が増えますしエレメント名の命名や管理が大変になります。

こんなケースに、修飾子"super."と「ここから」スクリプトを使うと記述量やエレメントの定義量を減らし、またスクリプトを変更する場合にも修正個所を減らすことができます。

-----
まず、親ノードではこのように定義します。
    エレメント:
        数量
        累計
    「ここだけ」スクリプト:
        累計=数量;


図4.7.b-4.jpg

(図4.7.b-4) 「親ノード」の定義(2)

次に、子ノードではこのように定義します。
    エレメント:
        数量
        累計
    「ここから」スクリプト: ←「ここから」スクリプトに記述するのがポイントです。
        累計=super.累計+数量;


図4.7.b-5.jpg

(図4.7.b-5) 「子ノード」の定義(2)

孫ノードではこのように定義します。
    エレメント:
        数量
        累計
    スクリプトには何も記述しません。


図4.7.b-6.jpg

(図4.7.b-6) 「孫ノード」の定義(2)

子ノードおよび孫ノードでは、実際には「累計」エレメントを追加する必要はありません。
(上記のスクリプトを子ノードに定義すると、自動的に「累計」エレメントが追加されます)

つまり追加したのは、
    (1) 親ノードの「累計」エレメント
    (2) 親ノードの「ここだけ」スクリプト
    (3) 子ノードの「ここから」スクリプト
の3箇所の記述だけとなります。

整理してみると、
    ・全てのノードで数量の累計は「累計」というエレメントに保存されることになります。
    ・自ノードと親ノードの「累計」の区別は、修飾子"super."をつけることで上書きされることなく値を取得しています。
    ・子ノードと孫ノードでは、子ノードの「ここから」スクリプトが共通して実行されています。
     このような同一スクリプトの利用は、修飾子"super."を使うことで各ノードのスクリプトで同じエレメント名を使えるがゆえに実現できる仕組みです。

このような記述を行えば、孫ノード以下には「数量」というエレメントを定義したノードを増やしていくだけで、これ以上エレメントやスクリプトを記述せずに累計計算を続けていくことが可能です。

このような"super."と「ここから」スクリプトを使った記述は、少し形式ばった言い方をすれば、「再帰」的な記述であると言えます。



← [4. 計算や処理を行わせる: 6) スクリプトの中で使う、演算子・構文・修飾子]へ戻る | ↑ [目次]へ戻る | [4. 計算や処理を行わせる: 7) 高度なスクリプト記述 (2) 修飾子 "node." + setnode() 関数:下位ノード参照]へ進む →

Powered by Plone, the Open Source Content Management System

This site conforms to the following standards: