Abstraction procédurale

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Les fonctions A quoi ça sert ?
Portée des variables VBA & Excel
Cours n° 8 Conception et Programmation à Objets
C.
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
INTRODUCTION.
Introduction à la programmation (420-PK2-SL) cours 15 Gestion des applications Technologie de linformation (LEA.BW)
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
CSI3525: Concepts des Langages de Programmation Notes # 11: Sous-Programmes ( Lire Chapitre 8 )
1 ARCHITECTURE DACCÈS la méthode générale modèle de données définitions module daccès / modules métiers construction des modèles les modules daccès, les.
Principes de programmation (suite)
Tests Programmation par contrats
La programmation Orienté Objet
Sous-programmes Concepts généraux Passage de paramètres Fonctions
18/10/2004 P. Van Roy, InfoT4, S5 1 Informatique T4 Solutions au Test du 18 octobre Peter Van Roy Département dIngénierie Informatique, UCL
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Algorithmique et Programmation
Faculté I&C, Claude Petitpierre, André Maurer What is this ? (Quest ce que this ?)
Algorithmique et Programmation
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Introduction à la programmation (Java)
Langage Oriente Objet Cours 2.
Test et débogage Tests unitaires. Gestion d’erreurs. Notion d’état, de pré-condition et de post-condition. Assertion. Traces de programme. Débogueur et.
Introduction au paradigme orienté-objet (suite)
Présentation Structures de Données et TDA
CSI3525: Concepts des Languages de Programmation
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
Chapitre 9 Les sous-programmes.
Partie II Sémantique.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Structures de données IFT-10541
Procédures et fonctions
1212 Entrée et sortie de fichiers Objectifs À la fin de ce cours, vous serez capables de : • Lire à partir de la console • Écrire sur la console.
Objectifs À la fin de ce cours, vous serez capables de :
Paradigmes des Langages de Programmation
INTRODUCTION.
La notion de type revisitée en POO
Cours 61 6 La sécurité, Portée, Visibilité Programmer avec sécurité.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
Variables et accès en Java. Déclaration des variables final transient static private Printer hp; transient => ne doivent pas être sérialisées volatile.
Créer des packages.
Programmation linéaire en nombres entiers
2003 (revisé 2008)SEG Chapitre 11 Chapitre 1 “The Systems Engineering Context” Le contexte du génie de systèmes.
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
Tutorat en bio-informatique
12/04/ Les exceptions Cours 11 Cours 11.
5ième Classe (Mercredi, 19 octobre) Prog CSI2572.
Introduction au langage C Fonctions et Procédures
Méthodes et outils de conception Introduction à la programmation Paramètre de retour Appel d’une fonction Portée des variables Définition Pourquoi les.
Le polymorphisme.
(ref : Bray section pages 259 à 266)
Behavioral Design Patterns The Observer Pattern. Intention Définir une dépendance de “1” à “n” entre des objets de telle sorte que lorsque l’état d’un.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Héritage Conception par Objet et programmation Java
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
3 Copyright © Oracle Corporation, Tous droits réservés. Créer des fonctions.
La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité.
8PRO107 Éléments de programmation Les adresses et les pointeurs.
Introduction à la Programmation Orientée Objet
Scripts et fonctions Instructions de contrôle
Philippe Gandy - 15 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
1 Spécifications de Problèmes. 2 Plan Définition Motivation Qualités attendues Types de formalismes Rappels du cours de programmation Spécifications structurées.
PRÉSENTATION AGL LES TESTS LOGICIELS LES TEST LOGICIELS 1 Mickael BETTINELLI Brandon OZIOL Gaétan PHILIPPE Simon LUAIRE.
1 Initiation aux bases de données et à la programmation événementielle VBA sous ACCESS Cours N° 4 Support de cours rédigé par Bernard COFFIN Université.
Transcription de la présentation:

Abstraction procédurale B. Liskov, Program Development in Java, chap. 3 Procedural Abstraction

Plan Saisir le concept d’abstraction Des avantages de l’abstraction De l’usage des spécifications De la spécification et de l’implémentation des procédures Vers la norme de spécification de l’IEEE

Procédure et abstraction Les procédures combinent les méthodes d’abstraction par Paramétrisation Spécification Afin d’abstraire une simple action ou une tâche

Qu’est-ce qu’une procédure ? Une transformation des arguments en entrée (0 à n) en arguments en sortie (0 à n) Avec modifications possibles aux arguments en entrée

Des avantages de l’abstraction Projection de n à 1 S’abstraire des détails non pertinents Les réalisations sont les mêmes dans les aspects pertinents peuvent varier pour les détails non pertinents

