Un exemple: la methode Object Oriented Analysis and Design
3.1.3 Langage de programmation haut niveau
Il s'agit de denir un langage a objets haut niveau pour permettre les preuves et le raf- nement. Les avantages sont evidemment l'executabilite des specications et leur semantique formelle. L'ecueil principal a eviter est la sur-specication. Les langages Eiel [Mey88], FOOPS [GM87b], POOL [Ame89] et le modele des classes formelles [ACR94] illustrent cette approche. Une autre voie est d'ajouter des possibilites de specication et de verication dans les langages de programmation a objets. Ceci permet une certication des composants logiciels. Par exemple, Fresco [Wil91] et SmallVDM [LH93], bases sur Smalltalk, ont des caracteristiques inspirees de VDM. Analyse et Conception à objets de programmation Spécifications Langages à objets formelles Formaliser Object-Z, Z++ PLUSS, OBJ3 HOOD/Z OOD/Object-Z OS/OP, GSBL Eiffel, POOL Fresco, SmallVDM
Figure 14 : Integration de concepts formels et a objets.
3.2 Panorama
Nous passons en revue quelques langages de specication ou de conception abstraite inte- grant des modeles formels a objets.
3.2.1 ObjectZ
Object-Z est une extension du langage de specication Z (voir section 2.2.5) aux concepts a objets [CLLF93, Duk90, DD90, Smi93, Cus91]. Il a ete developpe a l'universite de Queensland en Australie, sous l'impulsion notamment de Roger Duke et Gordon Rose. C'est a la fois le precurseur dans le domaine et le plus utilise actuellement.
Mo dele a objets
L'objectif initial du langage est de structurer les specications Z. Pour cela, un nouveau schema encapsule dierents schemas Z dans une classe. Un schema de classe permet de regrouper
un ensemble coherent de schemas d'etat ou d'operation dans une m^eme structure syntaxique. Les denitions et declarations locales ont une syntaxe Z.
Nom de Classe [parametres generiques] liste de visibilite
superclasses
definitions de types definitions de constantes schema d0etat
schema d0etat initial
schema d0operations
invariant d0historique
Lorsque la liste de visibilite est omise, tous les attributs sont visibles. Dans l'exemple de la le d'attente, la classeHospitalQueueest partiellement denie par:
HospitalQueue[T] :::declarations:::
avec les declarations suivantes2: jMAX ::= 20 patients : seq T #patientsMAX INIT patients =hi Join[T] (patients) patient? : T patient? =2patients #patients < MAX patients0= item _ hpatient?i LeaveN[T] (patients) patient! : T patients6=hi
patients =hpatient!i_ item
La constante MAX est propre a la classe. Le schema d'etat comprend une variable appelee attributs et son etat initial. Dans les schemas d'operations, l'inclusion de schemas () devient
2Le format L
implicite. Seuls les attributs modies gurent, les autres ne changent pas. Lors de l'instanciation d'une classe generique (appelee application), Object-Z autorise le renommage des attributs ('/') et des parametres d'operations. Ainsi, une le d'attente d'un bureau de poste pourrait s'ecrire
PostOfficeQueue == HospitalQueue[People][patients=suppliers; patient?=supplier?;patient!=supplier!]
Les declarations heritees et les nouvelles declarations sont mixees, y compris l'invariant. Les con its de noms sont resolus par renommage global pour la classe ou local aux operations. La surcharge (redef) et la suppression (remove) sont acceptes.
Une instance de la classe est une aectation de valeurs aux attributs, coherente avec la denition de la classe. Une declaration de type c : Cdenit une reference a un objet de classe
C. Pour denir deux objets distinctsc,d : Cen Object-Z, il faut ajouter une contrainte c6= d.
Les objets peuvent avoir des constituants d'objets. Les references immuables aux objets sont declarees par des constantes. Par exemple, nous denissons l'h^opital par
Hospital :::declarations:::
qurgency;qnormal: HospitalQueue[People]
qurgency6= qnormal
INIT
qurgency:INIT ^qnormal:INIT
Admit= qb normal:Join
Urgency= qb urgency:Join
Cure= CureUrgencyb _CureNormal_CureNobody
CureUrgency (qurgency;qnormal)
p! : People
qurgency:IsEmptyreport! = false
qurgency:Leavepatient! = p!
CureNormal (qurgency;qnormal)
p! : People
qurgency:IsEmptyreport! = true
qnormal:IsEmptyreport! = false
qnormal:Leavepatient! = p!
CureNobody (qurgency;qnormal)
p! : People
qurgency:IsEmptyreport! = true
L'instanciation est propagee dans les objets complexes. Par exemple, un h^opital contient un nombre quelconque de les.
jqueues : IFHospitalQueue[People] INIT 8q : queuesqueue:INIT SelectNonFullQueue qnf? : HospitalQueue[People] qnf?2queues
qnf?:IsFullreport! = false
SelectNonEmptyQueue qne? : HospitalQueue[People] qne?2queues
qne?:IsEmptyreport! = false
SelectTwoQueues= SelectNonEmptyQueueb ^SelectNonFullQueueqne?6= qnf?
Admit= SelectQueueb q?:Join
Cure= SelectQueueb q?:Join
IsEmpty =b 8q : queuesq:IsEmptyreport! = true Caracteristiquespropres
Object-Z ajoute des operateurs de schema a Z: le choix indeterministe S[]T, la conjonction S T (accessibilite des declarations) et l'operateur parallele S jjT, qui correspond en fait a
une sorte de serialisation car les parametres de m^eme nom sont unies. Le polymorphisme d'un objet peut ^etre explicite par la notation#Class, qui indique que le type de l'objet considere
sera un descendant de Class.
Transfer = SelectTwoQueuesb (qne?:Leavejjqnf?:Join)
Une interpretation comportementale est possible au travers de traces, appelees invariant historique. Un historique est une sequence d'evenements que subit un objet. Ces evenements correspondent a des appels d'operations. L'invariant d'historique pourrait ^etre donne en termes de predicats Z, mais la logique temporelle est plus adaptee [DS92, SD92]. Les operateurs logiques sont: suivant( ) possible au rang suivant,possible(}) vrai dans le futur, toujours(ut)
vrai a tout moment. Par exemple, la classe des h^opitaux dont les les sont equitables est une sous-classe deHospitalQueue[T]telle que si la le d'attente de l'h^opital n'est pas vide alors
elle se reduira dans le futur: FairHospitalQueue[T] HospitalQueue[T]