日記帳

日記です。

Eiffel Tutorial : 6 The Dynamic Structure: Execution Model

Eiffel Tutorial の 6 章の半分くらい.概念的な話が多くなると英語で読むのしんどい.

Objects, vlaues and references

インスタンスって何?とかの話. 超ふつーなので略.

Features

異なる2つの視点から見た Feature の分類とそれぞれの意味の話. 内容は以下の図の通り.
http://docs.eiffel.com/eiffelstudio/general/guided_tour/language/tutorial-6.png

右がサプライアクラスの内部実装の視点で左がクライアントクラスから見た視点.サプライアクラスの実装者は両方の視点からクラスを設計する必要があるんだけど,クライアントクラスの実装者は右側の視点を意識せずにすむようにした方がいいよね.そのために Eiffel は Query が Function として実装されているか Attribute として実装されているか区別しなくていいようになってるんじゃよーという話.

ぶっちゃけると Meyer タンの Uniform Access Principle の説明.この辺は試験に出そうなので要チェック(何の試験?).

A simple class

これまでの話を簡単なクラスで説明.どうでもいい.

Creating and initializing objects

オブジェクトの生成と初期化の話.

create <変数名>
create <変数名>.<生成手続き>
create <変数名>.<生成手続き>(<引数>...)

こんな感じで生成して初期化する.

他のメジャーなクラスベースOOPLは以下のようにクラス名を指定して生成するものが多いけど.

<クラス名> <変数名> = new <クラス名>();

えーと,オブジェクト生成時に生成するクラス名を書かなくてすむのがメリット,変数の型と異なるクラスのオブジェクトを生成していきなり代入とか出きないのがデメリットかな?たぶん.

Entities

一般のプログラミング用語で変数って呼ばれてるやつを Eiffel ではエンティティ(entity)と呼ぶらしい.以下の4種類のエンティティがある.

  • クラスの属性
  • ルーチンの引数
  • ルーチン内部でだけ使えるローカルエンティティ
  • 関数内でだけ使える Result という名前の特殊エンティティ

Calls

ルーチンの呼び方,あるいは属性へのアクセスの仕方.
"." 演算子でつなげて書く.超普通.

Infix and prefix notation

二項演算子の定義の仕方.

infix "+" (other: INTEGER): INTEGER is
	do
	...
	end

単項前置演算子の定義の仕方.

prefix "-" (other: INTEGER): INTEGER is
	do
	...
	end

実際書いてみる.

class
	POINT
creation
	make
feature -- Initialize
	make(a, b : REAL) is
			-- init with initial value
		do
			x := a
			y := b
		end

feature -- Access
	x, y : REAL
	
feature -- Basic Operation

	infix "+" (other : POINT) : POINT is
			-- plus operator
		do
			create Result.make(x + other.x, y + other.y)
		end

	infix "-" (other : POINT) : POINT is
			-- minus operator
		do
			create Result.make(x - other.x, y - other.y)
		end

	prefix "-" () : POINT is
			-- minus operator
		do
			create Result.make(-x, -y)
		end
end

で以下のような感じで動くはず.動いた.

make is
		-- Creation procedure.
	local
		p1, p2, p : POINT
	do
		--| Add your code here
		create p1.make(10, 10)
		create p2.make(5, -5)
		print(p1)
		print(p2)

		p := p1 + p2;
		print(p)

		p := p1 - p2;
		print(p)

		p := -p1;
		print(p)
	end

続きはまた.