Cours gratuits » Cours informatique » Cours programmation » Cours Oberon » Cours OBERON BANK RECHERCHE 2003 en PDF

Cours OBERON BANK RECHERCHE 2003 en PDF

Problème à signaler:

Télécharger



★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Cours OBERON programmation orienté objet [Eng]

1. Introduction

Tous les étudiants en informatique de l'Université de Ljubljana suivent le cours de programmation d'introduction, Programmation I, au premier semestre. Le cours a été basé jusqu'à présent sur le cours CS 1 [3]. La langue d'enseignement était Pascal alors que le contenu du cours comprenait les éléments de base de Pascal (types de données de base, expressions, instructions), les procédures, les types composites, la récursivité et les types de données dynamiques.

L'expérience des dernières années a mo

ntré que ce contenu de cours ne convenait plus, et nous avons donc décidé de le restructurer de manière fondamentale.

Une analyse plus détaillée des raisons qui nous ont amenés à prendre cette décision est décrite dans la section deux. La section trois est consacrée au choix du langage de programmation pour le cours, tandis que la section quatre contient une discussion plus détaillée des dilemmes auxquels est confronté le concepteur du cours avec un accent particulier sur l'approche appropriée pour enseigner la programmation orientée objet (00P).

2 Facteurs ayant influencé le changement dans la conception du cours

Au cours de la décennie précédente, le système d'enseignement secondaire slovène a réussi à développer considérablement l'enseignement de l'informatique. En conséquence, la plupart des étudiants entrants avaient déjà été exposés à l'une des langues procédurales, généralement Pascal. Malgré le fait que les étudiants n'avaient pas complètement maîtrisé Pascal (le manque de connaissances est particulièrement évident dans les domaines du traitement de fichiers, des types de set, des structures de données dynamiques, et de la récursivité), ils expérimentent Pascal comme langue d'enseignement comme un effort redondant.

De plus, il est devenu évident que l'enseignement de l'enseignement secondaire comporte certaines conséquences néfastes qui sont fréquemment prises en compte dans l'enseignement des langages procéduraux: Une emphase excessive sur la syntaxe et les détails de la mise en œuvre avec un emo insuffisant concomitant. phasis sur les principes de "programmation appropriée" caractérisée par la lisibilité, la structure claire, la modularité, etc. (Smallwood [7]). Dans le cours actuel, nous avons tenté d'atténuer ce problème en mettant davantage l'accent sur l'approche systématique et sur une certaine discipline pendant la phase de conception du programme. Cependant, l'opinion de l'étudiant a souvent été qu'il s'agit d'un cas de pédanterie inutile de la part de l'enseignant.

Ainsi, nous avons décidé de restructurer le contenu du cours dans le but de:

  • Rendre le cours plus attrayant pour les étudiants;
  • Adapter le contenu à leurs connaissances antérieures;
  • Mettant l'accent sur les principes de la «bonne programmation»;
  • Y compris les concepts de programmation contemporains et les paradigmes avec un accent particulier sur OOP.

Il est apparu que certains des objectifs seraient mieux servis en choisissant un nouveau langage de programmation. Bien que Pascal n'ait pas été exclu au départ, nous avons accordé une attention particulière à l'identification d'un langage qui préserverait les avantages du Pascal en tant que langue d'enseignement, et qui seraient simultanément appropriés pour l'enseignement du nouveau paradigme de la POO.

3 Le choix du langage de programmation

3.1 Facteurs influençant le choix

Le choix de la langue d'enseignement a été fait en considérant 5 critères pour une langue d'enseignement: disponibilité, connaissance de l'enseignant, facilité d'enseignement et d'apprentissage, utilité de la langue et structure appropriée pour la résolution de problèmes (Woodhouse [9]). Critère de qualité: Le premier langage de programmation acquis par les étudiants doit soutenir les éléments de bon style de programmation que nous souhaitons leur transmettre (Burgess & Jones [2]). Dans ce cas, ils sont plus susceptibles de préserver ce style dans d'autres langues qui peuvent être plus répandues mais moins appropriées pour un cours d'introduction.

Nous avons également inclus le critère de soutien à la POO et de continuité entre les concepts utilisés dans l'enseignement secondaire et le cours d'introduction proposé.

3.2 La décision d'utiliser Oberon

