Eiffel Tutorial : 6 The Dynamic Structure: Execution Model
Eiffel Tutorial の 6 章の後半.
Type declaration
型宣言.エンティティの場合.
<エンティティ名> : <型名>
関数の場合.
<関数名> : <型名> is ... <関数名>(引数...) : <型名> is ...
関数の型はそのまま関数内で使える特殊エンティティ Result の型になる.普通やね.
Type categories
型の種類というか展開型(expanded type)の説明.
オブジェクトはデフォルトでは参照で扱われるんだけど展開して保持することができて,その指定はクラス定義時にもできるしエンティティの型宣言時にもできる.
クラスを展開型としてを定義.
expanded class POINT feature x, y : REAL; end -- class INTEGER
変数を展開型とした変数は create しなくても実体を持つ.
class HELLO feature make local p : POINT; do io.print(p); io.put_new_line end end -- class HELLO
POINTクラスが展開クラスじゃない場合にはエンティティ宣言時に型名の前に expanded を付てやると展開される.
class HELLO feature make local p : expanded POINT; do io.print(p); io.put_new_line end end -- class HELLO
Basic operations
代入.
a := b;
同一性比較.
a = b -- 同一なら真 a /= b -- 同一じゃないなら真
コピーやクローン.
a.copy(b) -- a に bをコピーする a := clone(b) -- bのクローンを作ってaに代入
同値性比較.
equal(a, b) -- a と b が同値なら真(両方 Void でも真) a.is_equal(b) -- a と b が同値なら真
Deep operations and persistence
copy() や clone() は浅いコピー( shallow copy ) なので深いコピー( deep copy )が欲しいときは depp_copy() や deep_clone() を使いましょう.そのまんま.この辺のルーチンは全部基底クラスである ANY クラスで定義されてるみたいですね.
Memory management
オブジェクトは GC (garbage collector)で管理されるって話.そんだけ.
Information hiding and the call rule
情報隠蔽の原則. Eiffel では public,protected, private みたいなキーワードではなくてフィーチャを公開するクラス自体を指定してアクセス制御を行います.
feature {A, B, ... } ...
これを利用するとそのクラス自身からのみアクセスできるフィーチャは以下のように書けます.
feature {NONE} ...
いわゆる private な属性やメソッドです.
- 括弧内にクラス名を書かずに feature {} とした場合は feature {NONE} と等価
- 括弧自体を書かずに feature とした場合は feature {ANY} と等価
あと feature に続いてにコメントを書くとそれがフィーチャのカテゴリーの名前になります.
feature -- Initialization make is ...
EiffelStudio ではフィーチャ一覧の表示ではカテゴリー毎に分類されて表示されるようになっています. このカテゴリーは好きな名前をに付けられるんだけど,基本的なカテゴリーとして以下のようなものを EiffelBase で使ってるみたいです.
- Initialization
- Access
- Status report
- Status setting
- Element change
- Implementation
Execution scenario
カレントオブジェクト,カレントルーチンの説明.とか.普通.
Abstraction
代入の左辺は「書込み可能なエンティティ」でないとダメよ.というのが前半の話.「書込み不可能なエンティティ」として「ルーチンの引数」が挙げられています.また, obj.some_attribute のように書くとこれはフィーチャ呼出しであり,式となるので普通はここに代入はできません.らしい.
obj.some_attribute := some_value -- Syntax Error!
で,属性は外部から直接変更できないのでルーチンを介して変更する必要があるわけで,え〜とつまりデータ抽象? 普通の話なので以下略.