Abstraction par paramétrisation S’abstraire de l’identité des données utilisées Paramètres formels Remplacer par les valeurs réelles Eléments non pertinents L’identité des données qui seront utilisées Eléments pertinents Présence, nombre et type des paramètres La paramétrisation généralise les abstractions Les rend utiles dans plusieurs contextes Avantage Diminue la taille du code qui doit être écrit, modifié et maintenu

Abstraction par spécification Accent est mis sur le comportement auquel l’usager peut s’attendre Abstraction des détails de l’implémentation de ce comportement Élément pertinent ce qui est réalisé Élément non pertinent comment c’est réalisé Avantage Permet de changer l’implémentation sans affecter la signification des programmes qui utilisent cette abstraction Algorithmes différents Langages de programmation différents Par exemple, optimiser certaines parties en langage machine

Propriétés de l’abstraction par spécification Propriétés par rapport à la structure des programmes Localité L’implémentation d’une abstraction peut être lu ou écrite sans devoir examiner les implémentations des autres abstractions Un programmeur n’a besoin de ne comprendre que le comportement de l’abstraction et non les détails de son implémentation Les différentes abstractions qui forment un programme peuvent être écrites par des programmeurs travaillant indépendemment

Propriétés de l’abstraction par spécification Propriétés par rapport à la structure des programmes Modifiabilité Permet de contrôler les modifications et la maintenance Si l’implémentation d’une abstraction change, mais pas sa spécification Alors le reste du programme ne sera pas affecté par cette modification Par exemple, contraindre les opérations dépendantes de la machine à quelques abstractions pour réduire la difficulté et les efforts liés au « transport » sur une autre machine Conduit à une méthode raisonnable et compréhensible pour la mise au point de la performance Il est notoire que les programmeurs sont particulièrement mauvais pour anticiper où les calculs d’un système complexe seront importants Il est très difficile d’identifier les goulots d’étranglement http://www.quest.com/jprobe/index.asp The freeware version is available for Windows and Linux

Des spécifications Si on veut exploiter les propriétés des abstractions (localité et modifiabilité) il est essentiel de donner aux abstractions des définitions précises Les abstractions sont définies par des spécifications Formelles Elles ont une signification précise Informelles Plus faciles à écrire et à lire Moins précises Les spécifications précisent les aspects communs des implémentations qui réalisent une abstraction Un langage de spécification n’est pas un langage de programmation

La spécification d’abstractions procédurales En-tête Information syntaxique Spécification des effets Information sémantique

L’en-tête Information syntaxique Nom de la procédure Nombre, ordre, nom(s) et type(s) des paramètres Type du résultat Liste des exceptions lancées Exemples void removeDupls(Vector v) float sqrt (float x)

La spécification des effets Information sémantique Ce que fait la procédure 3 parties Clause requires Clause modifies Clause effects // REQUIRES: cette clause énumère toute contrainte liée à l’usage de la procédure // MODIFIES: cette clause identifie tout paramètre d’entrée modifié //EFFECTS: cette clause définit le comportement de la procédure Return_type proc_name (…)

Entrées d’une procédure Pour la plupart des procédures Exactement les paramètres énumérés dans l’en-tête de la procédure Certaines procédures ont des entrées implicites fichier à lire System.out

La clause REQUIRES Explicite les contraintes sous laquelle l’abstraction est définie Nécessaire si la procédure est partielle Si son comportement n’est pas défini pour certaines entrées exemple, factorielle Peut être omise si la procédure est totale Si son comportement est défini pour toutes les entrées dont le type est acceptable Dans ce cas, les seules contraintes sont celles spécifiées sur le nombre, le type et l’ordre des paramètres d’appel

La clause MODIFIES Énumère le nom de toute entrée qui est modifiée par la procédure Correspond aux effets de bord Peut être omise s’il n’y a pas d’effets de bord

La clause EFFECTS Décrit les effets de la procédure pour toutes les entrées acceptables Suppose que la clause REQUIRES est satisfaite Définir quelles sorties seront produites Définir quelles modifications sont faites aux entrées dans la liste de la clause MODIFIES

