Académique Documents
Professionnel Documents
Culture Documents
com
1
Agenda
1. Travailler avec des objets de données persistants
i. Fonctions de base de données
ii. Utilisation des fonctions de base de données
2. Paradigme fonctionnel : résumé
i. Principales caractéristiques du paradigme fonctionnel
ii. Avantages du paradigme
iii. L'ingénierie logicielle et le Paradigme de programmation fonctionnelle
2
Du point de vue de l'ingénierie logicielle, un langage sans prise en charge de la
persistance des objets de données, peut sembler complètement impraticable.
Le paradigme fonctionnel prend en charge les objets de données persistants
en tant que composant spécial - les données fonctionnelles.
Le modèle de données fonctionnelles définit des fonctions associées aux
bases de données par des:
◦ Objets de données persistants,
◦ des attributs,
◦ des relations
Les fonctions associées aux bases de données peuvent être intégrées de
manière transparente aux fonctions ordinaires mentionnées ci-dessus à l'aide
d'opérateurs de construction
3
Les objets de données sont appelés entités de base de données ou
simplement entités dans la terminologie du modèle de données fonctionnel.
Toutes les entités doivent être déclarées en tant que fonctions spéciales
dépourvues de paramètres.
Par exemple, le schéma de base de données traitant les trois Entités
suivants: Customer, Product et Transaction où chaque transaction décrit une
expédition d'un produit à un client, peut être défini comme suit:
◦ CUSTOMER( ) ENTITY
◦ PRODUCT( ) ENTITY
◦ TRANSACTION( ) ENTITY
Notez que deux ou plusieurs entités différentes au sein d'une base de
données fonctionnelle peuvent avoir des valeurs dupliquées de tous les
éléments de données (des attributs).
4
La clé interne (IK – Internal Key) est conceptuellement un
élément de données dont la valeur est automatiquement
associée à chaque entité stockée dans la base de données.
Nous pouvons le considérer comme un identifiant interne unique
utilisé dans une base de données pour distinguer une entité
d'une autre.
Chaque entité se voit attribuer une valeur de clé interne
lorsqu'elle est stockée dans la base de données pour la première
fois.
Une entité conserve une valeur de la clé interne (même si l'entité
est modifiée) jusqu'à ce que l'entité soit définitivement supprimée
de la base de données.
5
Ainsi, nous pouvons considérer la fonction
<entity name>( ) ENTITY
comme une fonction qui produit une valeur particulière de la
clé interne pour chaque entité existante.
Par exemple, la fonction
CUSTOMER( ) ENTITY
pourrait ressembler à ceci:
Entity Internal key
#1, Smith, . . . $C1
#2, Hill, . . . $C2
#8, Johns $C3
6
Par analogie, tous les attributs d'une entité particulière
doivent également être définis sous forme de fonctions.
Par exemple, si l'entité "CLIENT" est décrite avec C#(numéro
de client), CNAME (nom du client), CITY (ville où vit le client)
et PHONE (numéro de téléphone du client), alors ces
fonctions doivent être déclarées comme suit :
◦ C#(CUSTOMER) integer
◦ CNAME(CUSTOMER) string
◦ CITY(CUSTOMER) string
◦ PHONE(CUSTOMER) integer
7
Une telle fonction mappe une valeur particulière de la clé
interne dans une valeur correspondante de l'attribut.
Par exemple, les fonctions:
C#(CUSTOMER) integer
CNAME(CUSTOMER) string
pourrait ressembler à ceci :
8
Normalement, un modèle d'information se compose de deux parties
principales :
◦ entités et
◦ des relations
Les mécanismes du modèle fonctionnel de données décrits jusqu'à présent
ne suffisent pas à couvrir les relations entre entités qui sont, évidemment,
une partie très importante d'un modèle d'information. Considérez, par
exemple, les relations suivantes dans la base de données en cours de
discussion:
Le client Smith ($C1) a acheté le produit VDU ($P1), cet événement est représenté
dans la base de données par l'entité TRANSACTION avec la clé interne $T1. Le
client Hill ($C2) a également acheté le même produit (voir l'entité TRANSACTION
avec clé interne $T2). De telles relations entre entités sont décrites comme des
fonctions associées aux bases de données qui sont appliquées aux entités et
renvoient des entités en conséquence.
9
Par exemple,
CT(TRANSACTION) CUSTOMER
PT(TRANSACTION) PRODUCT
Des fonctions de ce type transforment une clé interne d'une entité
en clé interne correspondante d'une autre.
Ainsi, pour l'exemple discuté précédemment, les fonctions sont
les suivantes:
CT(TRANSACTION) CUSTOMER PT(TRANSACTION) PRODUCT
10
Par conséquent, le modèle de données fonctionnel définit un schéma associé à une
base de données comme un ensemble de fonctions de base de données.
Par example:
/* Definitions of entities */
CUSTOMER( ) ENTITY
PRODUCT( ) ENTITY
TRANSACTION( ) ENTITY
/* Definition of attributes */
C#(CUSTOMER) INTEGER
CNAME(CUSTOMER) STRING
CITY(CUSTOMER) STRING
PHONE(CUSTOMER) INTEGER
P#(PRODUCT) INTEGER
PNAME(PRODUCT) STRING
PRICE(PRODUCT) INTEGER
DATE(TRANSACTION) STRING
QNT (TRANSACTION) INTEGER
TPRICE(TRANSACTION) INTEGER
/* Definition of relationships */
CT(TRANSACTION) CUSTOMER
PT(TRANSACTION) PRODUCT
11
Il existe une notation graphique utile pour les schémas de
bases de données fonctionnelles. Cette notation est connue
sous le nom de diagramme de structure de données
Conformément à la notation, chaque entité (c'est-à-dire une fonction qui définit une
entité) est représentée sous la forme d'un rectangle. Le rectangle contient le nom de
l'entité. Toutes les autres fonctions sont représentées par des flèches. La flèche est
dirigée vers l'entité ou le type de données résultant; la flèche émane du symbole
d'entité qui correspond aux paramètres de la fonction.
12
Dans le modèle de données fonctionnel, pour chaque fonction f(s) t la
fonction inverse Inv_f(t) s est également disponible.
Par exemple, la fonction inverse INV_C#(integer) CUSTOMER
◦ mappe les valeurs de l'attribut C# dans les clés internes de l'entité Customer
De manière analogue, la fonction inverse
INV_CNAME(STRING) CUSTOMER
◦ transforme une valeur particulière de l'attribut CNAME en une clé interne
correspondante d'une entité CUSTOMER
INV_C#(integer) CUSTOMER INV_CNAME(string) CUSTOMER
INV_C#(1) $C1 INV_CNAME(Smith) $C1
INV_C#(2) $C2 INV_CNAME(Hill) $C2
INV_C#(8) $C3 INV_CNAME(Johns) $C3
13
Il existe également des fonctions inverses qui décrivent des relations entre
entités.
Ex: la fonction inverse INV_CT(CUSTOMER) TRANSACTION transforme
une clé interne de l'entité CUSTOMER en une clé interne correspondante de
l'entité TRANSACTION
INV_CNAME(string) CUSTOMER
INV_CT($C1) $T1
INV_CT($C2) $T2
14
Les fonctions à plusieurs valeurs produisent des résultats qui appartiennent à
ce que l'on appelle un type de données en bloc (bulk data type).
◦ Le seul type de données «bloc» disponible dans le modèle de données fonctionnel est
une liste (c'est-à-dire un nombre séquentiel d'éléments qui peuvent être des listes ou des
valeurs uniques à leur tour).
◦ Par conséquent, les fonctions à valeurs multiples sont représentées par des fonctions à
valeurs de liste dans le modèle de données fonctionnel.
Par exemple, la fonction inverse
INV_PT(PRODUCT) TRANSACTION
◦ est une fonction de liste car elle produit généralement une liste de valeurs comme résultat
INV_PT($P1) [$T1, $T2] est une liste de valeurs uniques de clés internes
Notez qu'une fonction à valeur unique peut être appliquée à une liste (c'est-à-dire qu'une liste
de valeurs peut être utilisée comme paramètre d'une fonction à valeur unique).
15
Par exemple,
INV_CT([$C1,$C2]) [$T1,$T2]
liste comme paramètre liste comme résultat
CNAME([$C1,$C2]) [Smith, Hill]
Le type d'une fonction de base de données particulière donne des informations essentielles
sur la sémantique d'une base de données.
Par exemple, si la fonction INV_C# (integer) CUSTOMER est définie comme une fonction
à valeur unique, alors l'attribut C# peut être considéré comme une clé externe (c'est-à-dire
que les valeurs dupliquées ne sont pas autorisées).
Par analogie, la définition de la fonction CT(TRANSACTION) CUSTOMER comme une
fonction à valeur unique assure que chaque entité "TRANSACTION" correspond exactement
à une seule entité « CUSTOMER", et ainsi de suite.
16
Ainsi, afin de distinguer les types de certaines fonctions,
◦ les fonctions à valeur unique sont représentées par des flèches à une pointe ()
◦ les fonctions à plusieurs valeurs sont représentées par des flèches à double pointe
()
Si la fonction inverse n'est pas explicitement déclarée comme une fonction
à valeur unique, elle est considérée comme une fonction à valeurs
multiples (option par défaut)
Par exemple, les fonctions INV_CNAME, INV_PT, INV_CT etc. sont à
valeurs multiples et, par conséquent, peuvent être définis comme suit:
INV_CNAME(STRING) CUSTOMER
INV_CT(CUSTOMER) TRANSACTION
INV_PT(PRODUCT) TRANSACTION
17
Ainsi, un système de base de données fonctionnelle
comprend les composants suivants
1. Fonctions de base de données
2. Etat actuel des fonctions associées à une base de données définie
comme une collection de paires
18
Les requêtes (queries) dans le modèle de données fonctionnel sont
également définies à l'aide de fonctions.
Une telle fonction définie par l'utilisateur est appelée fonction de requête
(query) ou fonctions de manipulation de données. Dans le cas le plus
simple, les fonctions associées aux bases de données peuvent être
simplement combinées afin de créer des fonctions de requête.
Par exemple, la requête
"Obtenir les noms des clients de Paris" peut être défini comme la fonction composite suivante:
CNAME(INV_CITY("Paris")) string
Supposons qu'une base de données soit définie au moyen de deux
fonctions de base de données :
CITY(CUSTOMER) string, et CNAME(CUSTOMER) string
19
Supposons qu'une base de données soit définie au moyen de deux
fonctions de base de données
Supposons également que les fonctions se présentent comme suit:
CITY(CUSTOMER) string CNAME(CUSTOMER) string
CNAME ($C1) Smith
CITY ($C1) London
CITY ($C2) Paris CNAME ($C2) Hill
20
Supposons également que les fonctions de la base de données (c'est-
à-dire l'état actuel de la base de données) se présentent comme suit :
21
Si l'on prend la fonction Customer TransactionsCT :
CT(TRANSACTION) CUSTOMER
CT ($T1) $C1
CT ($T2) $C2
CT ($T3) $C3
PT ($T4) $C4
22
Les programmes fonctionnels n'utilisent pas de variables - il n'y a pas d'état. Par
conséquent, ils ne peuvent pas utiliser les assignations, puisqu'il n'y a rien à assigner.
Il n'y a pas de séquence de commandes. La première commande ne fait aucune
différence avec la seconde puisqu'il n'y a pas d'état pour servir de médiateur entre
eux.
Les programmes fonctionnels peuvent utiliser des fonctions de manière beaucoup
plus sophistiquée. Les fonctions peuvent être traitées exactement de la même
manière que des objets plus simples comme des entiers:
◦ ils peuvent être passés à d'autres fonctions en tant qu'arguments
◦ retourné comme résultats
◦ en général calculé avec.
Au lieu de séquencer et de boucler, les langages fonctionnels utilisent des fonctions
récursives, c'est-à-dire fonctions définies par elles-mêmes. En revanche, la plupart
des langues traditionnelles offrent des installations médiocres dans ces domaines*.
*) Le langage C permet une manipulation limitée des fonctions via des pointeurs, mais
ne permet pas de créer dynamiquement de nouvelles fonctions. FORTRAN ne
supporte même pas du tout la récursivité.
23
Les programmes fonctionnels correspondent plus directement à des
objets mathématiques, et il est donc plus facile de raisonner dessus
Afin de bien comprendre ce que signifient exactement les
programmes, nous pourrions souhaiter attribuer une signification
mathématique abstraite à un programme ou à une commande - c'est
le but de la sémantique dénotationnelle (décrivant toutes les
fonctionnalités trouvées dans les langages de programmation
impératifs avec une base mathématique solide)
Les programmes fonctionnels peuvent bien se prêter à une mise en
œuvre parallèle, c'est-à-dire l'ordinateur peut automatiquement
exploiter différentes sous-expressions vers différents processeurs
http://www.csse.monash.edu.au/~lloyd/tilde/Semantics/
24
Réutilisabilité: toute personne ayant besoin d'une fonctionnalité
particulière peut utiliser une fonction appropriée, sans avoir à
coder l'algorithme à partir de zéro.
Spécialisation: une personne peut se concentrer sur l'écriture
d'une meilleure fonction possible pour une tâche particulière
tandis que d'autres s'occupent d'autres domaines.
Évolutivité: si un programmeur propose une meilleure façon
d'implémenter une fonction, il remplace simplement le code dans
la fonction.
De toute évidence, le paradigme est le mieux adapté au modèle
de prototypage rapide du développement logiciel.
25
Le prototypage repose sur l'idée de développer une première implémentation pour les retours des
utilisateurs, puis d'affiner ce prototype à travers de nombreuses versions jusqu'à ce qu'un système
satisfaisant émerge.
• Programmation exploratoire - travaillez avec l'utilisateur pour explorer ses besoins et fournir un
système final.
• Prototypage jetable - L'objectif est de comprendre les exigences des utilisateurs et de développer
une meilleure définition des exigences pour le système
Le prototypage, aussi appelé développement évolutif, ou RAD (Rapid Application Development) vise à
améliorer la précision de la perception par le concepteur des besoins de l'utilisateur. Le prototypage
repose sur l'idée de développer une première implémentation pour les retours des utilisateurs, puis
d'affiner ce prototype à travers de nombreuses versions jusqu'à ce qu'un système satisfaisant émerge.
Les activités de spécification, de développement et de validation sont menées en parallèle avec un
retour d'expérience rapide sur l'ensemble des activités. Généralement, le prototypage se caractérise
par l'utilisation de langages de très haut niveau, qui ne seront probablement pas utilisés dans
l'implémentation logicielle finale mais qui permettent un développement rapide, et le développement
d'un système avec moins de fonctionnalités par rapport aux attributs de qualité tels que la robustesse,
vitesse, etc... Le prototypage permet de clarifier les besoins des utilisateurs grâce, notamment, au
développement précoce de l'interface utilisateur. L'utilisateur peut alors essayer le système, même s'il
s'agit d'un (sous-)système de ce qui sera le produit final. Cela permet à l'utilisateur de fournir des
commentaires avant qu'un investissement important n'ait été fait dans le développement du mauvais
système.
Des expériences de prototypage ont montré que cette approche prenait 40 % de temps en moins et
entraînait 45 % de code en moins ; cependant, il produisait un code moins robuste et donc plus difficile
à maintenir. La documentation était souvent sacrifiée ou incomplète. Les attentes de calendrier des
utilisateurs et des gestionnaires avaient tendance à être irréalistes, en particulier en ce qui concerne les
prototypes jetables.
Exemple : utilisez Oracle APEX pour le développement rapide d'applications afin de rendre vos données
Oracle rapidement et facilement disponibles via une application Web. • Créez de puissantes
applications Web multipages fonctionnelles en quelques minutes • Utilisez des rapports "interactifs"
avancés prêts à l'emploi • Intégrez les fonctionnalités javascript et AJAX avec des actions dynamiques
construites par pointer-cliquer • Créez facilement des graphiques et des diagrammes avec drill-to -
fonctionnalités détaillées • Comprendre les multiples outils en un d'APEX, y compris le développement
complet SQL/PLSQL et les capacités d'administration.
26