Académique Documents
Professionnel Documents
Culture Documents
Franck Barbier
Universit de Pau et des Pays de lAdour
Tlchargement : www.PauWare.com
Ada-83
Simula-67
Lisp
Eiffel
Smalltalk-80
C++
Objective-C
Ada-95
Java
C#
Dualit classe/instance
Classe : structure de donnes plus fonctions
(oprations) indissociables des donnes
(attributs)
Instance : incarnation lexcution de la classe
Classe : moule pour linstance
Ex. (Java) :
java.util.Date d = new java.util.Date(0L);
// January 1, 1970, 00:00:00 GMT
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
// modifier
public void pop() {} // pop: Stack -/> Stack
public void push(Object o) {} // push: Stack T -> Stack
// constructor
public Stack() {} // new: -> Stack
}
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
class MyClass {
s.push(x);
s.push(x);
Object o = s.top();
y.f(); // OK
Opration dinterface
Fonction dclare dans la partie publique
de la classe pour usage par les clients de
lobjet
Ex. (Java) :
java.util.Date d = new java.util.Date(0L);
String s = d.toString(); // interface de Date
System.out.println("Date : " + s);
Opration dimplmentation
Fonction dclare dans la partie prive de la
classe pour usage interne uniquement (concept
non outill en Smalltalk-80)
Ex. (C++) :
class Classe_Creee_Par_Utilisateur {
private: // par dfaut en C++ et Java
void f();
};
Classe_Creee_Par_Utilisateur ccpu;
ccpu.f(); // erreur la compilation
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
Ex. (Java) :
public class C {
public float f; // "public final float f;" est plus raisonnable !
private double d;
C c = new C();
c.f = 2004.F; // OK
c.d = 2005.; // erreur la compilation
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
Ex. (Smalltalk-80) :
get_x
"retour du champ _x"
^_x.
set_x: x
"affectation du champ _x"
_x := x.
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
10
end
c: expanded C -- la C++ !
11
12
Encapsulation
Abstraction : le client (i.e. lutilisateur) de la classe
saffranchit de dtails dimplmentation sans valeur
ajoute quant la rsolution de son problme
Ex. (C++) :
double d; // dbordement de capacit ?
class Real {
private: // partie rendue inaccessible lextrieur
vector<char> _implementation; // reprsentation machine via un type prdfini,
// ici vector. Par ailleurs, char est vu ici comme le type octet
};
// utilisation :
Real r("999999999999999"); // autant de chiffres que lon veut...
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
13
Encapsulation, la mtaphore de
liceberg
Java
UML
Individual
age : Integer
age : int
_birth_date : Calendar
_Now() : GregorianCalendar
14
Encapsulation, la mtaphore de
liceberg en Java
// implementation
private java.util.Calendar _birth_date;
private static java.util.Calendar _Now() {
return new java.util.GregorianCalendar();
// interface
public int age() {
return _Now().get(java.util.Calendar.YEAR) _birth_date.get(java.util.Calendar.YEAR);
}
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
15
Non encapsulation en C
#include <stdio.h>
#include <time.h>
int main() {
time_t t = 0L; // on fait dlibrment rfrence au type long de C
printf(asctime(gmtime(&t))); // January 1, 1970, 00:00:00 GMT
t = -1L;
printf(asctime(gmtime(&t))); // rsultat ?
return 0;
}
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
16
Attributs/oprations de classe,
dclaration en C++
class Time_Date {
public:
enum Language {English,French};
private:
time_t _time;
Language _language;
public:
static string English_message;
static string French_message;
static string Now(Language = English);
public:
Time_Date(Language = English);
string format() const;
bool leap_year() const;
};
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
17
Attributs/oprations de classe,
utilisation
C++
cout << Time_Date::Now().c_str() << '\n';
Java
Temperature t = new Temperature(18.F,Temperature.Celsius);
18
};
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
19
Hritage en Java
public class Female extends Individual {
public Female(int day,int month,int year) {
super(day,month,year);
}
// restriction : comportements hrits modifis
public int age() { // la gent fminine a une faon particulire de donner son ge
if(super.age() >= 20 && super.age() < 30) return 20;
if(super.age() >= 30 && super.age() < 40) return 30;
if(super.age() >= 40 && super.age() < 60) return 40;
if(super.age() >= 60) return 50;
return super.age();
}
// restriction : comportements hrits rendus concrets
public boolean female() {
return true;
}
public boolean male() {
return false;
}
// extension : nouvelles fonctions inexistantes dans Individual
public Male my_husband() {
}
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
20
21
CheckingAccount ca;
ca.applying_interest_rate();
other_a = &a;
other_a->applying_interest_rate(); // same code, different behavior
other_a = &ca;
other_a->applying_interest_rate(); // same code, different behavior
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
22
}
class Y extends X {
...
public void f() { super.f(); }
}
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
23
}
// interface
public Individual(int day_of_month, int month, int year) {
_birth_date = new java.util.GregorianCalendar(year,month,day_of_month);
}
public int age() {
return _Now().get(java.util.Calendar.YEAR) - _birth_date.get(java.util.Calendar.YEAR);
}
public Individual self() {
return this;
}
abstract public boolean is_female();
abstract public boolean is_male();
// public Individual eldest_sister() {return ...}
// public Individual eldest_brother() {return ...}
24
}
}
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
25
Contravariance (Java)
Individual SophieDarnal = new Female(28,07,1964);
26
}
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
27
Individual
self()
const
{cout
<<
"self()
in
};
class Female : public Individual {
public:
// compilation error: overriding virtual function differs from self() in
// Individual only by return type:
inline const Female self() const {cout << "self() in Female\n";return *this;}
};
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
28
Individual*
self()
const
{cout
<<
"self()
in
};
class Female : public Individual {
public:
// covariance but
inline const Female* self() const {cout << "self() in Female\n";return this;}
};
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
29
class Individual
feature
end
class Female inherit Individual
feature
end
end
x,y : Female
x,y : Female
y := x.self -- incompatibilit de types
y := x.self OK
30
};
31
32
class A {
public: virtual void f();
};
class B : public A {
public: virtual void f();
};
class C : A {
public: virtual void f();
};
class D : B,C {
public: void g();
};
void D::g() {
// A* pA1 = this; // error: ambiguous conversion because
// pA1->f() is unknown
A* pA1 = (B*)this; // with class B : public A
// A* pA2 = (C*)this; // error: conversion inaccessible because
// class C : private A
pA1->f(); // "f from B"
}
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
33
void f() { // no conflict because there is a fusion of the two inherited f()
String s = I1.attribut_with_possible_conflict;
}
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
34
35
36
switch(unit) {
case Celsius: _value = value;
break;
case Fahrenheit: _value = (value - 32.F) * 5.F / 9.F;
break;
case Kelvin: _value = value + -273.15F;
break;
default: throw new Exception("Illegal unit");
}
if(_value < -273.15F) throw new Exception("Illegal temperature");
}
try {
Temperature t = new Temperature(18.F,Temperature.Celsius);
}
catch(Exception e) {
System.exit(1); // viter !
}
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
37
38
39
Individual *i;
i = ; // affectation dune rfrence sur une instance
// dune sous-classe de Individual, e.g. Female
const type_info& ti1 = typeid(i);
if(ti1 != typeid(Female*)) throw bad_typeid();
40
Persistance
Dbut
dexcution
Naissance
Mort
Fin dexcution
temps
Dbut
dexcution
application 1
Fin dexcution
application 1
Dbut
dexcution
application 1
Fin dexcution
application 1
Dbut
dexcution
application 2
Fin dexcution
application 2
temps
Naissance de
O1
Mort de O1
Naissance de
O2
Mort de O2
41
42
43
44
45
Dgnrescence de topologie
dapplication en non objet
Donnes
Programme
principal
Dgnrescence : transgression la
topologie initiale qui avait motiv la
cration de lunit de traitement
utilise
utilise
Unit de
traitement
terminale
46
De la programmation la
modlisation, The 90s
47
Modle
Pour un observateur O, un objet M
est un modle dun objet A dans la
mesure o O peut utiliser M pour
rpondre aux questions qui
lintressent au sujet de A
Df. de Minski, extraite du livre de Habrias sur
NIAM (Eyrolles, 1988)
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
48
Structurel (archtype :
Entit/Relation)
Fonctionnel
(archtypes : SADT,
dataflow, workflow)
Modlisation
objet
Comportemental (archtypes :
Rseaux de Petri, Statecharts)
49
Non-object type
1
Operation
interface
{subsets behavior}
1..*
1..*
1..*
Type
*
supertype 1
immediate type
1
*
instance
1..*
1..*
Inheritance
Implementation
*
Non-object
behavior
1..*
subtype 1 1
Subtyping
instance
Object
OID
1
Identifier
Identity
superclasse
1
50
Besoins
modlisation
analyse
conception
Modles
validation
implmentation
vrification
temps
vrification
validation
vrification
validation
51
Implementation modeling
Full
definition
of system
Construction
Delivery
Coordination and reuse
52
53
54
55
6,4
Barbier
0
5,6
8,4
Royer
9,7
6,8
2,3
2,9
Barbier
1,4
6,8
6,9
Royer
2,9
3,5
CA (K)
2000 + 2001
Andr
Barbier
Royer
Janvier
Fvrier
4,1
1,4
12,6
0
12,4
10,3
Dcembre
CA (K)
2001 - 2000
Andr
Barbier
Royer
Janvier Fvrier
-2,5
1,4
-6,8
0
1,2
-3,3
OK
Dcembre
9,3
15,3
2,3
-3,5
-1,5
-2,3
OK
56
previous year
0..1
Biennal synthesis
lambda for () : Real
lambda for () : Real
turnover indicator-qn() : Real
turnover indicator-mn() : Real
turnover indicator-qn() : Real
turnover indicator-mn() : Real
57
58
Vector
59
Vector
+norm() : Real
+norm addition() : Real
+norm subtraction() : Real
+lambda norm() : Real
60
-implementation
Vector
+norm() : Real
+norm addition() : Real
+norm subtraction() : Real
+lambda norm() : Real
61
-implementation
1
-implementation
Vector
+norm() : Real
+norm addition() : Real
+norm subtraction() : Real
+lambda norm() : Real
Activity card
year() : Integer
turnover indicator-qn() : Real
turnover indicator-mn() : Real
next year
0..1
previous year
0..1
Biennal synthesis
62
-implementation
Vector
+norm() : Real
+norm addition() : Real
+norm subtraction() : Real
+lambda norm() : Real
Activity card
year() : Integer
turnover indicator-qn() : Real
turnover indicator-mn() : Real
next year
0..1
previous year
0..1
Biennal synthesis
63
Ralisation en C++
template<class T> class Vector {
private:
// des mcanismes de gestion mmoire spcifiques sont ncessaires ici
protected:
// des mcanismes de gestion mmoire spcifiques sont aussi ncessaires ici
vector<T> _implementation;
public:
// constructeurs et destructeurs ici
virtual double norm() const = 0; // calcul de norme abstrait, dpend du sous-type
double norm_addition(const Vector& v) const {return (*this + v).norm();}
double norm_subtraction(const Vector& v) const {return (*this - v).norm();}
double lambda_norm(const double lambda) const {return ::fabs(lambda) * norm();}
// fonctions utilitaires (i.e. non membres des besoins initiaux)
// comme laddition de deux vecteurs :
Vector<T>& operator +(const Vector<T>&) const throw(std::logic_error); // code dport
};
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
64
end -- norm_addition
norm_subtraction(a_Vector : like Current) : FLOAT is
end; -- norm_subtraction
lambda_norm(lambda : FLOAT) : FLOAT is
end; -- lambda_norm
-- fonctions utilitaires (i.e. non membres des besoins initiaux)
-- comme laddition de deux vecteurs :
infix "+" (a_Vector : like Current) : like Current is
end -- Vector
Franck.Barbier@FranckBarbier.com - groupe de recherche PauWare
65
Client
children
*
Leaf
Composite
operation()
operation()
add(Component)
remove(Component)
getChild(int)
66
1 active
{subsets flight plan}
1..*
Flight plan
1
1 preferential
{subsets profile}
1..*
Profile
Runway
1
2..*
{ordered}
instantiate
Way point
unique area code
latitude
longitude
Vertical point
Navald
Airport
elevation
altitude
passing speed
passing time
67