多重構造の宣言型プログラミング — プログラミング言語 Ring 1.14 取扱説明書

Skip to content

# 多重構造の宣言型プログラミング

オブジェクト指向による多重構造の宣言型プログラミング環境の構築方法です。

- リストへオブジェクトを作成するには

- コンポジションと参照によりオブジェクトとリストを返すには

- オブジェクトのアクセス完了後にコードを実行するには

- オブジェクト指向による宣言型プログラミング

## リストへオブジェクトを作成するには

リストの定義時にリストへオブジェクトを作成できます。

Add() 関数、または + 演算子により、必要なときにオブジェクトをリストへ追加できます。

用例:

    alist = [new point, new point, new point]       # # オブジェクトが三つあるリストを作成します。

    alist + [1,2,3]                                 # 別の項目をリストへ追加します。

    see "Item 4 is a list contains 3 items" + nl
    see alist[4]

    add(alist , new point)
    alist + new point

    alist[5] { x = 100 y = 200 z = 300 }
    alist[6] { x = 50 y = 150 z = 250 }

    see "Object inside item 5" + nl
    see alist[5]
    see "Object inside item 6" + nl
    see alist[6]

    class point x y z

実行結果:

    Item 4 is a list contains 3 items
    1
    2
    3
    Object inside item 5
    x: 100.000000
    y: 200.000000
    z: 300.000000
    Object inside item 6
    x: 50.000000
    y: 150.000000
    z: 250.000000

## コンポジションと参照によりオブジェクトとリストを返すには

コンポジションの使用とクラス属性のオブジェクトがある場合、オブジェクトの返値は参照で返します。

呼び出し元で代入演算子を使う場合は、オブジェクトのコピーを作成します。

呼び出し元で代入演算子を使わない場合は、参照で返されたオブジェクトへアクセスできます。

また、属性がリスト (オブジェクトではありません) でも同じ処理が適用されます。

注釈

オブジェクト、およびリストは同じ規則で処理します。 関数へ渡すときは、参照渡しになります。 関数から返すときは、参照で返されたオブジェクト属性を除き値返しになります。

用例:

    o1 = new Container
    myobj = o1.addobj()     # 別のコピーを代入で作成します。
    myobj.x = 100
    myobj.y = 200
    myobj.z = 300
    see o1.aobjs[1]         # コンテナにあるオブジェクトを表示します。
    see myobj               # コピーの表示

    Class Container
            aObjs = []
            func addobj
                    aobjs + new point
                    return aobjs[len(aobjs)]        # オブジェクトを参照で返します。

    Class point
            x  = 10
            y  = 20
            z  = 30

実行結果:

    x: 10.000000
    y: 20.000000
    z: 30.000000
    x: 100.000000
    y: 200.000000
    z: 300.000000

用例②:

    func main
            o1 = new screen  {
                    content[point()] {
                            x = 100
                            y = 200
                            z = 300
                    }
                    content[point()] {
                            x = 50
                            y = 150
                            z = 250
                    }
            }
            see o1.content[1]
            see o1.content[2]

    Class Screen
            content = []
            func point
                    content + new point
                    return len(content)

    Class point
            x  = 10
            y  = 20
            z  = 30

実行結果:

    x: 100.000000
    y: 200.000000
    z: 300.000000
    x: 50.000000
    y: 150.000000
    z: 250.000000

用例③:

    func main
            o1 = New Screen  {
                    point() {               # 参照でオブジェクトへアクセスします。
                            x = 100
                            y = 200
                            z = 300
                    }
                    point() {               # 参照でオブジェクトへアクセスします。
                            x = 50
                            y = 150
                            z = 250
                    }
            }
            see o1.content[1]
            see o1.content[2]

    Class Screen
            content = []
            func point
                    content + new point
                    return content[len(content)]    # オブジェクトを参照で返します。

    Class point x=10 y=20 z=30

実行結果:

    x: 100.000000
    y: 200.000000
    z: 300.000000
    x: 50.000000
    y: 150.000000
    z: 250.000000

## オブジェクトのアクセス完了後にコードを実行するには

オブジェクト属性とメソッドを使うには { } でオブジェクトへアクセスします。

オブジェクトに BraceEnd() メソッドがある場合は、オブジェクトのアクセス完了直前に実行します。

用例:

    New Point { See "How are you?" + nl }

    Class Point x y z
            func braceend
                    see "I'm fine, Thank you!" + nl

実行結果:

    How are you?
    I'm fine, Thank you!

## オブジェクト指向による宣言型プログラミング

この機能はオブジェクト指向による多重構造の宣言型プログラミング環境の構築と使用を可能にします。

- { } によるオブジェクト属性、およびメソッドへのアクセス

- BraceEnd() メソッド

- 参照によるオブジェクト返し

- Setter (セッター) / Getter (ゲッター) メソッド (オプション扱い)

用例:

    # 宣言型プログラミング (多重構造)

    Screen()
    {

            point()
            {
                    x = 100
                    y = 200
                    z = 300
            }

            point()
            {
                    x = 50
                    y = 150
                    z = 250
            }
    }

    # 関数とクラス

    Func screen return new screen

    Class Screen

            content = []

            func point
                    content + new point
                    return content[len(content)]

            func braceend
                    see "I have " + len(content) + " points!"

    Class point

            x=10 y=20 z=30

            func braceend
                    see self

実行結果:

    x: 100.000000
    y: 200.000000
    z: 300.000000
    x: 50.000000
    y: 150.000000
    z: 250.000000
    I have 2 points!

## コード品質の向上

メソッドで仮引数を使わないときは、メソッド名末尾の () を省略できます。これにより、コード品質の向上になります。 この機能はオブジェクトメソッドとオブジェクト属性との機能に違いがあるため Ring では使えません。 オブジェクト属性へ Getter メソッドを定義するとき、同様の効果をコードの構文で実現できます。 例えば point() メソッドの定義ではなく point 属性値の取得で実行される getpoint() メソッドを point 属性として定義します。変数名は () を省略できるため、 point() ではなく point と記述します。 getpoint() メソッドはオブジェクトの作成、およびオブジェクトの参照を返します。

用例:

    new Container
    {
            Point
            {
                    x=10
                    y=20
                    z=30
            }
    }

    Class Container
            aObjs = []
            point
            func getpoint
                    aObjs + new Point
                    return aObjs[len(aObjs)]

    Class Point x y z
            func braceend
                    see "3D Point" + nl + x + nl + y + nl + z + nl

実行結果:

    3D Point
    10
    20
    30