introduction to eiffel - eth...
TRANSCRIPT
![Page 1: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/1.jpg)
1
Introduction to Eiffel
Martin Nordio, Christian EstlerETH Zurich
Distributed Software Engineering Lab
![Page 2: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/2.jpg)
2
Overview
Part 1: Language ConstructsØ Basics: class definition, if then else, expressions, loops
and across, creation proceduresØ Inheritance: redefinition and multiple inheritanceØ Exception HandlingØ Once RoutinesØ Style rulesØ GenericsØ Information Hiding
Part 2: ContractsØ Preconditions, postconditions and class invariantsØ Contracts in inheritance
Part 3: Tuples and Agents
![Page 3: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/3.jpg)
3
Preparation
Go to:
http://codeboard.io
If you don’t have an account yet, please sign-up and sign-in before doing the exercises.
Once you’re done with a programming exercise, submit your solution.
![Page 4: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/4.jpg)
4
1.1 BASICSPart 1: Language constructs
![Page 5: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/5.jpg)
5
Class declaration: Eiffel vs Java:
classACCOUNT
end
public class Account {
}
![Page 6: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/6.jpg)
6
Constructors
classACCOUNT
createmake, make_balance
featuremake
do …end
make_balance (i: INTEGER)do …end
end
public class Account {public Account() {...}public Account (int b) {...}
}
![Page 7: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/7.jpg)
7
Constructors
classACCOUNT
createmake, make_balance,make_name
featuremake
do …end
make_balance (i: INTEGER)do …end
make_name (s: STRING)do …end
end
public class Account {public Account() {...}public Account (int b) {...}public Account (string s) {...}
} Constructors can have any name; use the create clause to declare a routine as constructor
![Page 8: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/8.jpg)
8
Overloading
classPRINTER
featureprint_int (a_int: INTEGER)
do … end
print_real (a_real: REAL)do … end
print_string (a_str: STRING)do … end
end
public class Printer {public void print(int i) {...}public void print(float f) {...}public void print(String s) {...}
}
Eiffel does not support overloading!
![Page 9: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/9.jpg)
9
Creating Objects
classBANK
featurepay_bill
local b1: ACCOUNT
do create b1.make
end
end
public class Bank {public void payBill() {
Account b1 = new Account();}
![Page 10: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/10.jpg)
10
Creating Objects
classBANK
featurepay_bill
local b1, b2: ACCOUNT
do create b1.makecreate b2.make_balance (2)
end
end
public class Bank {public void payBill() {
Account b1 = new Account();Account b2 = new Account (2);
}
Create objects using the create keyword; declare the local variables in the local clause
![Page 11: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/11.jpg)
11
Let’s code…
Go to:
https://codeboard.io/projects/8744
Task: create a local ACCOUNT object in the constructor of the APPLICATION class
Task: modify the creation procedure of ACCOUNT to print a confirmation that an account was created
Task: write a new creation procedure in class ACCOUNT that lets you create an account with an initial balance; use it from APPLICATION
![Page 12: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/12.jpg)
12
Creating Objects: default createclassMAIN
featurerootlocal
b1: BANKdo create b1–- corresponds to–- create b1.default_createb1.pay_bill
end
end
classBANK
featurepay_bill
do …
endend
All classes inherit from ANY (Object in Java). If no creation procedure is specified, default_create is used (inherited from ANY)
![Page 13: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/13.jpg)
13
Creating Objects: default create
classBANK
inheritANYredefine
default_createend
createdefault_create
feature…
end
The routine default_createcan be redefined
![Page 14: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/14.jpg)
14
Let’s code…
Go to:
https://codeboard.io/projects/8744
Task: override the default_create in class CUSTOMER to print a confirmation message
Task: create a customer object in the APPLICATION class
Task: write a creation procedure for class CUSTOMER that takes, name, first_name and age as arguments; use it to create a customer
![Page 15: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/15.jpg)
15
Features
classACCOUNT
feature -- Initialization make do … endmake_balance (i: INTEGER)
do … endmake_name (s: STRING)
do … end
feature –- Basic operationsdeposit (i: INTEGER) do … endwithdraw (i: INTEGER) do … endtransfer (b: ACCOUNT) do … end
feature –- Accessbalance: INTEGER do … end
end
public class Account {public Account() {...}public Account (int b) {...}public Account (string s) {...}public void deposit (int i) {...}public void withdraw (int i) {...}public void transfer(Account b) .public int balance() {...}
}
The feature clause is used to group routines and for information hiding (see 1.8)
![Page 16: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/16.jpg)
16
Expressions and Conditionals
featurefoo
do if b and (c or d) then
x := 5…
endend
end
foodo
if b and then (c or else d) then…
endend
end
public foo() {if (b & (c | d)) {
x = 5;...
} }
public foo() {if (b && (c || d)) {
...}
}
![Page 17: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/17.jpg)
17
Let’s code…
Go to:
https://codeboard.io/projects/8744
Task: write a condition that only allows to withdraw money if the balance if sufficient; otherwise print an error message; make two withdraws that show the regular and the exceptional behavior
Hint: x.out gives you the string for integer x
![Page 18: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/18.jpg)
18
Return and breaks
classB
featurefoo: INTEGER
do Result := 5
end
end
public class B {public int foo() {
return 5; }
Eiffel does not support neither breaks, continues nor return
![Page 19: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/19.jpg)
19
Loops
printlocal
i: INTEGERdo
fromi := 1
untili >= 10
loop…i := i + 1
endend
public class Printer {public void print() {
for(int i=0;i<10;i++) {...
} }
}
![Page 20: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/20.jpg)
20
Loops: Example 2
printlocal
i: INTEGERdo
fromi := 1
untili >= 10
loop…i := i + 1
endend
public class Printer {public void print() {
int i=0;while(i<10) {
i++;}
}}
![Page 21: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/21.jpg)
21
Let’s code…
Go to:
https://codeboard.io/projects/8746
Task: implement the ‘print_log’ functionality for in the class ACCOUNT; complete class ACCOUNT to log deposits and withdraws
![Page 22: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/22.jpg)
22
Loops: Traversing a listprint_using_from
dofrom list.startuntil list.afterloop
list.item.printlist.forth
endend
print_using_acrossdo
across list as e loope.item.print
endend
public class Printer {public void print() {
for(Element e: list) {e.print();
} }
}
![Page 23: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/23.jpg)
23
Basic Types
Eiffel:BOOLEANCHARACTERINTEGERINTEGER_64REALDOUBLE
Java:booleanchar, byteshort, intlongfloatdouble
![Page 24: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/24.jpg)
24
1.2 INHERITANCEPart 1: Language constructs
![Page 25: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/25.jpg)
25
Deferred Class (abstract class)
deferred classACCOUNT
featuredeposit (a_num: INT)
deferredend
end
abstract class Account {abstract void deposit(int a);
}
A class must be deferredif it has at least one deferred routine. A class can be deferred without any deferred routines.
![Page 26: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/26.jpg)
26
Simple Inheritance
classACCOUNT
inheritANY
end
public class Account extends Object {
}
![Page 27: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/27.jpg)
27
Let’s code…
Go to:
https://codeboard.io/projects/8746
Task: create a deferred class PERSON; move the properties ‘name’ and ‘age’ from class CUSTOMER into the deferred class PERSON; make sure the program behavior did not change
![Page 28: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/28.jpg)
28
Feature redefinition
classACCOUNT
inheritANY
redefine out end
feature
out: STRINGdo
Result := “abc”end
end
public class Account extends Object {
String toString() {return “abc“;
}
}
All routines that are redefined must be listed in the inherit clause.
![Page 29: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/29.jpg)
29
Precursor call
classACCOUNT
inheritANY
redefine out end
feature
out: STRINGdo Result :=
Precursor {ANY}end
end
public class Account extends Object {
String toString() {return super.toString();
}
}
![Page 30: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/30.jpg)
30
Multiple Inheritance
classA
featurefoo do end
end
classB
featurefoo do end
end
Option 1:class
Cinherit
AB rename foo as foo_b end
end
Option 2:class
Cinherit
AB undefine foo end
endClass C will have two features foo and foo_b
foo from B becomes deferred; implemented in C by foo from A
![Page 31: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/31.jpg)
31
Let’s code…
Go to:
https://codeboard.io/projects/8748
Task: redefine the ‘print_self’ routine in class B to print the correct message
Task: redefine the ‘print_self’ routine in class C to print the correct message; what happens when you try to compile?
Task: resolve the conflict that was created due to multiple inheritance (hint: there is more than 1 way to do that)
![Page 32: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/32.jpg)
32
Structure of inherit clause
inheritArename
…undefine
…redefine
…endBrename
…undefine
…redefine
…end
A redefine clause must structured in the order rename, undefine, redefine.
![Page 33: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/33.jpg)
33
Frozen class / frozen routine
frozen classACCOUNT
inheritANY
end
classACCOUNT
featurefrozen deposit (a_num: INT)do
…end
end
final class Account extends Object {
}
class Account {final void deposit(int a) {
…}
}
A frozen class cannot be inherited; a frozen routine cannot be redefined.
![Page 34: Introduction to Eiffel - ETH Zse.inf.ethz.ch/courses/2015b_fall/dsl/exercises/intro_eiffel_part1.pdf · Introduction to Eiffel Martin Nordio, Christian Estler ETH Zurich Distributed](https://reader035.vdocument.in/reader035/viewer/2022070107/6024c6f4e8403019cd06fbba/html5/thumbnails/34.jpg)
34
Expanded class
expanded classMY_INT
end
int, float, double, char