La spécification des classes En Java, procédures == méthodes static Il faut donc connaître la classe où elles sont définies La spécification doit mentionner Le nom de la classe Une brève description de son rôle. visibility class_name { // OVERVIEW : this class defines the // purpose of the class as a whole visibility static proc_name_1 {…} visibility static proc_name_2 {…} }

totale partielle totale /** * OVERVIEW : this class provides a number of standalone procedures * that are useful for manipulating arrays of ints * */ public class Arrays { * EFFECTS : if x is in a, returns an index where x is stored; * otherwise, returns -1 public static int search(int[] a, int x) {…} * REQUIRES: a is sorted in ascending order public static int searchSorted (int[] a, int x) {…} * MODIFIES: a * EFFECTS : Rearranges the elements of a into ascending order * e.g. if a = [3, 1, 6, 1] before the call, * on return a = [1, 1, 3, 6] public static void sort ( int[] a){} } totale partielle totale

Remarques La spécification de searchSorted ne spécifie par ce qui se passe si l’argument ne respecte pas la clause REQUIRES Moralité : éviter le plus possible les clauses REQUIRES Notation alternative /** * MODIFIES: a * EFFECTS : Rearranges the elements of a into ascending order * e.g. if a = [3, 1, 6, 1], * a_post = [1, 1, 3, 6] */ public static void sort ( int[] a){}

Exemple /** * * REQUIRES: * MODIFIES: * EFFECTS : returns a new array containing the element of “a” * in the order they appear in “a” * except that any element of “a” that are greater than “n” * are replaced by “n” */ public static int[] boundArray ( int[] a, int n) Est-ce boundArray peut rendre le même vecteur si aucun de ses éléments n’est supérieur à n ? Exclu par la spécification Cette précision est importante à cause des problèmes de partage éventuel de référence

Exemple avec entrées implicites /** * * REQUIRES: System.in contains a line of text * MODIFIES: System.in and System.out * EFFECTS : Reads a line of text from System.in, * advances the cursor in System.in to the end of the line, * and writes the line on System.out */ public static void copyLine(){} Rem.: la spécification décrit les effets sur les entrées implicites

De l’implémentation des procédures L’implémentation doit produire le comportement spécifié par sa spécification En particulier, ne doit modifier que les entrées de la clause MODIFIES

Qu’est-ce qu’une implémentation acceptable? /** * REQUIRES: “a” is sorted in ascending order * EFFECTS : if “x” is in “a”, returns an index where “x” is stored; * otherwise, returns -1 */ public static int searchSorted(int[] a, int x) { if (a == null) return -1; for (int i = 0; i < a.length; i++) if (a[i] == x) return i; else if (a[i] > x) return -1; } Test if (a==null) return -1; Consistant avec la spécification Cependant, il vaut mieux traiter ce cas à part et déclencher une exception

Le design d’abstractions procédurales Les procédures servent à réduire le code appelant à clarifier la structure d’un programme On peut parfois introduire trop de procédures… Propriétés souhaitables des spécifications et de leur implémentation minimalement contraignantes générales simples

De la minimalité Une spécification est « plus minimale » qu’une autre si elle possède moins de contraintes.

Procédures sous-déterminées Certains détails de ce que fait une procédure peuvent être non-définis Pour certaines entrées, il peut exister plusieurs sorties acceptables En général, les implémentations sont déterministes, mais ils peuvent être non-déterministes Usage de primitives non-déterministes, données globales, variables statiques Exemples Dans search et searchSorted On ne spécifie pas quel indice doit être rendu si l’élément recherché se trouve plusieurs fois dans le vecteur Résultat: des implémentations différentes peuvent rendre des résultats différents

De la généralité des procédures Une procédure est plus générale si elle peut traiter une plus grande classe d’entrée Obtenue en utilisant des paramètres Par exemple, l’objet recherché Généraliser une procédure n’est intéressant que si cela augmente son utilité Éliminer les hypothèses liées à la taille, etc. La généralisation est discutée au chapitre 8 du livre de Liskov

De la simplicité des procédures Une procédure devrait avoir un rôle bien défini facile à expliquer indépendant du contexte d’utilisation Un indice de simplicité le nom devrait être facile à trouver

Quand définir une procédure partielle? Procédures partielles Peuvent être plus efficaces que les procédures totales Par ex. l’implémentation de searchSorted pourra être optimisée Pas aussi sécuritaires que les procédures totales Car l’usager doit s’assurer que les contraintes de la clause REQUIRES sont satisfaites Par ex. le comportement de searchSorted n’est pas défini si le vecteur n’est pas trié

Remarques sur l’usage des procédures partielles Conclusion : Il faut choisir entre l’efficacité et un comportement sécuritaire à l’exécution n’utiliser les procédures partielles que lorsque le contexte d’utilisation est bien limité et qu’un bénéfice substantiel peut en être retiré, par exemple la performance Lorsque c’est possible, l’implémentation devrait vérifier les contraintes de la clause REQUIRES et lancer une exception le cas échéant Par exemple, si dans une librairie – contexte général – privilégier la sécurité Lorsque les contraintes ne sont pas respectées Rendre une valeur ou un objet correspondant à un code d’erreur, e.g. -1, null… Afficher un message d’erreur Lancer une exception (l’approche à privilégier) Le chapitre 9 de Liskov traite de la manière d’écrire de bonnes spécifications