Eiffel Introduction(一)

来源:互联网 发布:内部网络监控 编辑:程序博客网 时间:2024/05/29 03:56

1. 为什么用Eiffel

1.1 为什么用Eiffel

          Eiffel是一种非常简单的语言。类似于 Pascal,但关键字比 Pascal 少,读起来好像伪码。

          我们正是想要/需要一种面向对象语言。Booch说:“Eiffel 是市面上设计得最好的面向对象语言。(Eiffel is the best designed OO language on the market.)”

          允许以一种既直接又合理的方式来对类别(classes)或模块(modules)单独进行编译及测试。

         Eiffel是一种纯面向对象语言,以非常直截了当的方式支持面向对象概念。

         与任何其它商用语言相比,Eiffel拥有更多的面向对象特征。比如, 静态型别系统(Static Typing)、多重继承(Multiple inheritance)、泛型(Genericity)、断言(Assertions)。

          简而言之,如果是要学习有关面向对象的知识,Eiffel是最佳的学习工具!

 

1.2 为什么没用Eiffel

         Eiffel 仍未在商业应用中得到广泛运用。

          对于大多数实现而言,编译速度慢。

 

2. Eiffel 的语法以及控制结构

2.1 Eiffel 的控制结构

2.1.1 Eiffel 只有一种循环结构

 

from

    .... -- 在这里设置初始条件

    .... -- 可以写任意多行

until

    condition

loop

    .... -- 这里是循环体

    .... -- 可以写任意多行

end

2.1.2 循环结构示例

sum := 0

from

    i := 1

until

    i > 10

loop

    sum := sum + i

    i := i + 1

end

 

请注意,在本例的情形中,你必须手工递增循环变量。你有时也许会忘记这样做。

 

2.1.3 分支结构

if cond1 then

    ...

    ...

elseif cond2 then

    ...

    ...

else

    ...

    ...

end

 

代码中可以有任意多个 elseif,也可以什么都没有。Else子句也是可选的。但是必须有结束语句 end

 

2.1.4 多分支结构

 

inspect expression

when const1 then

    ...

    ...

when const2 then

    ...

    ...

else

    ...

    ...

end

 

2.1.5 多分支结构示例

inspect ch

when ‘a’..‘z’, ‘A’..’Z’ then

    -- 处理字母

when ‘0’..‘9’ then

    -- 处理数字

when ‘.

    -- 处理以 '.' 结束的情况

else

    -- 缺省动作

end


3 Eiffel 中的类别(class

3.1 类别(class

        每一个类别单独保存在一个文件中,实现一种抽象数据型别(Abstract Data Type)。

         一个类别的使用者(clients)需要知道该类别的公共接口(public interface),这在 Eiffel 中被称为 short form(简略形式)。

         一个类别的公共接口(public interface)包括该类别之公共特征(public features)的语法及语义,但不包括实现细节。

 

3.2 类别的结构

每个 Eiffel 类别有着相同的基本结构:

 

class

    CLASS_NAME

creation

    如果需要,这里写用于创建该类别实体的创建程序。

feature

    该类别所有的attributes(属性;或称variables,变量)

    routines[译注1/OOSC2e p89]

end

 

        creation 子句包含了在创建该类别实体(instance;亦称object,对象)时需要调用的routines之名称。

         feature 子句可以有多个。我们将在后文中看到这种写法。

         每一个 feature 子句既包含 attributes 也包含 routines。这里通常就是编写大量代码的地方。

 

3.3 Attributes(属性)

所谓一个 attribute,就是一个变量。

x : INTEGER

s : STRING

stack : STACK[ STRING ]

 

         有些语言使用术语 instance variable(实体变量)来描述 attribute

         Eiffel中的 public attributes(公共属性)对于本对象以外而言是唯读的(read-only)。

 

3.4 Routines[译注1/OOSC2e p89]

Routines 的形式为:

 

routine_name is

    -- 这里是局部变量的声明

do

    ...

    ...

end

 

         Routines 既可以是 procedures(过程,没有返回值),也可以是 functions(函数,有返回值)。

         当然,routines 可以带参数。

 

3.5 Procedures(过程)及 Functions(函数)示例

push( x : G ) is -- 这是一个过程

do

    -- x成为栈顶元素

end

 

top : G is -- 这是一个函数

do

    -- 向该函数的调用者返回栈顶元素

end

 

在上面这个函数的函数体中,保留字 Result 将会接受一个值。这个值正是返回给函数调用者的返回值。

 

3.6 Creation Routines(创建程序)

         通常每个 Eiffel 类别都包含一个 creation 子句。该子句列出了“可用于初始化该类别对象的 features[译注2]”之名称。

         当该类别的使用者(client)希望创建一个类别实体时,其必须调用这些 features

[译注2:特征,即该类别的feature子句中所列的attributes或者routines]

如果 make class C 的创建程序(creation routine),那么 class C 的使用者(client)必须使用下面的语法来为变量 c:C 创建一个实体:

!!c.make

或者

create c.make

!! (create)语法只在创建新对象的时候使用。

上述代码意味着:

1.      为型别 C 的实体(对象)分配空间,并使 c 成为指向该对象的一个 reference(引用;或称 pointer,指针)。

2.      给对象中每一个 attribute(属性)赋予缺省值(各种型别的缺省值分别为:整数,0;实数,0.0;字符,NullBoolean(布尔型别),False;其它型别,Void)。

       可注意到,这些缺省值是语言定义的一部分,不依赖于特定的编译器。

       c 所指代的对象创建完毕,class C make routine 即运行完毕。

       注意,如果 make 是一个 public feature(公共特征),那么该类别的使用者可以在任何时候调用它,而不只是在对象创建的时候。另一方面,如果 make private(私有的),那么其只能在对象的创建过程中被调用。

 

3.7 Feature 子句

Feature 子句分为两种情况:

         关键字 feature 本身在句法上等同于 feature{ANY}。在这样的子句中定义的 features 可以被任何其它对象访问到。这样定义的 features 是一个类别的公共特征(public features)或称导出特征(exported features)。

         在以 feature{NONE} 为启示的字句中定义的 features 无法被其它对象访问到。这样定义的 features 是一个类别的私有特征(private features)。

 

3.8 Eiffel 中的类别(续)

Eiffel 是对大小写不敏感的语言,然而为了提高可读性以便于Eiffel程序员交流,应该遵循一些约定:

1.      类别的名称全部采用大写。

2.      关键字以及用户自定义的名称全部采用小写。

3.      保留字(诸如 ResultTrueFalseVoid 等)采用这里给出的写法。

 

     用下划线来分割由多个词组成的 feature 名称或者类别名称(比如类别 LINKED_LIST)。

     这样简单的一致性约定容易实行,主要有助于阅读代码。

(待续...)

原创粉丝点击