Nous avons considéré quatre langues à utiliser dans notre cours: Turbo Pascal (extension de Pascal standard avec prise en charge de modules et compilation séparée de modules, ainsi qu'avec des éléments de POO), C ++, Smalltalk et Oberon. Notre choix était Oberon (Reiser & Wirth [6]), un langage conçu comme un suceur de Modula-2. Oberon a tous les avantages de Pascal et de Modula-2 comme langues d'enseignement nécessaires à l'enseignement d'un bon style de programmation, en plus d'être intrinsèquement orienté objet. Paradoxalement, en dépit d'une fonctionnalité étendue due à l'ajout de fonctionnalités orientées objet, Oberon a en fait une syntaxe plus compacte que ses langages précédents. Les fonctions orientées objet d'Oberon sont présentées comme de simples extensions des concepts Modula-2 (et Pascal). De cette façon, le cours d'introduction à la programmation à l'université peut s'appuyer directement sur les connaissances existantes des étudiants de niveau débutant.

Oberon répond également aux critères restants énumérés par Woodhouse: Il est facilement accessible via ftp anonyme, et il existe déjà une certaine expertise locale sur la langue depuis qu'un groupe de professeurs intéressés a suivi les développements autour d'Oberon pour parfois. De même, une littérature adéquate en langue étrangère est disponible et la littérature slovène est en préparation.

Les autres candidats ont été jugés moins appropriés pour les raisons suivantes:

Pascal (avec des extensions introduites par Turbo Pascal) a deux inconvénients principaux: les extensions sont non standard; et ils ne sont pas joints à la langue "sans couture". Ceci est particulièrement vrai pour les éléments orientés objet. À cet égard, il existe un contraste frappant entre Oberon, qui a été conçu à partir de zéro avec une compacité de définition et d'orientation objet, et Turbo Pascal, à laquelle des éléments supplémentaires ont été ajoutés après coup.

Le C ++ est certes répandu dans l'industrie, mais sa syntaxe est trop compliquée, et il ne supporte pas l'acquisition de bonnes habitudes de programmation. Par conséquent, il n'a pas été jugé approprié pour un premier cours de proa-grammage.

Smalltalk nécessite une approche différente, plus radicale de l'enseignement de la POO, par rapport à Oberon, et ne répond donc pas à l'exigence de construire sur une base de connaissances existante. En outre, l'expérience a montré que l'approche utilisée par Smalltalk est considérée comme inhabituelle et moins compréhensible par les étudiants (Mclaughlin & Lovegrove [4], Traxler [8]). Ainsi, Smalltalk est plus approprié pour les cours de niveau supérieur dans le contexte des sujets qui traitent de la comparaison des différents paradigmes et styles de programmation.

4 Contenu du cours

Dans la conception du cours d'introduction, nous avons choisi de combiner deux paradigmes de programmation: le paradigme procédural et le paradigme orienté objet. Le paradigme de programmation procédurale est le fondement sur lequel nous développons les concepts de la programmation orientée objet.

En ce qui concerne la conception détaillée du cours, nous avons rencontré deux problèmes:

  • Éviter les pièges caractéristiques de nombreux cours de programmation procédurale (Smallwood [7]).

 · L'intégration la plus efficace des concepts OOP dans le cours.

4.1 Utilisation précoce des procédures et des modules

Le premier problème est relativement facilement résoluble. La syntaxe d'Oberon est extrêmement simple et facile à apprendre. En outre, nous nous appuyons sur les connaissances de programmation antérieures des élèves obtenues dans leur scolarité précédente. Par conséquent, nous ne consacrons pas de temps à la présentation syntaxique détaillée et aux problèmes de codage; mais plutôt se concentrer immédiatement sur le problème de la bonne structure de programme. Silice les étudiants sont déjà familiarisés avec les concepts de déclarations de constantes, de types, de variables et de flux de contrôle, nous pouvons nous concentrer sur les concepts de procédure et de module. Grâce à l'utilisation d'exemples plus complexes, nous pouvons illustrer les principes de conception de programme (en particulier le raffinement progressif) et les avantages de l'utilisation de modules (abstraction de données).

4.2 Transition de la programmation procédurale à la programmation orientée objet Le deuxième problème est plus difficile et, dans une certaine mesure, similaire au dilemme entre l'approche «puriste» et «pragmatique» de l'enseignement de la programmation orientée objet (Parsons [5]). En dépit du fait que le choix d'Oberon comme langue d'enseignement ait déjà pris la décision en faveur d'une approche incrémentale (ie "pragmatique"), nous avons été confrontés à un choix entre deux alternatives, différant dans la façon dont les concepts de POO sont introduit.

Les alternatives mentionnées ci-dessus peuvent être grossièrement décrites comme suit:

La première alternative

  1. Présentez les éléments de base de la pensée orientée objet.
  2. Définissez les concepts appropriés (c'est-à-dire, classe, objet, héritage ...).
  3. Présenter les mécanismes de mise en œuvre d'un concept à Oberon.
  4. Illustrez l'implémentation avec un exemple.
  5. Répétez les étapes 4 et 5 jusqu'à ce que tous les concepts aient été couverts.

La deuxième alternative

  1. Décrire les extensions de concepts familiers utilisés pour implémenter des fonctions de programmation orientées objet (extension des types d'enregistrements, variables de pro-cédure).
  2. Illustrer l'utilisation des extensions sur des exemples.
  3. A partir des exemples, les techniques générales qui nous permettent d'atteindre les objectifs de la POO sont: les structures de données hétérogènes, les modules génériques, la liaison dynamique des procédures, l'organisation appropriée des modules.
  4. Établissez la connexion à la terminologie de programmation orientée objet.

Dans la première alternative, les concepts orientés objet sont introduits progressivement; mais il faut toujours utiliser un nouveau jargon dès le début du cours. Les concepts de POO sont ensuite introduits un par un, et pour chaque concept, le mécanisme d'Oberon correspondant est décrit avec des exemples. De cette façon, un étudiant est introduit à un concept en général, et seulement plus tard à sa mise en œuvre dans un langage spécifique, et à des exemples d'utilisation.

Dans la deuxième alternative, nous différons l'utilisation du jargon 00 typique aussi longtemps que possible. Toutes les techniques et concepts orientés objet sont expliqués en termes de concepts déjà connus de la programmation procédurale.

Nous avons choisi la seconde alternative car nous pensons qu'elle représente une transition plus naturelle de la programmation procédurale à la programmation orientée objet.

4.3 Apprendre à travers des exemples

Une transition en douceur de la programmation procédurale à la programmation orientée objet peut être illustrée en utilisant l'exemple d'un éditeur d'image (pour plus de détails, voir [6]). Le seul nouveau concept à introduire est l'extension des types d'enregistrements. Sur la base de ce concept, des structures de données hétérogènes peuvent être définies et ensuite traitées par des modules génériques.

Extension des types d'enregistrements Dans Oberon, un type de données peut être étendu en ajoutant de nouveaux composants au type de base. Dans l'exemple suivant, le type d'enregistrement CircleDesc est une extension du type d'enregistrement de base FigureDesc:

TYPE Figure = POINTER TO FigureDesc;

FigureDesc = RECORD

dessiner: PROCÉDURE (f: Figure);

move: PROCEDURE (f: Figure; dx, dy: INTEGER);

suivant: Figure

FIN;

Circle = POINTER TO CircleDesc;

CircleDesc = ENREGISTREMENT (Figure)

x, y, r: nombre entier

FIN;

VAR xO: FigureDesc; xl: CircleDesc; pO: Figure; pl: Cercle;

Chaque variable de type CircleDesc contient les éléments supplémentaires x, y et r, en plus des éléments originaux draw, move et next. Le type de données déjà utilisé CircleDesc est compatible avec le type de base FigureDesc, ce qui signifie que x0 peut recevoir la valeur de xi.

Les pointeurs vers des variables de type Figure et CircleDesc ont des propriétés analoìgues. Après l'exécution de l'assignement, p0: = p1, le pointeur p0 change dynamiquement de type car il pointe maintenant sur une variable de type CircleDesc. Grâce au mécanisme de protection de type, on peut également accéder aux composants x, y et r. Ainsi, pO (Cercle) .x, pO (Cercle) .y et pO (Cercle) .r désignent respectivement les composantes x, y et r.

Structures de données hétérogènes Le type de données FigureDesc (et les types de pointeurs correspondants) peut être étendu aux diverses figures pour lesquelles l'éditeur d'image est conçu (p. Ex. Fines, rectangles, ellipses, etc.). Tous les éléments que nous souhaitons afficher à l'écran sont placés sur une liste chaînée pointée par la variable

VAR FigList: Figure;

Les éléments de la liste sont peut-être de types diffèrent; mais toutes sont des extensions (directes ou in-direct) du même type de base, FigureDesc. Chaque liste, élément est un "objet", ou dans Oberon parlante un enregistrement avec des champs de procédure, accessibles par des pointeurs.

Modules génériques Les opérations de l'éditeur d'image sont implémentées dans un module générique qui exécute les opérations, indépendamment du type de figure. Un exemple est la procédure DrawAll, qui croate un dessin de tous les éléments de FigList:

PROCÉDURE DrawAll (FigLi st: Figure);

VAR f: Figure;

COMMENCER

f: = FigList;

Tandis que f # NIL DO f.draw (f); f: = f.next END

END DrawAll;

Modules de figure Les opérations spécifiques à la figure sont généralement placées dans un module séparé. Nous avons donc besoin d'autant de modules séparés qu'il y a de types de figures différents. La tâche de chaque module spécifique à la figure est de:

  • Étendre le type de base Figure avec des données spécifiques à la figure;
  • Déclarer des procédures pour dessiner, déplacer, etc.
  • Déclarer une procédure pour la création d'un nouvel élément du type déclaré.

A titre d'exemple, nous décrivons la définition du module Circles:

DEFINITION Cercles;

IMPORTER des graphiques; (* module générique *)

TYPE

Circle = POINTER TO CircleDesc;

CircleDesc = RECORD (Graphics.FigureDesc)

x, y, r: ENTIER

FIN;

PROCEDURE Draw (r: Graphics.Figure),

PROCÉDURE Déplacer (r: Graphics.Figure; dx, dy: INTEGER);

PROCEDURE Nouveau (): Graphics.Figure;

END Cercles.

Liaison dynamique des procédures Au moment de la compilation du module générique, le compilateur ne sait pas, quelle procédure doit être appelée pour le dessin d'une figure. Il sait seulement que son adresse est la valeur du tirage de composant appartenant à un type de procédure (voir la déclaration de FigureDesc). La valeur réelle sera connue au moment de la création d'un nouvel élément de FigList. Si le nouvel élément est un cercle, la dernière opération est effectuée par la procédure Nouveau dans Cercles:

PROCEDURE Nouveau (): Graphics .Figure; VAR c: cercle;

COMMENCER

NOUVEAU (c);

  1. dessiner: = Dessiner; (* initialisation du tirage au sort de la procédure *)

(* initialisation d'autres champs *) END New;

Avantages L'exemple précédent illustre non seulement la programmation orientée objet dans Oberon, mais aussi les avantages de cette approche: l'isolation de différentes préoccupations dans différents modules. Plus important encore, des modules de forme supplémentaires peuvent être ajoutés sans recompilation de l'une quelconque des parties du système. Grâce à la redéfinition de certaines méthodes, d'autres spécialisations de l'objet peuvent souvent être obtenues en réutilisant le code existant.

  1. Conclusion

La décision de restructurer notre cours d'introduction à la programmation à l'Université de Ljubljana a été prise en raison des progrès réalisés dans le niveau de connaissance de l'informatique et de la volonté d'incorporer du matériel orienté objet dans le cours.

Nous avons décidé d'incorporer dans notre cours à la fois le paradigme procédural du pro grammation et le paradigme orienté objet. En tant que langue d'enseignement, nous avons sélectionné Oberon parce qu'il permet une transition facile de la programmation procédurale à la POO. Les concepts de POO peuvent être introduits en tant qu'extensions de concepts de programmation procéduraux familiers, ce qui est plus approprié pour les débutants.

Le cours d'introduction à la restructuration restructuré comprendra trois parties. La première partie est consacrée aux bases de la langue Oberon. En raison de sa ressemblance avec Pascal que les étudiants sont censés connaître, la première partie peut être raccourcie à deux semaines.

La deuxième partie, d'une durée de six semaines, traite des procédures et des modules, des types de données composites et des types de données dynamiques. L'accent est mis sur la conception de programmes plus importants avec les techniques d'affinement progressif et de dissimulation de données.

La troisième partie, qui dure également six semaines, se concentre sur la programmation orientée obect. Dans cette partie du cours, les étudiants sont exposés aux techniques 00P à travers des exemples pratiques le long des linos généraux décrits dans la section 4.


54