日記帳

日記です。

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

C/C++プログラマなら普通.たぶん…

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!

で,属性は外部から直接変更できないのでルーチンを介して変更する必要があるわけで,え〜とつまりデータ抽象? 普通の話なので以下略.