Des voitures et des hommes II
[30 minutes]
Soit le diagramme de classe UML et le MLD en RO suivants :
1
Type Personne : <
2
nom:string,
3
ddn:date,
4
=age():entier
5
>
6
tPersonne de Personne (#nom)
7
8
Type Conducteur : <
9
nom:string,
10
ddn:date,
11
typePermis:{A,B,E},
12
datePermis:date
13
=age():entier
14
>
15
tConducteur de Conducteur (#nom)
16
17
Type Voiture : <
18
type:string,
19
marque:string,
20
nbPortes:integer,
21
puissance:integer,
22
fkPropriétaire =>o tPersonne,
23
>
24
tVoiture de Voiture (#type, #marque)
25
26
tConduit (voiture =>o tVoiture, conducteur =>o tConducteur)
Question
Proposer une implémentation sous Oracle de votre modèle logique (sans implémenter les méthodes et sans utiliser l'héritage de type).
Solution
1
CREATE OR REPLACE TYPE Personne AS OBJECT (
2
nom varchar(20),
3
ddn date,
4
MEMBER FUNCTION age RETURN number
5
);
6
/
7
CREATE TABLE tPersonne OF Personne (
8
PRIMARY KEY (nom)
9
);
10
11
CREATE OR REPLACE TYPE Conducteur AS OBJECT(
12
nom varchar(20),
13
ddn date,
14
typePermis char(1),
15
datePermis date,
16
MEMBER FUNCTION age RETURN number
17
);
18
/
19
CREATE TABLE tConducteur OF Conducteur (
20
PRIMARY KEY (nom),
21
CHECK (typePermis IN ('A','B','E'))
22
);
23
24
CREATE OR REPLACE TYPE Voiture AS OBJECT (
25
type varchar(20),
26
marque varchar(20),
27
nbPortes number,
28
puissance number,
29
proprietaire REF Personne
30
);
31
/
32
CREATE TABLE tVoiture OF Voiture (
33
PRIMARY KEY (type, marque),
34
SCOPE FOR (proprietaire) IS tPersonne
35
);
36
37
CREATE TABLE tConduit (
38
voiture REF Voiture,
39
conducteur REF Conducteur,
40
SCOPE FOR (voiture) IS tVoiture,
41
SCOPE FOR (conducteur) IS tConducteur
42
);
Question
Implémenter la méthode Age() pour Personne et pour Conducteur.
Indice
1
trunc(months_between(SYSDATE, ddn)/12
Solution
1
CREATE OR REPLACE TYPE BODY Personne
2
IS
3
MEMBER FUNCTION age RETURN number
4
IS
5
BEGIN
6
RETURN trunc(months_between(SYSDATE, ddn)/12);
7
END;
8
END;
9
/
10
CREATE OR REPLACE TYPE BODY Conducteur
11
IS
12
MEMBER FUNCTION age RETURN number
13
IS
14
BEGIN
15
RETURN trunc(months_between(SYSDATE, ddn)/12);
16
END;
17
END;
18
/
Remarque :
On remarque la duplication de la méthode age
.
On peut éviter cela en utilisant l'héritage de type.
Question complémentaire (héritage de type)
L'amélioration proposée ci-après évite notamment la double déclaration de la méthode age
.
Question
Proposer une solution mobilisant l'héritage de type afin de factoriser la déclaration des attributs nom
et ddn
et la méthode age
.
Solution
1
CREATE OR REPLACE TYPE Personne AS OBJECT (
2
nom varchar(20),
3
ddn date,
4
MEMBER FUNCTION age RETURN number
5
) NOT FINAL;
6
/
7
CREATE OR REPLACE TYPE Conducteur UNDER Personne (
8
typePermis char(1),
9
datePermis date
10
);