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 Personne30
);
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
IS5
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
IS14
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 date10
);
