Académique Documents
Professionnel Documents
Culture Documents
fondamentales sur
le développement
logiciel
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
CONTRAT DE LICENCE UTILISATEUR FINAL
Introduction à la programmation | iii
a. Vous trouverez ci-dessous deux sections distinctes relatives aux droits d’utilisation. Une seule vous est
applicable.
i. Si vous êtes un membre actif du Programme Microsoft IT Academy :
1. Les Livres Électroniques MOAC sont uniquement destinés à être utilisés par vos formateurs
et étudiants.
2. Vous pouvez télécharger uniquement le nombre de copies du titre du Livre Électronique
MOAC nécessaires pour permettre à vos formateurs et étudiants d’enseigner ou d’assister
au cours portant sur le titre du Livre Électronique MOAC en question.
3. Vous êtes autorisé à distribuer le Livre Électronique MOAC uniquement à vos formateurs et
à vos étudiants qui enseignent ou qui assistent aux cours portant sur le Livre Électronique
en question, et uniquement par :
o e-mail ;
o un dispositif USB sécurisé directement connecté aux dispositifs personnels de vos étudiants ;
o un site Web protégé par un mot de passe, auquel seuls vos formateurs et étudiants ont
accès.
4. Vous êtes autorisé à distribuer le Contenu du Formateur uniquement à vos formateurs afin
de leur permettre de préparer et de dispenser l’un de vos cours portant sur le titre de Livre
Électronique MOAC associé.
5. Avant de permettre l’accès à un Livre Électronique MOAC, vous notifierez à chaque individu
qu’il peut utiliser un Livre Électronique MOAC ou y accéder uniquement à condition
d’accepter de se conformer aux exigences suivantes :
o Il utilisera le Livre Électronique MOAC uniquement pour ses besoins de formation
personnels.
o Il installera le Livre Électronique MOAC uniquement sur un dispositif dont il a la
propriété ou qui est sous son contrôle.
o Il ne saurait copier, modifier, imprimer, transmettre, transférer, publier, poster, afficher,
diffuser, distribuer ou établir un lien vers le Livre Électronique MOAC, en totalité ou en
partie.
o Il utilisera le Livre Électronique MOAC uniquement pendant la période la plus longue
entre la durée du cours portant sur le Livre Électronique MOAC en question et une
période de cent quatre-vingt (180) jours, après quoi il devra supprimer de manière
sécurisée toutes les copies du Livre Électronique MOAC en sa possession ou sous son
contrôle.
o o Son utilisation du Livre Électronique MOAC devra également être conforme
aux termes, conditions ou licences supplémentaires applicables, inclus dans ou
accompagnant le Livre Électronique MOAC en question.
iv | Contrat de licence utilisateur final wiley pour le livre électronique moac et le contenu du formateur
6. Avant de permettre l’accès à tout Contenu du Formateur, vous notifierez à chaque formateur
qu’il peut utiliser le Contenu du Formateur ou y accéder uniquement à condition d’accepter de se
conformer aux exigences suivantes :
o Il utilisera le Contenu du Formateur uniquement pour préparer et dispenser votre session de
formation.
o Il installera le Contenu du Formateur uniquement sur un dispositif dont il a la propriété ou qui
est sous son contrôle.
o Il ne saurait copier, modifier, imprimer, transmettre, transférer, publier, poster, afficher, diffuser,
distribuer ou établir un lien vers le Contenu du Formateur, en totalité ou en partie.
o Il utilisera le Contenu du Formateur uniquement pendant la période la plus longue entre la
durée du cours portant sur le Livre Électronique MOAC associé et une période de cent quatre-
vingt (180) jours, après quoi il devra supprimer de manière sécurisée toutes les copies du
Contenu du Formateur en sa possession ou sous son contrôle.
o Son utilisation du Contenu du Formateur devra également être conforme aux termes, conditions
ou licences supplémentaires applicables, inclus dans ou accompagnant le Contenu du Formateur.
ii. Si vous êtes un étudiant, vous reconnaissez et acceptez ce qui suit :
1. Vous assistez actuellement à un cours dispensé par un membre du Programme IT Academy portant
sur le Livre Électronique MOAC.
2. Vous utiliserez le Livre Électronique MOAC uniquement pour vos besoins de formation personnels.
3. Vous installerez le Livre Électronique MOAC uniquement sur un dispositif dont vous avez la propriété
ou qui est sous votre contrôle.
4. Vous ne sauriez copier, modifier, imprimer, transmettre, transférer, publier, poster, afficher, diffuser,
distribuer ou établir un lien vers le Livre Électronique MOAC, en totalité ou en partie.
5. Votre utilisation du Livre Électronique MOAC devra également être conforme aux termes, conditions
ou licences supplémentaires applicables, inclus dans ou accompagnant le Livre Électronique MOAC
en question.
b. Sauf autorisation expresse dans le paragraphe b ci-dessus, vous n’êtes pas autorisé à télécharger, copier, modifier,
transmettre, transférer, diffuser, distribuer ou créer des œuvres dérivées de tout Livre Électronique MOAC ou Contenu
du Formateur, en totalité ou en partie, ni à créer par décompilation ou toute autre méthode le code source de tout
Livre Électronique MOAC ou Contenu du Formateur. Vous n’êtes pas autorisé à imprimer des copies de tout Livre
Électronique MOAC ou Contenu du Formateur dans son intégralité, mais vous pouvez imprimer des pages individuelles
ou des passages de chapitres du Livre Électronique MOAC afin de les utiliser en cours. Vous n’êtes pas autorisé à
utiliser tout ou partie du Livre Électronique MOAC ou du Contenu du Formateur à des fins mercantiles au moyen
d’une vente, d’une revente, d’un prêt, d’un transfert, d’une location ou de toute autre forme d’exploitation du Livre
Électronique MOAC ou du Contenu du Formateur. Si vous transférez la possession d’un Livre Électronique MOAC ou
Contenu du Formateur à un tiers, votre licence sera automatiquement résiliée. Une telle résiliation viendra s’ajouter et
se substituer à tout recours équitable, civil ou autre dont pourrait disposer Wiley.
c. Vous pouvez utiliser le Livre Électronique MOAC et le Contenu du Formateur applicables uniquement pendant la
période la plus longue entre la durée du cours portant sur le Livre Électronique MOAC en question et une période
de cent quatre-vingt (180) jours, après quoi vous devrez supprimer de manière sécurisée toutes les copies du Livre
Électronique MOAC et du Contenu du Formateur en votre possession ou sous votre contrôle.
d. LE LIVRE ÉLECTRONIQUE MOAC ET LE CONTENU DU FORMATEUR SONT CONCÉDÉS SOUS LICENCE « EN L’ÉTAT » ET
« TELS QUE DISPONIBLES », SANS GARANTIE D’AUCUNE SORTE.
e. Vous reconnaissez que tous les droits (y compris, de manière non exhaustive, les droits d’auteur, brevets et secrets de
fabrication) sur les Livres Électroniques MOAC et le Contenu du Formateur sont la propriété exclusive de Wiley et de
ses concédants de licence. En acceptant le présent contrat, vous ne devenez pas le propriétaire du Livre Électronique
MOAC ni du Contenu du Formateur, mais vous disposez d’une licence limitée pour utiliser le Livre Électronique MOAC
et le Contenu du Formateur conformément aux dispositions du présent contrat. Vous acceptez de protéger le Livre
Électronique MOAC et le Contenu du Formateur contre tout chargement, utilisation, téléchargement, reproduction
ou distribution non autorisé. Vous convenez également de ne pas traduire, décompiler, désassembler ou autrement
reconstituer la logique de tout Livre Électronique MOAC ou Contenu du Formateur. Wiley se réserve tous les droits qui
ne vous sont pas expressément concédés dans le présent contrat.
Avant-propos de l'éditeur
Pour la maison d'édition Wiley, la série Microsoft Official Academic Course est destinée
à fournir aux instructeurs et aux étudiants les compétences et les connaissances nécessaires
pour utiliser efficacement les technologies Microsoft dans tous les aspects de leur vie
personnelle et professionnelle. Un enseignement de qualité est nécessaire pour aider les
éducateurs et les étudiants à tirer le meilleur parti des outils logiciels de Microsoft et
devenir plus productifs. Ainsi, notre mission est de faire de nos programmes de formation
des supports pédagogiques de confiance pour la vie.
Pour accomplir cette mission, Wiley et Microsoft se sont associés pour développer les
programmes éducatifs de la plus haute qualité pour les travailleurs de l'information, les
professionnels de l'informatique et les développeurs. Les documents issus de ce partenariat
portent le nom de marque « Microsoft Official Academic Course », ce qui garantit aux
instructeurs et aux étudiants que le contenu de ces manuels est entièrement approuvé
par Microsoft, et qu'ils fournissent des informations et des instructions de la plus haute
qualité sur les produits Microsoft. Les manuels Microsoft Official Academic Course sont
également « officiels », car il s'agit des cours agréés officiellement pour les membres de
Microsoft IT Academy.
La série Microsoft Official Academic Course se concentre sur le développement de la
main-d'œuvre. Ces programmes s'adressent aux étudiants qui cherchent à entrer sur le
marché du travail, changer d'emploi ou se lancer dans une nouvelle carrière comme
travailleurs de l'information, professionnels de l'informatique et développeurs.
Les programmes Microsoft Official Academic Course répondent à leurs besoins en mettant
l'accent sur des scénarios de lieu de travail authentiques avec de nombreux projets,
exercices, cas et évaluations.
Les cours de la série Microsoft Official Academic Course sont mappés sur les recherches
et analyses de tâches par poste approfondies de Microsoft, les mêmes recherches et
analyses utilisées pour créer les examens Microsoft Technology Associate (MTA) et
Microsoft Certified Information Technology Professional (MCITP). Les manuels se
concentrent sur des compétences réelles pour de vrais emplois. Au fur et à mesure que les
étudiants progressent dans les projets et les exercices dans les manuels, ils améliorent leur
niveau de connaissances et leur capacité à appliquer la dernière technologie de Microsoft
pour les tâches quotidiennes. Ces étudiants acquièrent également des certifications qui
leur permettent d'étoffer leurs CV, qui peuvent les aider à trouver un emploi, à conserver
leur poste actuel ou à poursuivre leurs études.
Le concept d'éducation permanente est aujourd'hui une nécessité absolue. Les rôles
professionnels et même des catégories professionnelles entières, évoluent si rapidement
qu'aucun d'entre nous ne peut rester compétitif et productif sans continuellement mettre à
jour ses compétences et capacités. Les offres de la série Microsoft Official Academic Course,
et l'accent qu'elles mettent sur la préparation de l'examen de la certification Microsoft,
permettent aux étudiants d'acquérir et de mettre à jour de façon efficace leurs compétences
et leurs connaissances. Les éditions Wiley soutiennent les étudiants dans cet effort en
développant et en distribuant ces cours en tant qu'éditeur universitaire officiel de Microsoft.
Aujourd'hui, l'édition pédagogique exige de mettre l'accent sur la fourniture de documents
imprimés de qualité et de contenu électronique fiable. L'intégration des produits de la
série Microsoft Official Academic Course, de WileyPLUS et des certifications Microsoft,
nous permet d'être mieux en mesure de fournir des solutions efficaces d'apprentissage aux
étudiants et aux enseignants.
Bonnie Lieberman
Directeur général et vice-président directeur
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement) | v
Préface
Bienvenue dans le programme Microsoft Official Academic Course (MOAC) sur les notions
fondamentales sur le développement logiciel. MOAC est le fruit de la collaboration entre
Microsoft Learning et la maison d'édition John Wiley & Sons, Inc. Microsoft et Wiley se
sont associés pour produire une série de manuels qui offrent des solutions d'enseignement
convaincantes et innovantes aux instructeurs et une expérience supérieure d'apprentissage aux
étudiants. Imprégnés et enrichis des connaissances approfondies des créateurs de produits
Microsoft et conçus par un éditeur reconnu dans le monde entier pour la qualité pédagogique
de ses produits, ces manuels maximisent le transfert de compétences en un minimum de
temps. Les étudiants sont mis au défi de réaliser leur potentiel en utilisant leurs nouvelles
compétences techniques en tant que membres hautement productifs de la main-d'œuvre.
Parce que cette base de connaissances provient directement de Microsoft, créateur de
Microsoft Certified Technology Specialist (MCTS), de Microsoft Certified Professional
(MCP) et des examens Microsoft Technology Associate (MTA) (www.microsoft.com/
learning/certification), vous êtes sûr de recevoir les informations sur un sujet les plus
pertinentes pour votre réussite personnelle et professionnelle. La participation directe de
Microsoft vous assure non seulement que le contenu des manuels MOAC est exact et
à jour ; cela signifie également que vous recevez le meilleur enseignement possible pour
permettre votre réussite aux examens de certification et au travail.
www.wiley.com/college/microsoft ou
vi | appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Tour du livre illustré
� Fonctionnalités pédagogiques
Le manuel MOAC sur les notions fondamentales sur le développement logiciel est conçu
pour couvrir tous les objectifs d'apprentissage pour cet examen MTA 98-361, désignés
sous le nom des objectifs de l'examen. Les objectifs de l'examen Microsoft Technology
Associate (MTA) sont mis en évidence tout au long du manuel. De nombreuses
fonctionnalités pédagogiques ont été développées spécifiquement pour le programme
Microsoft Official Academic Course.
La présentation des informations de procédures et concepts techniques complets tout au
long du manuel pose des défis pour les étudiants et les instructeurs. Le tour du livre illustré
qui suit fournit un guide des riches fonctionnalités qui contribuent au plan pédagogique
du programme Microsoft Official Academic Course. Voici une liste des principales
fonctionnalités de chaque leçon destinées à aider les étudiants à réussir, qu'ils poursuivent
leur formation en informatique, préparent les examens de certification ou au travail :
• Chaque leçon commence par une matrice de compétences de la leçon. Plus qu'une
liste standard des objectifs d'apprentissage, la matrice de compétences de la leçon
fait correspondre chaque compétence logicielle abordée dans la leçon à l'objectif de
l'examen spécifique.
• Des exercices étape par étape concis et fréquents présentent de nouvelles
fonctionnalités aux étudiants et leur donnent la possibilité de mettre leurs
connaissances en pratique. Les étapes numérotées donnent des instructions détaillées,
étape par étape pour aider les étudiants à acquérir des compétences logicielles.
• Les illustrations, en particulier les images d'écran, fournissent des commentaires
visuels au fur et à mesure que les étudiants effectuent les exercices. Les images
illustrent les concepts clés, fournissent des indices visuels sur les étapes et permettent
aux élèves de vérifier leurs progrès.
• Des listes de termes clés au début de chaque leçon présentent le vocabulaire technique
important aux étudiants. Lorsque ces termes sont utilisés plus tard dans la leçon, ils
s'affichent en gras ou en italique, lorsqu'ils sont définis.
• Des aides au lecteur intéressantes sur un point d'utilisation, réparties dans les leçons,
indiquent aux étudiants pourquoi un sujet est pertinent (L'essentiel) ou leur donnent des
conseils utiles (Remarque). Les aides au lecteur fournissent également des informations
supplémentaires pertinentes ou d'arrière-plan qui ajoutent de la valeur à la leçon.
• Les fonctionnalités Prêt pour la certification réparties dans le texte indiquent aux
étudiants l'endroit où un objectif de certification spécifiques est abordé. Elles donnent
aux étudiants la possibilité de vérifier leur compréhension de cet objectif particulier
de la certification MTA et, si nécessaire, de consulter la section de la leçon où il est
abordé. MOAC offre une préparation complète pour la certification MTA.
• Questions de fin de leçon : la section Évaluation des connaissances fournit une large
gamme de questions à choix multiples, vrai-faux, de mise en correspondance et de
texte à trous.
• Exercices de fin de leçon : les scénarios des sections Évaluation des connaissances,
Évaluation de la maîtrise des concepts et les exercices Sur votre lieu de travail sont
des projets qui permettent de tester la capacité des étudiants à appliquer ce qu'ils ont
appris dans la leçon.
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement) | vii
viii | Tour du livre illustré
� Fonctionnalités de la leçon
2 LEÇON
Introduction à la
programmation
orientée objet
M AT R I C E D E C O M P É T E N C E S D E L A L E Ç O N
Matrice de compétences
Compétences/Concepts
Objectif de l'examen MTA
Numéro de l'objectif
de l'examen MTA de la leçon
Présentation des objets Comprendre les notions 2.1
fondamentales sur les classes.
Présentation des valeurs et des Comprendre le stockage informa- 1.1
références tique et les types de données.
Présentation de l'encapsulation Comprendre l'encapsulation. 2.4
Présentation de l'héritage Comprendre l'héritage. 2.2
Présentation du polymorphisme Comprendre le polymorphisme. 2.3
Présentation des interfaces Comprendre l'encapsulation. 2.4
TERMES CLÉS
modificateur d'accès encapsulation polymorphisme Introduction à la programmation | 3
accesseurs événements propriétés
héritage type référence
Termes
classes abstraites sont indiqués dans le tableau 1-1.
propriétés implémentées interfaces classes sealed
automatiquement
classe
constructeurs
méthode
espace de noms
signature
nombres statiques
clés
délégués objets type valeur
Figure 1-1
START
DÉBUT
Un organigramme simple
qui compare deux nombres
Vous êtes développeur de logiciels pour la société Northwind. Vous travaillez au et renvoie le plus grand
sein d'une équipe pour développer des programmes informatiques capables de des deux Entrée x
résoudre des problèmes complexes liés aux entreprises. Tous les programmes que
vous écrivez doivent être faciles à comprendre et à maintenir sur une longue période.
Par conséquent, vous devez développer des programmes à l'aide de techniques qui
Entrée y
favorisent la collaboration, l'extensibilité et la réutilisation du code. De plus, au lieu
de penser à vos programmes essentiellement en tant que listes de méthodes, vous
choisissez de les modéliser sur des concepts d'entreprises réelles, tels que des clients,
des produits, des fournisseurs, et sur les interactions entre eux. x > y?
Non
Sore y
32
Oui
Diagrammes
Sore x
« Référence croisée »
La figure 1-1 par exemple montre un organigramme qui compare deux nombres et renvoie le
Introduction à la programmation | 9
plus grand des deux.
C# fournit plusieurs types de données intégrées que vous pouvez utiliser dans vos Comme vous pouvez le voir, cet organigramme répertorie dans le bon ordre toutes
X REF
programmes. Vous pouvez également définir de nouveaux types en définissant une structure les mesures nécessaires pour exécuter l'opération. Le flux de contrôle commence par
Vous pouvez trouver de données, comme une classe ou une structure. Ce chapitre se concentre sur le symbole de départ et se termine par le symbole de fin. Les processus et les symboles
plus d'informations les types de données intégrés les plus couramment utilisés. d'opération d'entrée/sortie, ont toujours une seule entrée et une seule sortie. En revanche,
pour créer vos propres Le tableau 1-3 énumère plusieurs types de données intégrés couramment utilisés disponibles le symbole de la décision n'a qu'une seule entrée mais plusieurs sorties. Vous pouvez tester
types de données dans en C#. Les tailles répertoriées dans le tableau font référence à un ordinateur exécutant un un organigramme en effectuant un « test d'essai ». Dans un test d'essai, vous parcourez
la leçon 2. système d'exploitation de 32 bits tel que Windows 7, 32 bits. Pour un système d'exploitation manuellement les étapes de l'organigramme avec les données de test pour vérifier si les
de 64 bits, tel que Windows 7 64-bit, ces tailles seront différents. chemins d'accès corrects sont suivis.
Tableau 1-3
Types de données intégrées Type de données Taille Plage de valeurs PRÉSENTATION DES TABLES DE DÉCISION
couramment utilisées en C#
octet 1 octet 0 à 255 Lorsqu'un algorithme implique un grand nombre de conditions, des tables de décision offrent
un format plus compact et plus lisible pour le présenter. Le tableau 1-2 présente une table
char 2 octets U+0000 à U+ffff (caractères Unicode)
de décision pour calculer une remise. Cette table génère un pourcentage de remise selon la
short 2 octets −32,768 à 32,767 quantité de produit achetée. Les lignes en gras de la table de décision la divisent en quatre
int 4 octets −2,147,483,648 à 2,147,483,647 quadrants. Le premier quadrant (en haut à gauche) spécifie les conditions (« quantité 10 » etc.).
long 8 octets −
9,223,372,036,854,775,808 à
Le deuxième quadrant (en haut à droite) spécifie les règles. Les règles sont les combinaisons
9,223,372,036,854,775,807 possibles des résultats de chaque condition. Le troisième quadrant (en bas à gauche) spécifie
l'action (une remise dans ce cas), et le dernier quadrant (en bas à droite) spécifie les éléments
REMARQUE
* flottant 4 octets ±1.5 × 10-45 à ±3.4 × 1038
d'action correspondant à chaque règle.
Les versions non signées
double 8 octets ±5.0e−324 à ±1.7e308
de short, int et long sont
respectivement ushort, bool 2 octets Vrai ou faux
uint et ulong. Les types
chaîne - Zéro ou plusieurs caractères Unicode
non signés ont la même
taille que leurs versions
signées mais stockent Tous les types de données énumérés dans le tableau 1-3 sont des types valeur à l'exception
des plages beaucoup de la chaîne, qui est un type référence. Les variables qui reposent directement sur les types
plus grandes de valeurs valeur contiennent la valeur. Dans le cas du type référence, la variable contient l'adresse
positives. de l'emplacement mémoire où sont stockées les données. Vous en apprendrez plus sur les
différences entre les types valeur et les types référence dans la leçon 2.
Un tableau est une collection de données dans laquelle chaque élément est accessible à
l'aide d'un index unique.
Un tableau dans C# est communément utilisé pour représenter une collection d'éléments de
type similaire. Un exemple de déclaration de tableau est indiqué dans le code suivant :
int[] numbers = { 1, 2, 3, 4, 5 };
Cette déclaration crée un tableau identifié par les numéros de nom. Ce tableau est capable
de stocker une collection de cinq entiers. Cette déclaration initialise également chacun des
éléments du tableau respectivement par les nombres de 1 à 5.
N'importe quel élément d'un tableau est accessible à l'aide d'un index unique. Dans .NET
Framework, les index de tableau sont de base zéro. Cela signifie que pour accéder au premier
élément d'un tableau, vous devez utiliser l'index 1 ; pour accéder au deuxième élément, vous
devez utiliser l'index 2 et ainsi de suite.
Pour accéder à un élément de tableau individuel, vous devez utiliser le nom du tableau suivi
de l'index entre crochets. Par exemple, numbers[0] retournera la valeur 1 à partir du tableau
déclaré ci-dessus et numbers[4] retournera la valeur 5. Il est interdit d'accéder à un tableau
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Tour du livre illustré | ix
44 | Leçon 2
L'ESSENTIEL
Un type valeur stocke directement une valeur, alors qu'un type référence stocke
uniquement une référence à une valeur réelle.
Aide au lecteur « L'essentiel »
Un type valeur stocke directement les données dans sa mémoire. En revanche, les types
référence stockent uniquement une référence à un emplacement de mémoire. Ici, les
données réelles sont stockées à l'emplacement de mémoire désigné. La plupart des types
de données élémentaires intégrées (tels que bool, int, char, double, etc.) sont des types
valeur. Les types de données définis par l'utilisateur créés à l'aide du mot clé struct sont 4 | leçon 1
également des types valeur. Les types référence incluent les types créés à l'aide des
mots clés object, string, interface, delegate et class. Tableau 1-2
Présentation des structs Table de décision pour Quantité < 10 O N N N
calculer des remises
Quantité < 50 O O N N
Le mot clé struct est utilisé pour créer des types définis par l'utilisateur qui se
composent de petits groupes de champs connexes. Les structs sont des types valeur, Quantité < 100 O O O N
par opposition aux classes qui sont des types référence.
Remise 5 % 10 % 15 % 20 %
Les structs sont définis à l'aide du mot clé struct, comme indiqué ci-dessous :
public struct Point Pour savoir quel élément d'action appliquer, vous devez évaluer chaque condition pour
{ trouver la règle correspondante, puis choisir l'action spécifiée dans la colonne avec la règle
public double X, Y; correspondante. Par exemple, si la valeur de « Quantité » dans les données d'essai est de 75,
} la première règle prend ensuite la valeur « Non », la deuxième règle prend la valeur « Non »,
et la troisième règle prend la valeur « Oui ». Par conséquent, nous allons choisir l'élément
Les structs peuvent contenir la plupart des éléments que peuvent contenir les classes, d'action de la colonne (N, N et Y), qui définit la remise sur 15 %.
comme des constructeurs, des méthodes, des propriétés, etc. Cependant, comme vous
Présentation de C#
C# est un langage de programmation de haut niveau très répandu qui vous permet
d'écrire des programmes informatiques dans un format lisible par l'homme. C# fait
partie du .NET Framework et bénéficie de la prise en charge du runtime et des
bibliothèques de classe fournis par le .Framework.
Comme indiqué dans la section précédente, les ordinateurs ont besoin d'instructions précises
et complètes pour accomplir une tâche. Ces jeux d'instructions sont appelés programmes
informatiques ou tout simplement programmes.
Les ordinateurs utilisent au minimum le système de numération binaire pour représenter des
informations et du code. Dans ce système, chaque valeur est représentée par deux symboles
uniquement (0 et 1). Un programme informatique qui écrit à l'aide du système de numération
binaire est appelé code binaire.
L'utilisation du code binaire en programmation informatique est extrêmement difficile
à accomplir et représente une tâche énorme. Ainsi, pour simplifier la programmation, les
Présentation générale du développement logiciel | 77 scientifiques et les ingénieurs informaticiens ont construit plusieurs niveaux d'abstractions
entre les ordinateurs et leurs opérateurs humains. Ces abstractions comprennent des logiciels
(tels que les systèmes d'exploitation, des compilateurs et divers systèmes de runtime) qui
BubbleSort compare deux éléments pour vérifier s'ils sont dans le bon ordre ; si ce prennent la responsabilité de traduire un programme lisible par l'homme en programme
n'est pas le cas, il les permute. L'algorithme poursuit l'opération jusqu'à ce que tous les lisible par une machine.
éléments de la liste soient dans l'ordre requis. Le nom de l'algorithme BubbleSort vient
Les programmes les plus modernes sont écrits dans un langage de haut niveau tel que C#,
de la manière dont il fonctionne : À mesure que l'algorithme progresse, les plus petits
Visual Basic ou Java. Ces langages vous permettent d'écrire des instructions précises sous une
éléments remontent progressivement, tels des bulles d'air. forme lisible par l'homme. Un compilateur de langage traduit alors le langage de haut niveau en
Nous allons visualiser BubbleSort à l'aide d'un exemple. Imaginons que vous souhaitiez un langage de bas niveau qui peut être compris par le système d'exécution Runtime.
organiser tous les éléments de la liste ci-dessous dans l'ordre croissant : (20, 30, 10, 40). Chaque langage de programmation fournit son propre ensemble de vocabulaire et de grammaire
Ces éléments doivent être disposés du plus petit au plus grand. L'algorithme BubbleSort (également connu sous le nom de syntaxe). Dans ce cours, vous apprendrez à programmer à
tente de résoudre ce problème dans un ou plusieurs passages (à chaque passage, la liste l'aide du langage de programmation C# sur le .NET Framework. .NET Framework fournit un
des éléments est complètement analysée). Si l'algorithme rencontre des éléments qui environnement d'exécution Runtime pour le programme C#. .NET Framework contient également
ne sont pas dans l'ordre, il en modifie l'ordre. L'algorithme se termine lorsqu'il scanne des bibliothèques de classes qui fournissent un grand nombre de fonctionnalités de base réutilisables
l'ensemble de la liste sans modifier l'ordre des éléments. S'il n'y a aucune permutation, que vous pouvez utiliser directement dans votre programme C#.
alors tous les éléments sont dans le bon ordre et la liste est complètement triée. ✚ PLUS D'INFORMATIONS
.NET Framework fournit trois composants principaux : un environnement d'exécution Runtime,
Tableau 3-1
Tableaux
un ensemble de bibliothèques de classes qui fournissent une grande partie des fonctionnalités
Premier passage de Étape Avant Après Commentaires réutilisables et des compilateurs de langage pour C#, Visual Basic et Managed C++. .NET Framework
prend en charge plusieurs langages de programmation et prend également en charge l'ajout de
BubbleSort
faciles à lire
1 20, 30, 10, 40 20, 30, 10, 40 L 'algorithme compare les deux langages supplémentaires au système. Bien que la syntaxe et le vocabulaire de chaque langage puissent
premiers éléments (20 et 30). Comme différer, ils peuvent chacun utiliser les bibliothèques de classe de base fournies par le Framework.
ils sont dans le bon ordre, aucune
permutation n'est nécessaire.
2 20, 30, 10, 40 20, 10, 30, 40 L 'algorithme compare les deux
éléments suivants (30 et 10). Comme
ils ne sont pas dans le bon ordre, les Aide au lecteur
éléments sont permutés.
3 20, 10, 30, 40 20, 10, 30, 40 L 'algorithme compare les deux « Plus d'informations »
éléments suivants (30 et 40). Comme
ils sont dans le bon ordre, aucune
permutation n'est nécessaire.
Comme indiqué dans le tableau 3-1, à la fin du premier passage, BubbleSort a effectué
une permutation et il est possible que les éléments ne soient pas encore complètement
triés. Par conséquent, BubbleSort fait un deuxième passage dans la liste, comme illustré
dans le tableau 3-2.
Tableau 3-2
Deuxième passage de Étape Avant Après Commentaires
BubbleSort 1 20, 10, 30, 40 10, 20, 30, 40 L 'algorithme compare les deux
premiers éléments (20 et 10). Comme
ils ne sont pas dans le bon ordre, les
éléments sont permutés.
2 10, 20, 30, 40 10, 20, 30, 40 L 'algorithme compare les deux
éléments suivants (20 et 30). Comme
ils sont dans le bon ordre, aucune
permutation n'est nécessaire.
3 10, 20, 30, 40 10, 20, 30, 40 L 'algorithme compare les deux
éléments suivants (30 et 40). Comme
ils sont dans le bon ordre, aucune
permutation n'est nécessaire.
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
x | Leçondu1 livre illustré
x | Tour
68 | leçon 3
Les tests de logiciels vérifient que la mise en œuvre correspond aux exigences du système.
Ils permettent de garantir la qualité du produit final. Ils aident à identifier les éventuels
manquements entre les attentes du système, telles que décrites dans le document
définissant les spécifications, et le comportement réel du système.
Parmi les participants importants pour tester des logiciels, on trouve des testeurs qui
vérifient l'application afin de s'assurer qu'elle répond aux exigences identifiées. Lorsque
ces testeurs identifient des défauts dans l'application, ils affectent chaque défaut à une
personne compétente qui peut la corriger. Par exemple, une erreur de code serait affectée
à un développeur afin d'être résolue.
La gestion des mises en production inclut des activités telles que le packaging et le
déploiement du logiciel, la gestion des défauts de l'application et des demandes de
modification du logiciel.
Parmi les acteurs majeurs dans cette activité on trouve les personnes suivantes :
• Responsable des mises en production : le responsable des mises en production
assure la coordination entre les différentes équipes et les unités commerciales afin de
garantir la mise en production d'un produit logiciel dans le délai imparti.
• Personnel chargé des opérations : le personnel chargé des opérations s'assure
que le système est livré comme promis. Cela peut consister à graver des DVD et à
les expédier à réception des commandes ou cela pourrait entraîner la gestion d'un
logiciel en tant que service (SaaS) sur une base continue. Le personnel chargé des
opérations est également chargé de publier des mises à jour système (par exemple, des
PRÊT POUR LA corrections de bogues ou de nouvelles fonctionnalités).
CERTIFICATION
Comprenez-vous la • Personnel du support technique : ces membres du personnel échangent avec les
gestion du cycle de vie clients et les aident à résoudre leurs problèmes avec le système. Le personnel du
des applications et ses support technique peut générer des indicateurs précieux sur les zones du système qui
activités ? sont plus difficiles pour les utilisateurs et qui doivent éventuellement être mises à
3.1 jour dans la prochaine version de l'application.
la certification
public double X, Y;
REMARQUE
*
Il est possible de créer }
Aide au lecteur
un struct sans utiliser 2. Modifiez le code de la méthode Main comme indiqué ci-dessous :
l'opérateur new. Vous
pouvez simplement static void Main(string[] args)
Images
seules les références }
sont copiées. Ainsi, 3. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de console s'ouvre
après la copie, les deux pour afficher les valeurs de p1.X et de rect1.Length.
X REF appelée Programme sur les lignes 5 à 11. Une classe est définie à l'aide du mot clé class suivi
du nom de la classe. Le contenu d'une classe est défini entre une accolade ouvrante ({}) et
p2.X = 100;
Vous pouvez trouver une accolade fermante (}). elle affecte uniquement la valeur X correspondant à l'emplacement de mémoire de la
plus d'informations sur variable p2. La valeur X de la variable p1 n'est pas affectée.
les classes dans la leçon La ligne 3 du code de la figure 1-3 définit un espace de noms Leçon01. Les espaces de noms
2. sont utilisés pour organiser des classes et les identifier de façon unique. L'espace de noms
et les noms de classe sont combinés pour créer un nom de classe complet. Par exemple, le nom
de classe complet pour la classe Programme est Leçon01.Program. C# requiert que le nom
complet d'une classe soit unique. Par conséquent, vous ne pouvez pas avoir une autre classe
ayant le nom Programme dans l'espace de noms Leçon01, mais vous pouvez avoir une classe
ayant le nom Programme dans un autre espace de noms, Leçon02 par exemple. Ici, la classe
Programme définie dans l'espace de noms Leçon02 est identifiée par son nom de classe
complet, Leçon02.Program.
.NET Framework fournit un grand nombre de classes utiles, organisées en plusieurs espaces
de noms. L'espace de noms System contient les classes de base les plus couramment utilisées.
X REF La classe Console dans l'espace de noms System par exemple. La classe Console fournit des
fonctionnalités pour l'application de console d'entrée et de sortie. La ligne 9 du code dans
Vous pouvez trouver la figure 1-3 désigne la classe Console et appelle sa méthode WriteLine. Pour accéder à la
plus d'informations méthode WriteLine de façon non ambiguë, vous devez l'écrire comme ceci :
sur les méthodes dans
la leçon 2. System.Console.WriteLine(“hello, world!”);
Comme les noms de classe apparaissent fréquemment dans le code, il serait fastidieux d'écrire
le nom de classe complet chaque fois et cela rendrait le programme trop détaillé. Vous pouvez
REMARQUE
* résoudre ce problème en utilisant le langage C# à l'aide d'une directive
Chaque instruction C# (voir le code de la ligne 1 de la figure 1-3). L'utilisation de la directive vous permet d'utiliser les
doit se terminer par un classes dans un espace de noms sans avoir à qualifier pleinement le nom de la classe.
point-virgule (;). La classe Program définit une méthode unique par le nom Main (voir les lignes 7 à 10 de la
liste de code dans la figure 1-3). Main est une méthode spéciale qui sert également de point
d'entrée au programme. Lorsque le runtime exécute un programme, il commence toujours
par la méthode Main. Un programme peut avoir plusieurs classes et chaque classe peut avoir
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Tour du livre illustré | xi
vérifier si les utilisateurs peuvent ajouter des éléments dans un panier d'achat est un
élément important de tests fonctionnels pour un site Web de commerce électronique. En
comparaison, les tests non fonctionnels impliquent de tester des attributs logiciels qui ne
font pas partie des fonctionnalités de base mais plutôt des exigences non fonctionnelles du
logiciel (comme l'évolutivité, la facilité d'utilisation, la sécurité).
Il est important de noter que le processus de test de logiciels peut uniquement aider
à trouver des défauts, il ne garantit pas l'absence de défauts. Les logiciels complexes
*
REMARQUE ont un grand nombre de chemins d'exécution possibles et de nombreux paramètres
qui peuvent affecter leurs comportements. Il n'est pas faisable et souvent pas possible Aide au lecteur
de tester toutes les différentes situations que rencontreront ces logiciels dans un
environnement de production.
« Remarque »
Présentation des méthodes de test
Les niveaux de test sont définis selon le moment auquel le test a lieu dans le cycle de vie RÉSUMÉ DES COMPÉTENCES
du développement logiciel. Cinq niveaux distincts de tests existent :
• Test unitaire : un test unitaire vérifie la fonctionnalité d'une unité de code. Par exemple, Dans cette leçon, vous avez appris ce qui suit :
un test unitaire peut déterminer si une méthode retourne la valeur correcte. Un test
• Une base de données relationnelle organise les informations en tables. Une table
unitaire est un test de boîte blanche, et il est souvent fait par le développeur qui écrit est une liste de lignes et de colonnes.
le code. Un test unitaire utilise souvent un outil automatisé qui peut simplifier le • La conception de base de données relationnelle est le processus consistant à
développement de scénarios et aussi garder une trace afin de savoir si une modification déterminer la structure de base de données relationnelle appropriée pour
du code provoque l'échec des tests unitaires existants. Visual Studio a un support intégré répondre aux besoins de l'entreprise.
pour les tests unitaires. Vous pouvez également utiliser des outils open source tels que • Les diagrammes d'entité-relation sont utilisés pour modéliser les entités, leurs
NUnit pour automatiser les tests unitaires pour le code de .NET Framework. attributs et les relations entre les entités. Ils peuvent vous aider à déterminer
quelles données doivent être stockées dans une base de données.
• Test d'intégration : un test d'intégration évalue l'interface entre les composants log-
• Le processus de normalisation de données garantit qu'une conception de base
iciels. Un test d'intégration peut s'effectuer progressivement au fur et à mesure du de données ne comporte aucun problème susceptible d'entraîner une perte
développement des composants ou il peut être effectué en une seule fois lorsque tous d'intégrité de données. La plupart des problèmes de conception peuvent être
résolus en veillant à ce que les tables répondent aux exigences de la troisième
forme normale.
• Le langage SQL (Structured Query Language) fournit des instructions telles que
SELECT, INSERT, UPDATE et DELETE pour travailler avec des données relationnelles.
• Une procédure stockée est un ensemble d'instructions SQL qui est stocké dans
une base de données. Les procédures stockées peuvent être utilisées par plusieurs
applications.
• Les classes XmlReader et XmlWriter fournissent une manière rapide, non mise en
cache et vers l'avant uniquement de lire ou d'écrire des données XML. La classe
XmlDocument est une représentation en mémoire de données XML et permet de
parcourir et d'éditer le document XML.
• La classe DataSet représente une représentation en mémoire de données
relationnelles. La classe DataAdapter agit comme un pont entre la source de
données et le DataSet. Le DataAdapter stocke la connexion de données et des
commandes de données nécessaires pour se connecter à la source de données.
Scénario 2-2 : Création d'un struct 5. La clause _______________ dans une instruction SELECT évalue une condition pour
chaque ligne, puis décide s'il faut l'inclure dans le jeu de résultats.
Vous développez un jeu qui doit représenter l'emplacement d'une cible dans un espace
tridimensionnel. L'emplacement est identifié par les valeurs des trois entiers x, y et z. 6. L'objet utilisé avec l'instruction using doit implémenter l'interface ______________ .
Vous allez créer des milliers de ces structures de données dans votre programme, et 7. L'instruction _______________ de T-SQL peut être utilisée pour créer une procédure
vous avez besoin d'une façon légère et efficace pour stocker ces données en mémoire. stockée.
Il est en outre peu probable que vous ayez besoin d'hériter d'autres types de ce type
d'emplacement. Comment devez-vous représenter l'emplacement dans votre programme ?
■ Évaluation de la maîtrise
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Conventions et fonctionnalités
utilisées dans cet ouvrage
Cet ouvrage utilise des polices, symboles et conventions d'en-tête particuliers pour mettre
en évidence des informations importantes ou attirer l'attention sur des étapes spéciales.
Pour plus d'informations sur les fonctionnalités de chaque leçon, reportez-vous à la
section Tour du livre illustré.
Convention Signification
Cette fonctionnalité fournit un bref résumé des sujets qui
L'ESSENTIEL
seront traités dans la section qui suit.
PRÊT POUR LA CERTIFICATION
Cette fonctionnalité signale le point dans le texte où un
objectif de certification spécifique est couvert. Elle vous
donne une occasion de vérifier votre compréhension de cet
objectif particulier de la certification MTA et, si nécessaire,
de consulter la section de la leçon où il est abordé.
Des aides au lecteur s'affichent dans des cases grisées
REMARQUE*
* situées dans le texte. Remarque fournit des conseils utiles
liés à des tâches ou sujets particuliers.
Ces remarques fournissent des pointeurs vers des
REF X
informations fournies ailleurs dans le manuel ou décrivent
des fonctionnalités intéressantes qui ne sont pas
directement abordées dans la rubrique ou le sujet en cours.
Alt + Tab Un signe plus (+) entre deux noms de touches signifie que
vous devez appuyer sur les deux touches en même temps.
Les touches sur lesquelles vous êtes invité à appuyer dans
un exercice s'affichent dans la police indiquée ici.
Exemple Les termes clés s'affichent en italique lorsqu'ils sont définis.
www.wiley.com/college/microsoft ou
xii | appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Programme de soutien de
l'instructeur
Les programmes Microsoft Official Academic Course s'accompagnent d'un riche éventail
de ressources qui intègrent les nombreux visuels des manuels pour former un ensemble
cohérent d'un point de vue pédagogique. Ces ressources offrent tous les documents dont
les instructeurs ont besoin pour déployer et fournir leurs cours. Les ressources disponibles
au téléchargement en ligne incluent :
• Le programme MSDN Academic Alliance est conçu pour fournir les outils de
développement, produits et technologies disponibles les plus conviviaux et les moins
coûteux aux professeurs et aux étudiants dans les laboratoires, salles de classe et sur
les PC des étudiants. Un abonnement gratuit de trois ans est offert aux utilisateurs
de MOAC qualifiés.
Remarque : les étudiants peuvent télécharger Microsoft Windows Server 2008,
Microsoft Windows 7 et Microsoft Visual Studio à partir de MSDN AA pour les
utiliser dans ce cours.
• Le Guide de l'instructeur contient des solutions à tous les exercices des manuels
et des programmes de longueurs différentes. Le Guide de l'instructeur contient
également des résumés de chapitre et des notes de lecture. Le Guide de l'instructeur
est disponible sur le site compagnon du livre (http://www.wiley.com/college/
microsoft).
• La banque de tests contient des centaines de questions à choix multiples, vrai-faux,
réponses courtes et formats d'essais et est disponible au téléchargement sur le site
compagnon du livre de l'instructeur (www.wiley.com/college/microsoft). Une clé de
réponse complète est fournie.
• Un ensemble complet de présentations PowerPoint et d'images est disponible sur
le site compagnon du livre de l'instructeur (http://www.wiley.com/college/microsoft)
pour compléter les présentations en classe. Environ 50 diapositives PowerPoint sont
fournies pour chaque leçon. Ces présentations sont adaptées au sujet traité dans le
texte et à la matrice de compétences et sont conçues pour transmettre les principaux
concepts abordés dans le texte. Toutes les images du texte sont sur le site compagnon
du livre de l'instructeur (http://www.wiley.com/college/microsoft). Vous pouvez
les intégrer à vos présentations PowerPoint ou les utiliser pour créer vos propres
transparents et polycopiés. En utilisant ces visuels dans les discussions en classe,
vous pouvez aider les étudiants à se concentrer sur les éléments clés des technologies
abordées et leur permettre de comprendre comment utiliser ces technologies
efficacement au travail.
• Quand il s'agit d'améliorer l'expérience en classe, il n'y a pas de meilleure source
d'idées et d'inspiration que vos collègues. Le réseau Wiley Faculty Network relie
les enseignants avec la technologie, facilite l'échange des meilleures pratiques
et contribue à renforcer l'efficacité pédagogique. Les activités du réseau Faculty
Network incluent des formations aux technologies et des didacticiels, des séminaires
virtuels, des échanges pair-à-pair d'expériences et d'idées, des conseils personnels et le
partage de ressources. Pour plus d'informations, visitez le site
www.WhereFacultyConnect.com.
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement) | xiii
xiv | Programme de soutien de l'instructeur
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Programme de soutien de
l'étudiant
� Ressources complémentaires
Site Web compagnon de ce livre (www.wiley.com/college/microsoft)
Le site Web compagnon du manuel de l'étudiant pour la série MOAC comprend tous les
fichiers d'exercice, liens Web et ressources qui seront utilisés conjointement avec ce cours.
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement) | xv
xvi | Programme de soutien de l'étudiant
La certification MTA donne des moyens aux éducateurs et motive les étudiants
MTA offre une nouvelle norme pour mesurer et valider les connaissances technologiques
fondamentales dans la salle de classe tout en maintenant votre budget et vos ressources
pédagogiques intacts. MTA aide les établissements d'enseignement à se démarquer en tant
que fournisseurs innovants de programmes de certification professionnelle très demandés
et est facilement déployé à l'aide d'une suite simple, pratique et abordable d'examens de
certification technologique de niveau débutant. MTA permet aux étudiants d'explorer des
filières professionnelles dans les technologies sans nécessiter d'investissement important
en termes de temps et de ressources, tout en leur fournissant une base de carrière et la
confiance nécessaire pour réussir des études supérieures, puis poursuivre leur vocation.
En plus de donner aux étudiants une certification Microsoft de niveau débutant,
la certification MTA est conçue pour être un tremplin vers d'autres certifications
technologiques Microsoft plus avancées, telles que la certification Microsoft Certified
Technology Specialist (MCTS).
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Programme de soutien de l'étudiant | xvii
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Remerciements
www.wiley.com/college/microsoft ou
xviii | appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Brève table des matières
1 Introduction à la programmation 1
Annexe A 177
Index 179
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement) | xix
Table des matières
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement) | xxi
xxii | Table des matières
Leçon 4 : Présentation des applications Présentation des applications d'Interface multidocument
(MDI) 126
Web 85
Présentation des applications consoles 129
Utilisation des paramètres de ligne de commande 130
Matrice des différents objectifs 85
Présentation des services Windows 131
Termes clés 85 Création d'un service Windows 132
Présentation du développement de pages Web 85 Résumé des compétences 137
Présentation du langage HTML 86
Présentation des feuilles de style en cascade 88 Évaluation des connaissances 138
Présentation de JavaScript 92 Évaluation des compétences 140
Présentation de la programmation côté client et de la Évaluation de la maîtrise des concepts 141
programmation côté serveur 94
Présentation du développement d'applications
ASP.NET 95 Leçon 6 : Présentation des bases
Présentation du modèle d'événement et du cycle de vie de données 142
d'une page ASP.NET 96
Présentation de la gestion d'état 99
Matrice des différents objectifs 142
Présentation de l'hébergement Web IIS 104 Termes clés 142
Présentation des services Internet Information
Services 105 Présentation des concepts de bases de données
Création de répertoires virtuels et de sites Web 105 relationnelles 142
Déploiement d'applications Web 106 Présentation des bases de données 143
Présentation des concepts de bases de données
Présentation du développement de services Web 107 relationnelles 143
Présentation de SOAP 107
Présentation de la conception de base de données
Présentation de WSDL 108
relationnelle 144
Création de services Web 108
Présentation des diagrammes d'entité-relation 144
Utilisation des services Web 112
Présentation de la normalisation de données 146
Résumé des compétences 115 Présentation des méthodes d'interrogation des base
Évaluation des connaissances 115 de données 149
Évaluation des compétences 118 Utilisation de requêtes SQL 150
Évaluation de la maîtrise des concepts 119 Utilisation de procédures stockées 159
Présentation des méthodes de connexion de base
de données 164
Leçon 5 : Présentation des applications Utilisation de fichiers plats 164
de bureau 120 Utilisation du langage XML 167
Utilisation d'objets DataSet 170
Matrice des différents objectifs 120 Résumé des compétences 173
Termes clés 120 Évaluation des connaissances 173
Présentation des applications Windows Forms 120 Évaluation des compétences 176
Conception d'un Windows Form 121 Évaluation de la maîtrise des concepts 176
Présentation du modèle d'événement Windows
Form 123
Utilisation de l'héritage visuel 123 Annexe A 177
Index 179
www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Introduction LEÇON 1
à la programmation
M AT R I C E D E C O M P É T E N C E S D E L A L E Ç O N
TERMES CLÉS
algorithme structures de décision instruction if
tableau table de décision instruction if-else
code binaire instruction default méthodes
système de numération binaire boucle do-while opérateur
scénario exception récursivité
classe bloc finally bloc switch
programmes informatiques organigramme instruction switch
(programmes) boucle for bloc try-catch-finally
constante boucle foreach variable
types de données langage de haut niveau boucle while
Imaginez que vous êtes développeur de logiciels pour la société Northwind. Dans le
cadre de votre travail, vous développez des programmes informatiques pour résoudre des
problèmes de l'entreprise. Vos tâches incluent notamment : l'analyse des commandes des
clients pour déterminer les réductions applicables, les mises à jour des informations sur
les stocks pour des milliers d'articles de l'entreprise et la rédaction de rapports interactifs
permettant aux utilisateurs de trier et de filtrer des données.
Il est important de vous assurer que vos programmes sont conçus de manière absolument
conforme aux spécifications. Vous devez également veiller à ce que tous les calculs soient
exacts et complets. Les programmes que vous écrivez doivent être robustes et en mesure
d'afficher des messages d'erreur tout en poursuivant le traitement.
1
2 | leçon 1
Le langage de programmation que vous utilisez vous fournit divers outils et techniques
pour accomplir vos tâches. Selon la tâche à accomplir, vous devez sélectionner les types
de données et les structures de contrôle les mieux adaptées pour résoudre le problème.
Processus ou calcul
Figure 1-1
START
DÉBUT
Un organigramme simple
qui compare deux nombres
et renvoie le plus grand
des deux Entrée x
Entrée y
x > y?
Non
Sore y
Oui
Sore x
STOP
FIN
La figure 1-1 par exemple montre un organigramme qui compare deux nombres et renvoie le
plus grand des deux.
Comme vous pouvez le voir, cet organigramme répertorie dans le bon ordre toutes
les mesures nécessaires pour exécuter l'opération. Le flux de contrôle commence par
le symbole de départ et se termine par le symbole de fin. Les processus et les symboles
d'opération d'entrée/sortie, ont toujours une seule entrée et une seule sortie. En revanche,
le symbole de la décision n'a qu'une seule entrée mais plusieurs sorties. Vous pouvez tester
un organigramme en effectuant un « test d'essai ». Dans un test d'essai, vous parcourez
manuellement les étapes de l'organigramme avec les données de test pour vérifier si les
chemins d'accès corrects sont suivis.
Tableau 1-2
Table de décision pour Quantité < 10 O N N N
calculer des remises
Quantité < 50 O O N N
Quantité < 100 O O O N
Remise 5 % 10 % 15 % 20 %
Pour savoir quel élément d'action appliquer, vous devez évaluer chaque condition pour
trouver la règle correspondante, puis choisir l'action spécifiée dans la colonne avec la règle
correspondante. Par exemple, si la valeur de « Quantité » dans les données d'essai est de 75,
la première règle prend ensuite la valeur « Non », la deuxième règle prend la valeur « Non »,
et la troisième règle prend la valeur « Oui ». Par conséquent, nous allons choisir l'élément
d'action de la colonne (N, N et Y), qui définit la remise sur 15 %.
Présentation de C#
C# est un langage de programmation de haut niveau très répandu qui vous permet
d'écrire des programmes informatiques dans un format lisible par l'homme. C# fait
partie du .NET Framework et bénéficie de la prise en charge du runtime et des
bibliothèques de classe fournis par le .Framework.
Comme indiqué dans la section précédente, les ordinateurs ont besoin d'instructions précises
et complètes pour accomplir une tâche. Ces jeux d'instructions sont appelés programmes
informatiques ou tout simplement programmes.
Les ordinateurs utilisent au minimum le système de numération binaire pour représenter des
informations et du code. Dans ce système, chaque valeur est représentée par deux symboles
uniquement (0 et 1). Un programme informatique qui écrit à l'aide du système de numération
binaire est appelé code binaire.
L'utilisation du code binaire en programmation informatique est extrêmement difficile
à accomplir et représente une tâche énorme. Ainsi, pour simplifier la programmation, les
scientifiques et les ingénieurs informaticiens ont construit plusieurs niveaux d'abstractions
entre les ordinateurs et leurs opérateurs humains. Ces abstractions comprennent des logiciels
(tels que les systèmes d'exploitation, des compilateurs et divers systèmes de runtime) qui
prennent la responsabilité de traduire un programme lisible par l'homme en programme
lisible par une machine.
Les programmes les plus modernes sont écrits dans un langage de haut niveau tel que C#,
Visual Basic ou Java. Ces langages vous permettent d'écrire des instructions précises sous une
forme lisible par l'homme. Un compilateur de langage traduit alors le langage de haut niveau en
un langage de bas niveau qui peut être compris par le système d'exécution Runtime.
Chaque langage de programmation fournit son propre ensemble de vocabulaire et de grammaire
(également connu sous le nom de syntaxe). Dans ce cours, vous apprendrez à programmer à
l'aide du langage de programmation C# sur le .NET Framework. .NET Framework fournit un
environnement d'exécution Runtime pour le programme C#. .NET Framework contient également
des bibliothèques de classes qui fournissent un grand nombre de fonctionnalités de base réutilisables
que vous pouvez utiliser directement dans votre programme C#.
✚ PLUS D'INFORMATIONS
.NET Framework fournit trois composants principaux : un environnement d'exécution Runtime,
un ensemble de bibliothèques de classes qui fournissent une grande partie des fonctionnalités
réutilisables et des compilateurs de langage pour C#, Visual Basic et Managed C++. .NET Framework
prend en charge plusieurs langages de programmation et prend également en charge l'ajout de
langages supplémentaires au système. Bien que la syntaxe et le vocabulaire de chaque langage puissent
différer, ils peuvent chacun utiliser les bibliothèques de classe de base fournies par le Framework.
Introduction à la programmation | 5
ÉCRIRE UN PROGRAMME C#
Figure 1-2
Résultat du programme dans
une fenêtre de commande.
Le fonctionnement du programme que vous venez de créer est simple, mais il est néanmoins
utile pour en comprendre la structure, la conception et l'exécution. Nous allons tout d'abord
parler de la conception et de l'exécution. Voici ce qui arrive lorsque vous sélectionnez l'option
Déboguer > Exécuter sans débogage dans l'étape 5 ci-dessus :
1. Visual Studio appelle le compilateur C# pour traduire le code C# dans un langage
de bas niveau, en code CIL (common intermediate language). Ce code de bas niveau
est stocké dans un fichier exécutable appelé (Leçon01.exe). Il est possible de modifier
le nom du fichier de sortie en modifiant les propriétés d'un projet.
2. Ensuite, Visual Studio prend le résultat du projet et demande au système d'exploitation de
l'exécuter. Vous voyez alors la fenêtre de commande afficher le résultat.
3. Lorsque le programme se termine, Visual Studio affiche le message suivant : « Appuyez
sur n'importe quelle touche pour continuer. . .». Notez que ce message est généré
seulement lorsque vous exécutez le programme à l'aide de l'option Exécuter sans
débogage.
Lorsque vous sélectionnez l'option du menu Déboguer > Exécuter sans débogage, Visual
Studio affiche automatiquement l'invite « Appuyez sur n'importe quelle touche pour
continuer ». . La fenêtre de commande reste ouverte pour vous permettre de vérifier
le résultat. Si, toutefois, vous sélectionnez l'option Débogage > Démarrer le débogage,
*
REMARQUE
la fenêtre de commande se ferme dès que l'exécution du programme se termine. Il est
important de savoir que l'option Démarrer le débogage fournit des fonctions de débogage
comme la possibilité de mettre en pause un programme en cours d'exécution à un moment
donné et d'examiner la valeur des différentes variables en mémoire.
Avant que le code de langage CIL (Common Intermediate Language) puisse être exécuté,
il doit être tout d'abord traduit pour l'architecture de l'ordinateur sur lequel il s'exécutera.
*
REMARQUE
Le système d'exécution Runtime du .NET Framework prend en charge cette traduction en
arrière-plan en utilisant un processus appelé la compilation juste-à-temps.
Dans cette section de la leçon, vous découvrirez les éléments structurels du simple pro-
gramme C# que vous avez créé dans la section précédente.
La figure 1-3 illustre le programme que vous avez créé dans l'exercice précédent, avec les
numéros de ligne. Tout au long de cette section, ces numéros serviront à faire référence aux
différentes structures du programme.
Pour activer l'affichage des numéros de ligne dans Visual Studio, sélectionnez le menu
*
REMARQUE Outils > Options. Développez ensuite le nœud Éditeur de texte et sélectionnez C#. Enfin,
dans la section Affichage, cochez l'option Numéros de ligne.
Introduction à la programmation | 7
Figure 1-3
Listing d'un programme avec
des numéros de ligne
Un programme C# est constitué d'une ou de plusieurs classes. Une classe est un ensemble
de données et de méthodes. Par exemple, le code de la figure 1-3 définit une classe simple
X REF appelée Programme sur les lignes 5 à 11. Une classe est définie à l'aide du mot clé class suivi
du nom de la classe. Le contenu d'une classe est défini entre une accolade ouvrante ({}) et
Vous pouvez trouver une accolade fermante (}).
plus d'informations sur
les classes dans la leçon La ligne 3 du code de la figure 1-3 définit un espace de noms Leçon01. Les espaces de noms
2. sont utilisés pour organiser des classes et les identifier de façon unique. L'espace de noms
et les noms de classe sont combinés pour créer un nom de classe complet. Par exemple, le nom
de classe complet pour la classe Programme est Leçon01.Program. C# requiert que le nom
complet d'une classe soit unique. Par conséquent, vous ne pouvez pas avoir une autre classe
ayant le nom Programme dans l'espace de noms Leçon01, mais vous pouvez avoir une classe
ayant le nom Programme dans un autre espace de noms, Leçon02 par exemple. Ici, la classe
Programme définie dans l'espace de noms Leçon02 est identifiée par son nom de classe
complet, Leçon02.Program.
.NET Framework fournit un grand nombre de classes utiles, organisées en plusieurs espaces
de noms. L'espace de noms System contient les classes de base les plus couramment utilisées.
X REF La classe Console dans l'espace de noms System par exemple. La classe Console fournit des
fonctionnalités pour l'application de console d'entrée et de sortie. La ligne 9 du code dans
Vous pouvez trouver la figure 1-3 désigne la classe Console et appelle sa méthode WriteLine. Pour accéder à la
plus d'informations méthode WriteLine de façon non ambiguë, vous devez l'écrire comme ceci :
sur les méthodes dans
la leçon 2. System.Console.WriteLine(“hello, world!”);
Comme les noms de classe apparaissent fréquemment dans le code, il serait fastidieux d'écrire
le nom de classe complet chaque fois et cela rendrait le programme trop détaillé. Vous pouvez
REMARQUE
* résoudre ce problème en utilisant le langage C# à l'aide d'une directive
Chaque instruction C# (voir le code de la ligne 1 de la figure 1-3). L'utilisation de la directive vous permet d'utiliser les
doit se terminer par un classes dans un espace de noms sans avoir à qualifier pleinement le nom de la classe.
point-virgule (;). La classe Program définit une méthode unique par le nom Main (voir les lignes 7 à 10 de la
liste de code dans la figure 1-3). Main est une méthode spéciale qui sert également de point
d'entrée au programme. Lorsque le runtime exécute un programme, il commence toujours
par la méthode Main. Un programme peut avoir plusieurs classes et chaque classe peut avoir
8 | leçon 1
plusieurs méthodes, mais il devrait n'y avoir qu'une seule méthode Main. Une méthode peut
à son tour appeler d'autres méthodes. À la ligne 9, la méthode Main appelle la méthode
WriteLine de la classe System.Console pour afficher une chaîne de caractères dans la fenêtre
de commande, et le message s'affiche ensuite.
La méthode Main doit être déclarée comme statique. Une méthode statique peut être
*
REMARQUE appelée sur une classe, même si aucune instance de la classe n'a été créée. Vous en
apprendrez plus à ce sujet dans la leçon suivante.
Les variables en langage C# sont des espaces réservés utilisés pour stocker des valeurs.
Une variable a un nom et un type de données. Le type de données d'une variable détermine
quelles sont les valeurs qu'il peut contenir et quel type d'opérations peut y être effectué. Par
exemple, la déclaration suivante crée une variable appelée number, dont le type de données
est int et lui affecte la valeur 10 :
int number = 10;
Lorsqu'une variable est déclarée, un emplacement assez grand pour contenir la valeur de son
type de données est créé dans la mémoire de l'ordinateur. Par exemple, sur un ordinateur
32 bits, une variable de type de données int aura besoin de deux octets de mémoire. La valeur
d'une variable peut être modifiée par une autre affectation, telle que :
number = 20;
Le code ci-dessus modifie le contenu de l'emplacement mémoire identifié par le le nom
number.
Un nom de variable doit commencer par une lettre ou un trait de soulignement et peut
contenir uniquement des lettres, des nombres ou des traits de soulignement. Un nom
*
REMARQUE
de variable ne doit pas dépasser 255 caractères. Une variable doit également être unique
dans le cadre dans lequel elle est définie.
Les constantes sont des champs de données ou des variables locales dont il n'est pas
possible de modifier la valeur.
Elles sont déclarées à l'aide du mot clé const. Par exemple, une constante peut être déclarée
comme suit :
const int i = 10;
Une constante i, dont le type de données est int et qui stocke une valeur de 10 est alors
déclarée. Une fois déclarée, la valeur de la constante n'est pas modifiable.
Les types de données spécifient le type de données que vous utilisez dans un
programme. Un type de données définit la taille de mémoire nécessaire pour stocker les
données et les types d'opérations pouvant être exécutées sur les données.
Introduction à la programmation | 9
C# fournit plusieurs types de données intégrées que vous pouvez utiliser dans vos
X REF
programmes. Vous pouvez également définir de nouveaux types en définissant une structure
Vous pouvez trouver de données, comme une classe ou une structure. Ce chapitre se concentre sur
plus d'informations les types de données intégrés les plus couramment utilisés.
pour créer vos propres Le tableau 1-3 énumère plusieurs types de données intégrés couramment utilisés disponibles
types de données dans en C#. Les tailles répertoriées dans le tableau font référence à un ordinateur exécutant un
la leçon 2. système d'exploitation de 32 bits tel que Windows 7, 32 bits. Pour un système d'exploitation
de 64 bits, tel que Windows 7 64-bit, ces tailles seront différents.
Tableau 1-3
Types de données intégrées Type de données Taille Plage de valeurs
couramment utilisées en C#
octet 1 octet 0 à 255
char 2 octets U+0000 à U+ffff (caractères Unicode)
short 2 octets −32,768 à 32,767
int 4 octets −2,147,483,648 à 2,147,483,647
long 8 octets −
9,223,372,036,854,775,808 à
9,223,372,036,854,775,807
REMARQUE
* flottant 4 octets ±1.5 × 10-45 à ±3.4 × 1038
Les versions non signées
double 8 octets ±5.0e−324 à ±1.7e308
de short, int et long sont
respectivement ushort, bool 2 octets Vrai ou faux
uint et ulong. Les types
chaîne - Zéro ou plusieurs caractères Unicode
non signés ont la même
taille que leurs versions
signées mais stockent Tous les types de données énumérés dans le tableau 1-3 sont des types valeur à l'exception
des plages beaucoup de la chaîne, qui est un type référence. Les variables qui reposent directement sur les types
plus grandes de valeurs valeur contiennent la valeur. Dans le cas du type référence, la variable contient l'adresse
positives. de l'emplacement mémoire où sont stockées les données. Vous en apprendrez plus sur les
différences entre les types valeur et les types référence dans la leçon 2.
Un tableau est une collection de données dans laquelle chaque élément est accessible à
l'aide d'un index unique.
Un tableau dans C# est communément utilisé pour représenter une collection d'éléments de
type similaire. Un exemple de déclaration de tableau est indiqué dans le code suivant :
int[] numbers = { 1, 2, 3, 4, 5 };
Cette déclaration crée un tableau identifié par les numéros de nom. Ce tableau est capable
de stocker une collection de cinq entiers. Cette déclaration initialise également chacun des
éléments du tableau respectivement par les nombres de 1 à 5.
N'importe quel élément d'un tableau est accessible à l'aide d'un index unique. Dans .NET
Framework, les index de tableau sont de base zéro. Cela signifie que pour accéder au premier
élément d'un tableau, vous devez utiliser l'index 1 ; pour accéder au deuxième élément, vous
devez utiliser l'index 2 et ainsi de suite.
Pour accéder à un élément de tableau individuel, vous devez utiliser le nom du tableau suivi
de l'index entre crochets. Par exemple, numbers[0] retournera la valeur 1 à partir du tableau
déclaré ci-dessus et numbers[4] retournera la valeur 5. Il est interdit d'accéder à un tableau
10 | leçon 1
hors des limites définies. Vous obtiendrez par exemple une erreur si vous essayez d'accéder
X REF
aux éléments de tableau numbers[5].
Les tableaux sont PRÉSENTATION DES OPÉRATEURS
présentés plus en
détail dans la leçon 3, Les opérateurs sont des symboles qui spécifient l'opération à effectuer sur les opérandes
Présentation générale du avant de retourner un résultat.
développement logiciel.
Parmi les exemples d'opérateurs on trouve notamment +, -, *, /, et ainsi de suite. Les
opérandes peuvent être des variables, des constantes, des littéraux, etc. Selon le nombre
d'opérandes impliqués, il y a trois sortes d'opérateurs :
• Opérateurs unaires : les opérateurs unaires fonctionnent avec un seul opérande.
On peut citer ++x, x++ ou isEven, où x est un type de données integer et isEven est un
type de données booléen.
• Opérateurs binaires : les opérateurs binaires prennent deux opérandes. Parmi les exem-
ples on trouve notamment x + y ou x y.
• Opérateurs ternaires : les opérateurs ternaires prennent trois opérandes. Il n'y a qu'un
seul opérateur ternaire, ?:, en langage C#.
Souvent, les expressions impliquent plus d'un opérateur. Dans ce cas, le compilateur doit
déterminer quel opérateur a la priorité sur l'autre ou sur les autres. Le tableau 1-4 répertorie
les opérateurs C# par ordre de priorité. Plus un opérateur se situe dans le haut du tableau,
plus sa priorité est élevée. Les opérateurs ayant une priorité plus élevée sont évalués avant
ceux ayant priorité inférieure. Les opérateurs qui apparaissent sur la même ligne ont une
priorité égale.
Tableau 1-4
Précédence des opérateurs Catégorie Opérateurs
en C#
Primary x.y f(x) a[x] x++ x −− new typeof checked unchecked
Unaire + - ! ~ ++x −−x (T)x
Multiplicatif */%
Additif +-
Maj << >>
Opérateurs relationnels et de < > <= >= is as
test de type
Égalité == !=
Logique AND &
Logique XOR ^
Logique OR |
Conditionnelle AND &&
Conditionnel OR ||
Conditionnel ternaire ?:
Affectation = *= /= %= += -= <<= >>= &= ^= |=
int x = 10;
x++; //la valeur de x est maintenant 11
++x; // la valeur de x est maintenant 12
Toutefois, la façon dont les opérateurs unaires d'incrémentation et de décrémentation
fonctionnent dans le cadre d'une affectation peut affecter les résultats. En particulier, lorsque
les opérateurs unaires d'incrémentation et de décrémentation sont utilisés comme préfixe, la
valeur actuelle de l'identificateur est retournée avant l'incrémentation ou la décrémentation.
En revanche, lorsqu'ils sont utilisés comme suffixe, la valeur de l'identificateur est retournée
une fois que l'incrémentation ou la décrémentation est terminée. Pour comprendre ce que
cela signifie, voici l'exemple de code suivant :
int y = x++; / / la valeur de y est de 12
int z = ++x; // la valeur de z est de 14
Ici, dans la première déclaration, la valeur de x est retournée avant l'incrémentation. Ainsi, une
fois l'instruction exécutée, la valeur de y est de 12 et la valeur de x est de 13. En revanche,
dans la seconde instruction, la valeur de x est incrémentée avant de retourner sa valeur pour
l'affectation. Ainsi, une fois l'instruction exécutée, la valeur de x et z est de 14.
PRÉSENTATION DES MÉTHODES
Les méthodes sont des blocs de code contenant des séries d'instructions. Elles peuvent
recevoir des entrées via des arguments et peuvent retourner une valeur à l'appelant.
Dans la liste de code précédente, vous avez découvert la méthode Main. Les méthodes
représentent l'emplacement de l'action dans un programme. Plus précisément, une méthode
PRÊT POUR LA
CERTIFICATION est un ensemble d'instructions qui sont exécutées lorsque la méthode est appelée.
Comprenez-vous les La méthode Main ne renvoie pas de valeur au code appelant. Ceci est indiqué par le mot clé
éléments essentiels de la void. Si une méthode devait retourner une valeur, le type de données approprié serait utilisé
programmation, tels que
plutôt que void.
les variables, les types de
données, les opérateurs Les membres de classe peuvent avoir des modificateurs static, public et private. Ces
et les méthodes ? modificateurs spécifient où et comment les membres du groupe sont accessibles. Vous
1.1 en apprendrez plus sur ces modificateurs dans la leçon 2.
Les structures de décision introduisent une capacité de décision dans un programme. Elles
L'ESSENTIEL
vous permettent d'associer différentes sections du code en fonction de la valeur
de vérité d'une expression booléenne.
Les structures de contrôle de décision en C# sont les instructions if, if-else et switch. Les
sections suivantes décrivent chacune de ces instructions plus en détail.
L'instruction if
Parfois, dans vos programmes, vous voudrez qu'une séquence d'instructions s'exécute
uniquement si une certaine condition est vraie. Dans C#, vous pouvez le faire en utilisant
l'instruction if. Procédez comme suit pour créer un programme qui utilise une instruction if.
UTILISER L'INSTRUCTION IF
Figure 1-4
START
DÉBUT
Organigramme
correspondant à l'exemple
de l'instruction if
n1 = 10
n2 = 20
n2 > n1 ?
Non
Oui
Sore
"n2 est > n1"
STOP
FIN
En code C#, les parenthèses entourant la condition sont nécessaires. Toutefois, les accolades
sont facultatives s'il n'y a qu'une seule instruction dans le bloc de code. Donc, l'instruction if
ci-dessus équivaut à ce qui suit :
if (number2 > number1)
Console.WriteLine(“number2 is greater than number1”);
À l'inverse, regardez cet exemple :
if (number2 > number1)
Console.WriteLine(“number2 is greater than number1”);
Console.WriteLine(number2);
Ici, seule la première instruction Console.WriteLine appartient à l'instruction if. La deuxième
instruction Console.WriteLine est toujours exécutée indépendamment de la valeur de
l'expression booléenne.
Pour plus de clarté, il est toujours judicieux de joindre la déclaration qui doit être exécutée
sous condition entre accolades.
Les instructions if peuvent également être imbriquées dans d'autres instructions, comme dans
l'exemple suivant :
int number1 = 10;
if (number1 > 5)
{
Console.WriteLine(“number1 is greater than 5”);
if (number1 < 20)
{
Console.WriteLine(“number1 is less than 20”);
}
}
Comme les deux conditions ont la valeur True, ce code génère la sortie suivante :
number1 is greater than 5
number1 is less than 20
Mais que se passerait-il si la valeur de number1 était de 25 au lieu de 10 avant l'exécution de
l'instruction if externe ? Dans ce cas, la première expression booléenne aurait la valeur True, mais
la seconde expression booléenne aurait la valeur False et le résultat suivant serait généré :
number1 is greater than 5
Instruction if-else
Procédez comme suit pour créer un exemple de programme qui utilise l'instruction if-else.
Figure 1-5
START
DÉBUT
Organigramme
correspondant à l'exemple
de l'instruction if-else
n < 10 ?
Oui Sore
"n < 10"
Non
n < 20 ?
Oui Sore
"n < 20"
Non
n < 30 ?
Oui Sore
"n = > 30"
Non
Sore
"n = > 30"
STOP
FIN
Instruction switch
L'instruction switch autorise un branchement multiple. Très souvent, le fait d'utiliser une
instruction switch permet de simplifier une combinaison complexe d'instructions if-else.
REMARQUE
* L'instruction switch est composée du mot clé switch, suivi d'une expression entre parenthèses,
L'expression qui suit et d'un bloc switch. Le bloc switch peut inclure une ou plusieurs instructions case ou une
l'instruction case doit instruction default. Lorsque l'instruction switch s'exécute, selon la valeur de l'expression
être une expression switch, le contrôle est transféré à une instruction case correspondante. Si l'expression ne
constante et doit être correspond à aucune des instructions case, le contrôle est alors transféré à l'instruction default.
du type de données L'expression switch doit être entourée de parenthèses.
correspondant à Procédez comme suit pour créer un programme qui utilise l'instruction switch pour évaluer
l'expression switch. des expressions simples.
Toutefois, si aucun code n'est spécifié après l'instruction case, il est correct que le contrôle
passe à l'instruction case ultérieure. Le code suivant illustre comment cela peut être utile :
public static void TestSwitchFallThrough()
{
DateTime dt = DateTime.Today;
switch (dt.DayOfWeek)
{
case DayOfWeek.Monday:
case DayOfWeek.Tuesday:
case DayOfWeek.Wednesday:
case DayOfWeek.Thursday:
case DayOfWeek.Friday:
Console.WriteLine(“Today is a weekday”);
break;
default:
Console.WriteLine(“Today is a weekend day”);
break;
PRÊT POUR LA }
CERTIFICATION
Comprenez-vous les
}
structures de décision Ici, si la valeur de l'expression dt.DayofWeek est DayOfWeek.Monday, la première instruction
informatiques, telles
case est donc mise en correspondance, mais comme aucun code (ou déclaration de transfert
que le branchement et
la répétition ?
de contrôle) n'est spécifié, l'exécution va passer à l'instruction suivante, ce qui entraîne
1.2 l'affichage du message « Today is a weekday » sur la fenêtre de commande.
Vous pouvez décider d'utiliser des instructions if-else ou une instruction switch en
fonction de la nature de la comparaison et de la lisibilité du code. Par exemple, le code
REMARQUE
* de la méthode TestIfElse prend des décisions basées sur des conditions qui sont plus
adaptées pour une utilisation avec des instructions if-else. Dans la méthode TestSwitch,
les décisions sont basées sur des valeurs constantes, le code est donc beaucoup plus lisible
lorsqu'il est écrit comme une instruction switch.
Ces instructions de contrôle de répétition peuvent être utilisées pour exécuter les instructions
dans le corps de la boucle un certain nombre de fois, selon le critère de fin de boucle.
Une boucle peut également se terminer par l'une des instructions de transfert de contrôle qui
transfèrent le contrôle à l'extérieur de la boucle. Ces instructions sont break, goto, return ou
throw. Enfin, l'instruction continue permet de passer le contrôle à l'itération suivante de la
boucle sans quitter celle-ci.
Présentation de la boucle While
Figure 1-6
START
DÉBUT
Organigramme
correspondant à l'exemple
de la boucle while
i=1
i<=5?
Non
Oui
Sore i
i=i+1
STOP
FIN
L'instruction de la boucle, qui incrémente la valeur de i, joue un rôle essentiel. S'il vous
manque cette instruction, la condition de terminaison ne se réalisera jamais et vous
obtiendrez une boucle sans fin.
Dans la plupart des cas, pour avoir une boucle while bien construite, vous devez disposer de
trois parties :
1. Initialiseur : l'initialiseur définit le compteur de boucle sur la valeur de départ correcte.
Dans l'exemple ci-dessus, la variable i est définie sur 1 avant que la boucle commence.
REMARQUE
* 2. Test de boucle : le test de boucle spécifie la condition de terminaison de la boucle. Dans
Pour éviter une boucle l'exemple ci-dessus, l'expression (i <= 5) est l'expression de la condition.
infinie, vous devez vous
assurer que votre boucle 3. Expression de terminaison : l'expression de terminaison modifie la valeur du compteur
while est conçue de de boucle de telle manière que la condition de terminaison se réalise. Dans l'exemple
manière à avoir une fin. ci-dessus, l'expression i++ représente l'expression de terminaison.
Comme vous pouvez le voir, la boucle for combine les trois expressions de contrôle
essentielles d'une itération. Cela permet d'obtenir un code plus lisible. La boucle for
est particulièrement utile pour créer des itérations qui doivent s'exécuter un nombre
de fois spécifié.
Procédez comme suit pour créer un programme qui utilise la boucle for.
La boucle foreach est utile pour l'itération au sein des éléments d'une collection.
La boucle foreach peut être considérée comme une version améliorée de la boucle for pour
itérer sur les collections telles que des tableaux et des listes. La forme générale de l'instruction
foreach est la suivante :
foreach (ElementType element in collection)
statement
22 | leçon 1
Les expressions de contrôle pour la boucle foreach doivent être placées à l'intérieur des
parenthèses. Si plusieurs instructions doivent être exécutées dans le cadre de la boucle, elles
doivent être placées ensemble à l'intérieur des accolades.
Procédez comme suit pour créer un programme qui montre comment la boucle foreach four-
nit un moyen simple pour parcourir une collection.
Présentation de la récursivité
La récursivité est une technique de programmation qui contient une fonction qui
s'appelle elle-même afin de calculer un résultat.
La récursivité et l'itération sont liées. Vous pouvez écrire une méthode qui génère les mêmes
résultats avec la récursivité ou l'itération. Habituellement, la nature du problème lui-même
vous aidera à choisir entre une solution itérative ou récursive. Par exemple, une solution
récursive est plus élégante quand vous pouvez définir la solution d'un problème et en faire
une version plus petite du même problème.
Pour mieux comprendre ce concept, prenons l'exemple de l'opération factorielle en
mathématiques. La définition récursive générale pour une factorielle n (écrite n!) est
la suivante :
1 if n = 0,
n! =
(n − 1)! × n if n > 0.
Selon cette définition, si le nombre est de 0, la factorielle est de un. Si le nombre est supérieur
à zéro, la factorielle est le nombre multiplié par la factorielle du nombre plus petit suivant. Par
Introduction à la programmation | 23
.NET Framework prend en charge la gestion des exceptions standard pour lever et gérer
L'ESSENTIEL
des erreurs d'exécution. Dans cette section, vous apprendrez à utiliser les mots-clés try,
catch et finally pour gérer des exceptions.
24 | leçon 1
Une exception est une condition d'erreur qui se produit durant l'exécution d'un programme
C#. Lorsque cela se produit, le runtime crée un objet pour représenter l'erreur et la « lève ».
À moins « d'intercepter » l'exception en écrivant le bon code de gestion des exceptions, le
programme se termine.
Par exemple, si vous essayez de diviser un entier par zéro, une exception
DivideByZeroException sera levée. Dans .NET Framework, une exception est représentée
à l'aide d'un objet de la classe System.Exception ou l'une de ses classes dérivées. Il existe des
classes d'exceptions prédéfinies qui représentent de nombreuses situations d'erreur fréquentes,
telles que l'exception DivideByZeroException mentionnée précédemment. Si vous concevez
une application qui doit lever des exceptions spécifiques à l'application, vous devez créer une
classe d'exception personnalisée qui dérive de la classe System.Exception.
L'exercice suivant montre comment utiliser un bloc try-catch pour gérer une exception.
L'exercice utilise la méthode File.OpenText pour ouvrir un fichier de disque. Cette instruction
s'exécute très bien dans le cas normal, mais si le fichier (ou l'autorisation
de lire le fichier) est manquante, alors une exception sera levée.
Dans la méthode ExceptionTest, il est incorrect de modifier l'ordre des deux blocs catch.
*
REMARQUE Les exceptions plus spécifiques doivent être listées avant les exceptions génériques, sinon
vous obtiendrez des erreurs de compilation.
Pour gérer une exception, vous devez entourer les instructions qui pourraient provoquer
l'exception dans un bloc try, puis ajouter des blocs catch pour gérer une ou plusieurs
exceptions. Dans cet exemple, en plus de gérer l'exception FileNotFoundException plus
spécifique, nous utilisons également un bloc catch avec des exceptions plus génériques pour
intercepter toutes les autres exceptions. Le nom de l'exception d'un bloc catch doit être placé
entre parenthèses. Les instructions qui sont exécutées lorsqu'une exception est interceptée
REMARQUE
* doivent être placées entre accolades.
Un bloc try doit avoir
L'exécution du code s'arrête lorsqu'une exception se produit. Le runtime recherche une
au moins un bloc catch
instruction catch qui correspond au type d'exception. Si le premier bloc catch n'intercepte pas
ou un bloc finally
l'exception levée, le contrôle passe au prochain bloc catch et ainsi de suite. Si l'exception n'est
associé.
pas gérée dans la méthode, le runtime recherche l'instruction catch dans
le code appelant et se poursuit pendant le reste de la pile d'appels.
Utilisation de Try-Catch-Finally
Le bloc finally est utilisé en association avec le bloc try. Le bloc finally est toujours
exécuté, qu'une exception soit levée ou non. Le bloc finally est souvent utilisé pour écri-
re du code de nettoyage.
Lorsqu'une exception se produit, cela signifie souvent que quelques lignes de code n'ont
pas été exécutées après l'exception. Cela peut laisser votre programme dans un état instable
ou douteux. Pour éviter de telles situations, vous pouvez utiliser l'instruction finally afin
de garantir qu'un certain code de nettoyage soit toujours exécuté. Ceci peut entraîner la
fermeture des connexions, en libérant des ressources ou en définissant des variables sur leurs
valeurs attendues. Regardons un bloc finally dans l'exercice suivant.
UTILISER TRY-CATCH-FINALLY
• Les opérateurs sont des symboles, tels que +, -, *, et /, qui spécifient l'opération
à effectuer sur un ou plusieurs opérandes avant de retourner un résultat.
• Les instructions if-else autorisent votre programme à effectuer une action
si l'expression booléenne est évaluée comme True et une action différente
si l'expression booléenne est évaluée comme False.
• L'instruction switch autorise un branchement multiple. Très souvent, le fait d'utiliser une
instruction switch permet de simplifier une combinaison complexe d'instructions if-else.
• C# a quatre structures de contrôle différentes qui permettent aux programmes
d'exécuter des tâches répétitives : la boucle while, la boucle do-while, la boucle for
et la boucle foreach.
• Les boucles while et do-while exécutent à plusieurs reprises un bloc d'instructions
jusqu'à ce qu'une expression booléenne renvoie la valeur False. La boucle do-while
teste la condition dans la partie inférieure de la boucle.
• La boucle for combine les trois éléments de l'itération (l'instruction d'initialisation,
la condition de terminaison et l'instruction d'incrémentation/de décrémentation)
en code plus lisible.
• La boucle foreach est utile pour l'itération au sein des éléments d'une collection.
• La récursivité est une technique de programmation qui contient une fonction qui
s'appelle elle-même afin de calculer un résultat.
• .NET Framework prend en charge la gestion des exceptions standard pour lever
et gérer des erreurs d'exécution. Pour gérer des exceptions, placez le code qui lève des
exceptions dans un bloc try et placez le code qui gère les exceptions dans un bloc catch.
• Le bloc finally est utilisé en association avec le bloc try. Le bloc finally est toujours
exécuté, qu'une exception soit levée ou non. Le bloc finally est souvent utilisé pour
écrire du code de nettoyage.
Quantité < 10 O N N N
Quantité < 50 O O N N
Quantité < 100 O O O N
Remise 5 % 10 % 15 % 20 %
START
DÉBUT
Entrée n
fact = 1
n > 1?
Non
Oui
fact = fact *n
n=n–1
Fact en sore
STOP
FIN
Introduction à la programmation | 31
■ Évaluation de la maîtrise
Scénario 1-3 :Gestion des exceptions
Vous écrivez du code pour une bibliothèque arithmétique simple. Vous décidez de créer
une méthode appelée Divide qui prend deux arguments, x et y, et renvoie la valeur x/y.
Vous devez intercepter toutes les exceptions arithmétiques susceptibles d'être levées pour
des erreurs dans les conversions arithmétiques, de cast ou de types de données. Vous devez
également intercepter toutes les exceptions susceptibles d'être levées à partir du code. Vous
devez pour cela créer un code de gestion des exceptions structuré correct. Comment allez-
vous écrire ce programme ?
TERMES CLÉS
modificateur d'accès encapsulation polymorphisme
accesseurs événements propriétés
classes abstraites héritage type référence
propriétés implémentées interfaces classes sealed
automatiquement
classe méthode signature
constructeurs espace de noms nombres statiques
délégués objets type valeur
D'un point de vue conceptuel, un objet logiciel est semblable à un objet du monde réel.
Observer des objets réels, tels que des voitures, des téléphones, des lecteurs audio, etc.,
constitue une excellente façon de commencer à penser de manière orientée objet. Vous
remarquerez que ces objets ont tous un état et un comportement. Par exemple, les v oitures
ont non seulement différents états (notamment, un nom de modèle, une couleur, une
vitesse actuelle, un niveau de carburant), mais aussi divers comportements (notamment,
l'accélération, le freinage, le changement de vitesse). De même, vous remarquerez que
certains objets sont simples, alors que d'autres sont complexes. La plupart des objets
complexes (comme une voiture) sont constitués d'objets plus petits qui ont, à leur tour,
leur propre état et leur propre comportement. Vous noterez également que, bien qu'une
voiture soit un objet complexe, il vous suffit de savoir quelques petites choses pour
interagir avec elle. Lorsque vous conduisez une voiture, par exemple, vous appelez
simplement un comportement tel que l'accélération ou le freinage. Vous n'avez pas
à connaître les milliers de détails internes en action sous le capot.
D'un point de vue conceptuel, un objet logiciel est semblable à un objet du monde réel.
Dans l'environnement logiciel, un objet stocke son état dans des champs et expose son
comportement par le biais de méthodes. Lorsqu'une méthode est appelée sur un objet,
vous obtenez une fonctionnalité bien définie sans avoir à vous soucier de la complexité
interne de l'objet ou de la méthode même. Ce concept consistant à masquer la complexité
s'appelle l'encapsulation. C'est l'une des nombreuses fonctionnalités de la programmation
orientée objet que vous allez découvrir plus en détail dans cette leçon.
Présentation des classes
Une classe est le modèle à partir duquel les objets individuels sont créés.
Dans le monde réel, les objets ont besoin d'un modèle qui définit la façon dont ils doivent
être construits. Tous les objets créés à partir du même modèle ont la même apparence et le
même comportement. Pensez, par exemple, à une marque et à un modèle de voiture donnés.
Dans le monde logiciel, une classe est le modèle à partir duquel des objets individuels
sont créés. Un objet est également appelé instance d'une classe.
Dans le monde logiciel, une méthode définit les actions ou opérations prises en charge par
une classe. Une méthode est déterminée en spécifiant le niveau d'accès, le type de retour,
le nom de la méthode et une liste facultative de paramètres entre parenthèses, suivis d'un
bloc de code entre accolades. Par exemple, dans l'exemple précédent, la classe Rectangle
définit une méthode unique nommée GetArea. Pour GetArea, le niveau d'accès est public,
REMARQUE
* le type de retour est double, le nom de la méthode est GetArea, la liste des paramètres est
Le nom d'une méthode, vide et le bloc de code est une instruction de retour unique.
sa liste de paramètres
et l'ordre des types de Une méthode peut retourner une valeur au code appelant. Si une méthode n'est pas
données des paramètres destinée à retourner une valeur, son type de retour est spécifié par le mot clé void. La
sont collectivement méthode doit utiliser une instruction return pour retourner une valeur. L'instruction return
reconnus comme met fin à l'exécution de la méthode et retourne la valeur spécifiée au code appelant.
la signature de la Le type de données de la valeur retournée par une méthode doit correspondre au type
méthode. La signature de retour spécifié sur la ligne de déclaration de la méthode.
d'une méthode doit être Pour revenir à l'exemple précédent, le type de retour de la méthode GetArea est double,
unique au sein d'une ce qui signifie que la méthode GetArea doit retourner une valeur de type double. La
classe. méthode GetArea répond à cette exigence en retournant l'expression length * width, qui
est une valeur double.
Le code suivant définit une méthode InitFields qui prend deux paramètres de type double
et retourne void :
public void InitFields(double l, double w)
{
length = l;
width = w;
}
Introduction à la programmation orientée objet | 35
La méthode InitFields prend deux paramètres et utilise leurs valeurs pour affecter
respectivement la longueur et la largeur des champs de données. Lorsque le type de retour de
la méthode est void, une instruction return sans valeur peut être utilisée. Si aucune instruction
return n'est utilisée (comme dans la méthode InitFields), la méthode cesse de s'exécuter
lorsqu'elle atteint la fin du bloc de code. La méthode InitFields peut être utilisée pour
initialiser correctement la valeur des champs de données, mais comme vous l'apprendrez dans
la section suivante, les constructeurs vous donnent déjà un moyen d'initialiser une classe.
PRÉSENTATION DES CONSTRUCTEURS
Les constructeurs sont utilisés pour initialiser les membres de données de l'objet.
Les constructeurs sont des méthodes de classe spéciales qui sont exécutées lorsqu'une
nouvelle instance d'une classe est créée. Ils sont utilisés pour initialiser les membres de
données de l'objet. Ils doivent avoir exactement le même nom que la classe, et ils n'ont
pas de type de retour. Plusieurs constructeurs, chacun avec une signature unique, peuvent
être définis pour une classe.
Un constructeur qui ne prend aucun argument est appelé constructeur par défaut. Si une
classe est définie sans constructeur, un constructeur par défaut invisible qui ne fait
absolument rien est généré automatiquement.
Il est souvent utile d'avoir des constructeurs supplémentaires pour proposer d'autres façons
d'initialiser un objet. La classe Rectangle, définie précédemment, n'est qu'une façon de
créer et d'initialiser son objet : en appelant le constructeur qui accepte deux paramètres,
les deux étant du type de données par défaut.
CRÉATION D'OBJETS
Les objets sont créés à partir des modèles définis par les classes.
CRÉER UN OBJET
PRÉPAREZ-VOUS. Pour cette activité, utilisez le projet d'application console (Lesson 02)
que vous avez créé lors de l'exercice précédent. Effectuez ensuite les étapes suivantes :
1. Remplacez le code de la classe Program par le code suivant :
class Program
{
static void Main(string[] args)
{
Rectangle rect = new Rectangle(10.0, 20.0);
double area = rect.GetArea();
Console.WriteLine(“Area of Rectangle: {0}”,
area);
}
}
2. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de console s'ouvre
pour afficher l'aire (area) du rectangle.
3. ENREGISTREZ votre projet.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
La classe Rectangle ne fournit qu'une seule façon de construire une instance de la classe :
en appelant un constructeur avec deux arguments de type de données double. Ici, vous
créez un objet à l'aide du mot clé new suivi de l'appel au constructeur de classe approprié.
36 | Leçon 2
Lorsque le code s'exécute, un objet de type Rectangle est créé dans la mémoire de tas.
REMARQUE
* Une référence à cette mémoire est stockée dans la variable rect, et la variable rect est
Les classes et les stockée sur la pile. Plus loin dans ce bloc de code, vous pouvez utiliser rect pour faire
objets sont différents. référence à l'objet qui vient d'être créé et le manipuler.
Une classe définit le
modèle d'un objet, À l'aide de la référence de l'objet, vous pouvez accéder aux membres de la classe.
mais n'est pas un objet Par exemple, le code appelle la méthode GetArea sur l'objet, et la valeur retournée par
en soi. En revanche, un la méthode est stockée dans la variable area. Les champs de données length et width de
objet est une instance l'objet rect ne sont pas accessibles ici, car ils sont marqués comme privés (private) dans
concrète d'une classe, la définition de la classe.
mais n'est pas une PRÉSENTATION DES PROPRIÉTÉS
classe en soi.
Les propriétés vous permettent d'accéder aux données de la classe de manière sûre
et flexible.
REMARQUE
* Les propriétés sont des membres d'une classe. Il est possible de les consulter comme des
Les propriétés sont
champs de données, mais elles contiennent du code comme une méthode. Les propriétés
souvent appelées
sont souvent utilisées pour exposer les champs de données d'une classe avec plus de
champs « intelligents »,
contrôle. Par exemple, un champ privé peut être exposé à l'aide d'une propriété publique,
car elles peuvent
mais il n'est pas nécessaire d'utiliser les propriétés de cette façon.
inclure du code pour
vérifier la cohérence ou Une propriété a deux accesseurs, get et set. L'accesseur get est utilisé pour retourner la valeur
la validité des données. de la propriété, et l'accesseur set est utilisé pour affecter une nouvelle valeur à la propriété.
Une propriété est souvent définie comme publique (public) et, par convention, a toujours un
nom qui commence par une majuscule. En revanche, la convention d'affectation de noms aux
champs de données privés (private) est de les faire commencer par une minuscule.
UTILISEZ le projet que vous avez enregistré dans l'exercice précédent. Exécutez ensuite les
tâches suivantes :
1. Modifiez le code de la classe Rectangle comme indiqué ci-dessous. Dans ce code, le
constructeur est supprimé et deux propriétés sont insérées :
class Rectangle
{
private double length;
private double width;
public double Length
{
get
{
return length;
}
set
{
if ( value > 0.0)
length = value;
}
}
public double Width
{
get
{
return width;
}
Introduction à la programmation orientée objet | 37
set
{
if ( value > 0.0)
width = value;
}
}
public double GetArea()
{
return length * width;
}
}
2. Remplacez ensuite le code de la classe Program par le code suivant :
class Program
{
static void Main(string[] args)
{
Rectangle rect = new Rectangle();
rect.Length = 10.0;
rect.Width = 20.0;
double area = rect.GetArea();
Console.WriteLine(
“Area of Rectangle: {0}”, area);
}
}
3. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de console s'ouvre
pour afficher l'aire (area) du rectangle.
4. ENREGISTREZ votre projet.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
REMARQUE
*
Le modèle de Dans cet exercice, vous avez modifié la classe Rectangle pour introduire deux propriétés,
programmation Length et Width. Les propriétés sont souvent définies avec un modificateur d'accès p ublic.
habituel est que tous Dans le code de la propriété Length, l'accesseur get retourne simplement la valeur du
les champs de données champ de données length. Toutefois, l'accesseur set vérifie la valeur affectée (à l'aide
d'une classe doivent du mot clé value) à la propriété et modifie le champ de données length uniquement si la
être déclarés comme valeur est positive. Les champs privés length et width sont également appelés « champs
privés (private) et que de stockage » pour les propriétés qui les exposent respectivement.
l'accès à ces champs La classe Rectangle ne déclare pas non plus de constructeur explicite. Dans le cas présent,
privés doit s'effectuer les utilisateurs de la classe (la méthode Main) doivent utiliser le constructeur par défaut et
par l'intermédiaire de s'appuient sur les propriétés pour initialiser les données de la classe.
propriétés publiques
La méthode Main utilise les propriétés Length et Width pour définir les données de
qui vérifient la validité
l'objet rect. Essayer d'affecter une valeur négative Length ou Width n'a pas d'effet, et dans
des valeurs de données. ce cas, les champs de données gardent leur valeur initiale 0.
Lorsque vous définissez des propriétés, vous pouvez exclure l'accesseur get ou
l'accesseur set. Si vous n'incluez pas d'accesseur set, vous ne donnez pas la possibilité de
définir la valeur de la propriété. Par conséquent, vous avez une propriété en lecture seule.
D'autre part, si vous n'incluez pas l'accesseur get, vous ne donnez pas la possibilité d'obtenir
la valeur de la propriété. Par conséquent, vous avez une propriété en écriture seule.
PRÉSENTATION DES PROPRIÉTÉS IMPLÉMENTÉES AUTOMATIQUEMENT
Les propriétés implémentées automatiquement simplifient les déclarations de
propriété.
38 | Leçon 2
Le mot clé this peut être utilisé pour accéder aux membres à partir de constructeurs,
de méthodes d'instance et d'accesseurs de propriétés d'instance.
Introduction à la programmation orientée objet | 39
Le mot clé this fait référence à l'instance actuelle de la classe. Vous pouvez utiliser le
mot clé this pour faire référence à n'importe quel membre de l'objet actuel. Par exemple,
précédemment dans ce chapitre, la classe Rectangle a été écrite comme suit :
class Rectangle
{
private double length;
private double width;
public Rectangle(double l, double w)
{
length = l;
width = w;
}
public double GetArea()
{
return length * width;
}
}
Cependant, elle aurait pu être écrite comme ceci :
class Rectangle
{
private double length;
private double width;
public Rectangle(double l, double w)
{
this.length = l;
this.width = w;
}
public double GetArea()
{
return this.length * this.width;
}
}
Comme vous pouvez le voir, dans le deuxième exemple, le mot clé this a été utilisé dans le
constructeur et la méthode GetArea pour faire référence aux champs de données de l'objet
REMARQUE
* actuel de la classe Rectangle. Même s'il n'était pas nécessaire d'utiliser le mot clé this
En C#, les caractères // dans ce cas, son utilisation offre une plus grande flexibilité dans l'affectation de noms aux
permettent d'ajouter des paramètres de méthode. Par exemple, vous pouvez définir le constructeur comme suit :
commentaires sur une
seule ligne à du code. public Rectangle(double length, double width)
Le texte qui suit les {
caractères // est ignoré // the parameter names length and width
par le compilateur. // shadow the class members length and
Les commentaires
// width in this scope
multilignes commencent
par les caractères /* this.length = length;
et se terminent par les this.width = width;
caractères */. }
Dans l'étendue de la définition du constructeur Rectangle, les noms length et width font
maintenant référence au paramètre qui est passé. Les noms des champs de données ont été
occultés et sont accessibles uniquement à l'aide du mot clé this.
40 | Leçon 2
Les délégués sont des types spéciaux utilisés pour encapsuler une méthode ayant une
signature spécifique.
Les délégués sont des objets spéciaux qui peuvent contenir une référence à une m éthode
ayant une signature spécifique. Un délégué est défini à l'aide du mot clé delegate.
Par exemple, vous pouvez définir un délégué comme suit :
public delegate void RectangleHandler(Rectangle rect);
La définition du délégué spécifie la signature de la méthode dont la référence peut être
détenue par un objet délégué. Par exemple, dans le code ci-dessus, vous définissez un
délégué RectangleHandler qui peut contenir des références à une méthode qui retourne
le code void et accepte un paramètre unique du type Rectangle.
Par conséquent, si vous avez une méthode ayant une signature similaire, elle est un
candidat idéal pour l'affectation à une instance de délégué. Par exemple :
public void DisplayArea(Rectangle rect)
{
Console.WriteLine(rect.GetArea());
}
Le type délégué peut être utilisé pour déclarer une variable qui peut faire référence à toute
méthode ayant la même signature que le délégué. Par exemple, vous pouvez déclarer :
RectangleHandler handler;
Et vous pouvez ensuite affecter la méthode au délégué à l'aide de la syntaxe suivante :
handler += new RectangleHandler(DisplayArea);
Vous pouvez également utiliser la syntaxe de raccourci indiquée ci-dessous :
handler += DisplayArea;
Notez que la syntaxe utilise l'opération d'addition. Cela signifie que vous pouvez associer
plusieurs méthodes (de signature compatible), créant ainsi une liste d'invocation d'une ou
de plusieurs méthodes.
Enfin, un appel à un délégué peut être effectué par une syntaxe d'appel de méthode,
comme ceci :
Rectangle rect = new Rectangle (10, 20);
handler(rect);
Lorsque le délégué est appelé de cette façon, il appelle toutes les méthodes de sa liste
d'invocation. Dans cet exemple spécifique, l'objet gestionnaire fait référence à une seule
méthode DisplayArea, et par conséquent, la méthode DisplayArea sera appelée avec
l'objet rect comme paramètre.
Entre beaucoup d'autres applications, les délégués constituent la base des déclarations
d'événements, comme indiqué dans la prochaine section.
PRÉSENTATION DES ÉVÉNEMENTS
Les événements constituent une manière pour une classe d'avertir d'autres classes ou
d'autres objets lorsque quelque chose d'intéressant se produit. La classe qui envoie la
notification est appelée « éditeur de l'événement ». La classe qui reçoit la notification
est appelée « abonné de l'événement ».
Les événements sont faciles à comprendre dans le contexte d'une interface utilisateur
graphique (GUI). Par exemple, lorsqu'un utilisateur clique sur un bouton, un événement
Click se produit. Plusieurs éléments d'interface utilisateur peuvent s'abonner à cet événement
et changer leur état visuel en conséquence (par exemple, certains contrôles sont activés ou
Introduction à la programmation orientée objet | 41
UTILISEZ le projet que vous avez enregistré lors de l'exercice précédent pour effectuer les
tâches suivantes :
1. Modifiez le code de la classe Rectangle comme indiqué ci-dessous :
class Rectangle
{
public event EventHandler Changed;
private double length;
public double Length
{
get
{
return length;
}
set
REMARQUE
* {
Le champ EventArgs.
Empty représente length = value;
un événement sans Changed(this, EventArgs.Empty);
données d'événement. }
Ce champ équivaut }
à avoir une instance }
en lecture seule de la 2. Remplacez le code de la classe Program par le code suivant :
classe EventArgs.
class Program
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
42 | Leçon 2
Un espace de noms vous permet d'organiser le code et de créer des noms de classe
uniques.
Un espace de noms est un élément de langage qui vous permet d'organiser le code et de
créer des noms de classe uniques. Supposons que vous créiez une classe appelée Widget.
Il est probable qu'une autre société vous enverra également du code contenant une classe
appelée Widget. Dans ce cas, comment gérez-vous l'ambiguïté due aux noms ? La solution
consiste à organiser le code dans un espace de noms. Une convention courante veut que le
nom de l'entreprise soit utilisé dans l'espace de noms. Par exemple, vous pouvez procéder
comme suit :
espace_de_noms SociétéA
{
public class Widget { … }
}
Introduction à la programmation orientée objet | 43
et
espace_de_noms SociétéB
{
public class Widget { … }
}
Ici, il est possible de faire référence à la classe de l'espace de noms SociétéA de manière
unique par son nom de classe complet SociétéA.Widget, tandis que l'autre Widget peut
être identifié de manière unique en tant que SociétéB.Widget.
Le .NET Framework utilise généreusement les espaces de noms pour organiser toutes ses
classes. Par exemple, l'espace de noms System regroupe toutes les classes fondamentales.
L'espace de noms System.Data organise des classes pour l'accès aux données. De même,
l'espace de noms System.Web est utilisé pour les classes liées au web.
Bien sûr, avec l'utilisation des espaces de noms, vous risquez de vous retrouver avec des
noms de classe complets vraiment longs qui peuvent entraîner des programmes détaillés
et beaucoup de saisie. C# permet de résoudre ce problème à l'aide de la directive using.
Vous pouvez utiliser la directive using en haut du fichier de classe, comme ceci :
using System.Text;
Une fois que vous avez inclus la directive using pour un espace de noms, il n'est pas
nécessaire d'utiliser le nom complet des classes de cet espace de noms dans le fichier.
PRÉSENTATION DES MEMBRES STATIQUES
UTILISEZ le projet que vous avez enregistré dans l'exercice précédent. Ensuite, procédez
comme suit :
1. Modifiez le code de la classe Rectangle comme indiqué ci-dessous :
class Rectangle
{
public static string ShapeName
{
get { return “Rectangle”; }
}
public double Length { get; set; }
public double Width { get; set; }
public double GetArea()
{
return this.Length * this.Width;
}
}
44 | Leçon 2
Un type valeur stocke directement une valeur, alors qu'un type référence stocke
L'ESSENTIEL uniquement une référence à une valeur réelle.
Un type valeur stocke directement les données dans sa mémoire. En revanche, les types
référence stockent uniquement une référence à un emplacement de mémoire. Ici, les
données réelles sont stockées à l'emplacement de mémoire désigné. La plupart des types
de données élémentaires intégrées (tels que bool, int, char, double, etc.) sont des types
valeur. Les types de données définis par l'utilisateur créés à l'aide du mot clé struct sont
également des types valeur. Les types référence incluent les types créés à l'aide des
mots clés object, string, interface, delegate et class.
Présentation des structs
Le mot clé struct est utilisé pour créer des types définis par l'utilisateur qui se
composent de petits groupes de champs connexes. Les structs sont des types valeur,
par opposition aux classes qui sont des types référence.
Les structs sont définis à l'aide du mot clé struct, comme indiqué ci-dessous :
public struct Point
{
public double X, Y;
}
Les structs peuvent contenir la plupart des éléments que peuvent contenir les classes,
comme des constructeurs, des méthodes, des propriétés, etc. Cependant, comme vous
Introduction à la programmation orientée objet | 45
le découvrirez dans la section suivante, les structs sont des types valeur, tandis que les
REMARQUE
* classes sont des types référence. Contrairement à une classe, un struct ne peut pas hériter
Les structs sont en d'une autre classe ou d'un autre struct.
grande partie utilisés
pour créer des types Présentation de l'allocation de mémoire
simples. Si vous vous
retrouvez à créer un Après avoir entré une valeur ou du texte dans une cellule, vous pouvez le modifier de
struct très complexe, différentes façons. Vous pouvez notamment supprimer totalement le contenu, entrer une
vous devez envisager valeur différente pour remplacer ce qui s'y trouvait ou modifier ce que vous avez entré.
d'utiliser plutôt une
classe. Pour bien comprendre comment les types valeur diffèrent des types référence, il est
conseillé de visualiser comment chacun d'eux est représenté en mémoire. La figure 2-1
montre comment les types valeur sont créés en mémoire. Lorsque vous créez une
variable de type int, par exemple, un emplacement de mémoire nommé que vous pouvez
utiliser pour stocker une valeur de type int est créé. Au début, lorsque vous n'affectez
pas explicitement une valeur, la valeur par défaut du type de données (pour int, la
valeur par défaut est 0) est stockée dans l'emplacement de mémoire. Ensuite, lorsqu'une
affectation est faite, l'adresse mémoire identifiée par le nom de la variable est mise à jour
avec la nouvelle valeur (10 dans le cas de l'affectation dans la figure 2-1).
Figure 2-1
Mode Code Mode Mémoire
Visualisation d'un type valeur
en mémoire nombre
int number; 0
nombre
number = 10; 10
Figure 2-2
Mode Code Mode Mémoire
Visualisation d'un type
référence en mémoire nom
nom
Au début, lorsqu'aucune valeur n'est affectée, la variable a la valeur null (une référence
null ; en d'autres termes, cette variable ne fait pas référence à une adresse mémoire
valide). Puis, dans l'instruction suivante, quand vous déclarez :
name = “Northwind”;
la chaîne « Northwind » est créée dans un emplacement de mémoire particulier (pour
simplifier, supposons que l'adresse mémoire soit m100), et cette adresse mémoire est
stockée dans la variable name. Ensuite, au moment de récupérer la valeur de la variable
46 | Leçon 2
name, le composant d'exécution saura que son contenu n'est pas stocké dans la variable
elle-même, mais plutôt à l'emplacement de mémoire pointé par la variable.
UTILISEZ le projet que vous avez enregistré dans l'exercice précédent pour effectuer les
étapes ci-dessous :
1. Ajoutez le code suivant après la définition de la classe Rectangle pour créer un
struct Point :
struct Point
{
public double X, Y;
REMARQUE
*
Il est possible de créer }
un struct sans utiliser 2. Modifiez le code de la méthode Main comme indiqué ci-dessous :
l'opérateur new. Vous
pouvez simplement static void Main(string[] args)
déclarer Point p1; pour {
créer une variable de Point p1 = new Point();
type struct.
p1.X = 10;
p1.Y = 20;
Point p2 = p1;
p2.X = 100;
Console.WriteLine(“p1.X = {0}”, p1.X);
Rectangle rect1 = new Rectangle
{ Length = 10.0, Width = 20.0 };
REMARQUE
* Rectangle rect2 = rect1;
Lorsque vous copiez rect2.Length = 100.0;
une variable de type Console.WriteLine(“rect1.Length = {0}”,
référence sur une autre rect1.Length);
variable du même type,
seules les références }
sont copiées. Ainsi, 3. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de console s'ouvre
après la copie, les deux pour afficher les valeurs de p1.X et de rect1.Length.
variables pointent vers 4. ENREGISTREZ votre projet.
le même objet.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Ici, la première partie du programme crée une copie du type valeur Point, et la seconde
partie crée une copie du type référence Rectangle.
Analysons tout d'abord la façon dont la copie d'un type valeur est effectuée. Pour
commencer, lorsque l'instruction suivante est exécutée, une nouvelle variable p2 est créée
en mémoire, et son contenu est copié à partir de la variable p1 :
Point p2 = p1;
Une fois cette instruction exécutée, la variable p2 est créée, et le contenu de la variable p1
est copié dans la variable p2. p1 et p2 ont tous les deux leur propre ensemble de valeurs
disponible dans leurs emplacements de mémoire respectifs. Donc, lorsque l'instruction
suivante est exécutée :
p2.X = 100;
elle affecte uniquement la valeur X correspondant à l'emplacement de mémoire de la
variable p2. La valeur X de la variable p1 n'est pas affectée.
Introduction à la programmation orientée objet | 47
Analysons maintenant la façon dont la copie fonctionne entre les types référence. Dans ce cas,
lorsque l'instruction suivante est exécutée, une nouvelle variable rect2 est créée, et comme
précédemment, le contenu de rect1 est copié dans l'emplacement de mémoire de rect2 :
Rectangle rect2 = rect1;
Toutefois, étant donné que la classe Rectangle est un type référence, le contenu de
la variable rect1 est en fait une référence à un emplacement de mémoire qui contient
un objet Rectangle. Ainsi, après l'initialisation ci-dessus, les variables rect1 et rect2
pointent toutes les deux vers le même emplacement de mémoire, puis vers le même
objet Rectangle. En d'autres termes, il n'y a qu'un seul objet rectangle en mémoire, et les
variables rect1 et rect2 y font toutes les deux référence. L'instruction suivante modifie la
longueur (Length) de cet objet rectangle :
rect2.Length = 100.0;
Cette instruction fait référence à l'emplacement de mémoire pointé par rect2 (qui se
PRÊT POUR LA trouve être le même emplacement de mémoire que celui pointé par rect1), et modifie la
CERTIFICATION
longueur (Length) de l'objet Rectangle. Maintenant, si vous essayez de référencer le même
Comprenez-vous les
types de données emplacement de mémoire via l'objet rect1, vous obtenez l'objet modifié et le code suivant
et l'allocation de affiche la valeur « rect1.Length = 100 » :
mémoire ? Console.WriteLine(“rect1.Length = {0}”,
1.1
rect1.Length);
✚ PLUS D'INFORMATIONS
De la mémoire est toujours allouée aux objets sur le tas. Le tas est la mémoire disponible pour
un programme au moment de l'exécution pour l'allocation de mémoire dynamique. En revanche,
certains éléments de données peuvent être créés sur la pile d'exécution ou sur la pile des appels.
Les éléments créés sur la pile sont les paramètres de méthode et les variables locales déclarés
dans une méthode. La mémoire de la pile est récupérée lorsque la pile se déroule (en cas de retour
d'une valeur par une méthode, par exemple). La mémoire allouée dans le tas est automatiquement
récupérée par le garbage collector lorsque les objets ne sont plus utilisés (c'est-à-dire quand aucun
autre objet ne contient une référence à ces objets).
■ Présentation de l'encapsulation
REMARQUE
* Les modificateurs d'accès contrôlent les emplacements où un type ou un membre de
Vous devez utiliser le type peut être utilisé.
niveau d'accès le plus Tous les types et membres de type ont un niveau d'accès qui spécifie où cette classe ou ses
restrictif approprié à un membres peuvent être utilisés dans votre code. Le niveau d'accès peut être défini à l'aide
membre de type. de l'un des modificateurs d'accès spécifiés dans le tableau 2-1.
Tableau 2-1
Modificateurs d'accès
Lorsque du code C# est compilé, le code exécutable de sortie contenu dans un fichier .
REMARQUE
* dll ou .exe est aussi appelé assembly. Un assembly est une unité de code exécutable
dont la version peut être gérée et qui peut être installée de manière indépendante.
Les modificateurs d'accès ne sont pas autorisés dans les déclarations d'espaces de noms.
L'accès public est implicite pour les espaces de noms. Les classes de niveau supérieur
PRÊT POUR LA (déclarées directement sous un espace de noms) ne peuvent être que public ou internal.
CERTIFICATION Le modificateur d'accès internal est la valeur par défaut d'une classe si aucun modificateur
Comprenez-vous d'accès n'est spécifié. (Par exemple, la classe Rectangle définie dans l'exercice précédent
l'encapsulation ? a par défaut un accès interne.) L'accessibilité d'une classe imbriquée ne peut pas être
2.4 moins restrictive que l'accessibilité de la classe conteneur.
■ Présentation de l'héritage
Supposons que nous voulions créer un ensemble de classes qui décrit des polygones tels
REMARQUE
* que les rectangles ou les triangles. Ces classes auront certaines propriétés communes,
Contrairement aux telles que la largeur et la longueur. Dans ce cas, vous pouvez créer une classe de base
classes, les structs ne Polygon avec les propriétés Width et Length, et les classes dérivées Rectangle et Triangle
prennent pas en charge hériteront de ces propriétés tout en proposant leurs propres fonctionnalités. L'exercice
l'héritage. suivant explique ce concept plus en détail.
UTILISEZ le projet que vous avez enregistré lors de l'exercice précédent pour exécuter les
actions suivantes :
1. Ajoutez une nouvelle classe nommée Polygon, comme indiqué ci-dessous :
class Polygon
{
public double Length { get; protected set; }
public double Width { get; protected set; }
}
Les propriétés Length et Width de la classe Polygon sont déclarées avec un modificateur
d'accès protégé pour l'accesseur set. Cela signifie que l'accès à l'accesseur set est
disponible uniquement à l'intérieur de la classe Polygon et de ses classes dérivées. Vous
pouvez tout de même obtenir la valeur des propriétés Length et Width dans la méthode
Main, mais vous obtenez une erreur si vous tentez d'affecter une valeur à ces propriétés.
La classe Rectangle hérite de toutes les données non privées et du comportement de la
classe Polygon. En outre, la classe Rectangle définit des fonctionnalités supplémentaires
(méthode GetArea) qui ne sont pas disponibles dans la classe de base.
Présentation des classes abstraites et sealed
Les classes abstraites fournissent une définition commune d'une classe de base qui
peut être partagée par plusieurs classes dérivées. En revanche, les classes sealed
fournissent des fonctionnalités complètes, mais ne peuvent pas être utilisées comme
classes de base.
Lors de l'exercice précédent, vous avez défini une méthode GetArea sur la classe
Rectangle. Supposons que vous souhaitiez créer une autre classe, Triangle, qui est de type
Polygon. Ici, vous aurez besoin, dans la classe Triangle, d'une méthode GetArea qui va
calculer l'aire d'un triangle.
Souvent, les classes de base agissent en tant que référentiel des fonctionnalités communes.
Dans le cas de la classe Polygon, le polygone en soi ne saura pas comment calculer l'aire
s'il ne connaît pas le type de la forme. Mais en général, on peut supposer que toutes les
classes de type Polygon peuvent calculer leur aire. Ces suppositions peuvent être reportées
sur la classe de base à l'aide d'un mot clé abstract.
Cette version de la classe Polygon définit une méthode nommée GetArea. La principale
raison justifiant d'inclure cette méthode dans la classe de base est que, maintenant, la
classe de base peut fournir un modèle commun de fonctionnalités pour les classes dérivées.
REMARQUE
* Mais, comme vu précédemment, la classe de base Polygon n'en sait pas suffisamment pour
Vous ne pouvez pas calculer l'aire de la forme. Cette situation peut être traitée en marquant la méthode comme
créer des instances abstraite. Une méthode abstraite fournit une définition, mais n'offre pas d'implémentation
d'une classe abstraite. (le corps de la méthode). Si l'un des membres d'une classe est abstrait, la classe elle-même
doit être marquée comme abstraite. Une classe abstraite ne peut pas être instanciée.
Les classes dérivées peuvent fournir une implémentation d'une classe abstraite pour
créer une classe concrète (une classe non abstraite). Les classes dérivées peuvent offrir
une implémentation d'une méthode abstraite en la substituant dans une classe dérivée.
Par exemple, la classe Rectangle substitue la méthode GetArea abstraite de la classe de
base et fournit une implémentation complète. Par conséquent, la classe Rectangle n'est
plus une classe abstraite et peut être instanciée directement.
En revanche, les classes sealed sont définies lorsque votre application est terminée et que
vous ne voulez pas qu'une classe soit héritée. Une classe sealed peut être créée à l'aide du
mot clé sealed, comme dans l'exemple suivant :
sealed class Rectangle: Polygon
{
// class members here
}
Comme Rectangle est une classe sealed, elle ne peut pas être utilisée comme classe de
base. Il est également possible de marquer des membres de classe sélectionnés comme
sealed pour éviter qu'ils soient substitués dans une classe dérivée. Par exemple, vous
pouvez déclarer :
sealed public override double GetArea()
REMARQUE
* {
C# ne prend pas en
charge l'héritage de return Width * Length;
plusieurs classes de }
base, souvent appelé Cette déclaration garantit que la méthode GetArea ne peut pas être substituée dans une
« héritage multiple ». classe dérivée.
La classe Object est la classe de base ultime de toutes les classes du .NET
Framework.
Toutefois, vous n'êtes pas obligé de déclarer la classe Polygon de cette dernière façon,
car l'héritage à partir de la classe Object est implicitement supposé. Dans le cadre de cet
héritage, une classe dérivée peut substituer les méthodes de la classe Object. Deux des
méthodes les plus courantes pour ce faire sont les suivantes :
• Equals : prend en charge la comparaison entre deux objets, et retourne true si les
deux objets ont la même valeur.
• ToString : retourne une représentation sous forme de chaîne de la classe. Par défaut,
elle retourne le nom complet de la classe. Il est souvent utile de substituer cette
méthode afin qu'elle retourne une représentation sous forme de chaîne de l'état actuel
de l'objet.
L'exemple suivant montre comment vous pouvez substituer la méthode ToString dans la
classe Rectangle :
class Rectangle: Polygon
{
public Rectangle(double length, double width)
{
Length = length;
Width = width;
}
public override double GetArea()
{
return Width * Length;
}
public override string ToString()
{
return String.Format(
“Width = {0}, Length = {1}”,
Width, Length);
}
}
Le cast est également possible dans l'autre sens. Par exemple, vous pouvez déclarer :
Object o = new Rectangle(10, 20);
…
Rectangle r = (Rectangle) o;
Ici, un objet Rectangle est d'abord affecté à une classe Object (la classe de base ultime),
et l'objet résultant est ensuite à nouveau casté en Rectangle. Lorsque la dernière
affectation se produit, un cast explicite est requis, car vous convertissez un objet plus
général en un objet moins général. Le module d'exécution vérifie si la valeur de la
variable o est compatible avec la classe Rectangle. Si, au moment de l'exécution, la valeur
de la variable o n'est pas compatible avec la classe Rectangle, le composant d'exécution
lève une exception System.InvalidCastException.
UTILISATION DE L'OPÉRATEUR IS
Pour éviter les erreurs d'exécution telles que l'exception InvalidCastException, l'opérateur
is peut être utilisé pour vérifier si le cast est autorisé avant d'effectuer réellement le cast,
comme dans l'exemple suivant :
if (o is Rectangle)
{
Rectangle r = (Rectangle) o;
}
REMARQUE
* Ici, le module d'exécution vérifie la valeur de l'objet o. Ensuite, l'instruction de cast est
Si vous utilisez exécutée uniquement si o contient un objet Rectangle.
l'opérateur as pour
convertir un type, UTILISATION DE L'OPÉRATEUR AS
la vérification de L'opérateur as est un autre opérateur de cast utile. L'opérateur as est similaire à l'opération
l'opérateur is n'est pas de cast mais, dans le cas de as, si la conversion de type n'est pas possible, la valeur null
nécessaire. Vous pouvez est retournée au lieu qu'une exception soit levée. Par exemple, considérez le code suivant :
simplement vérifier
la valeur de retour de Rectangle r = o as Rectangle;
l'opérateur as pour voir if (r != null)
si elle est null. {
// do something
PRÊT POUR LA }
CERTIFICATION
Comprenez-vous Si, au moment de l'exécution, il n'est pas possible d'effectuer de cast de la valeur de la
l'héritage ? variable o en un rectangle, une valeur null est affectée à la variable r. Aucune exception
2.2 n'est levée.
■ Présentation du polymorphisme
Vous développez une application qui permet aux utilisateurs de travailler avec différents
types de polygones. Vous avez une collection qui contient plusieurs types de polygones,
comme un rectangle, un triangle et un carré. Chaque polygone vous fournit sa propre
implémentation de la méthode Draw. Lorsque vous travaillez avec cette collection, vous
ne savez pas nécessairement avec quelle forme exactement vous travaillez, mais vous
54 | Leçon 2
souhaitez que la méthode Draw appropriée soit appelée à chaque fois. C'est exactement ce
que le polymorphisme permet de faire.
Le polymorphisme permet aux objets d'une classe dérivée d'être traités au moment de
l'exécution en tant qu'objets de la classe de base. Lorsqu'une méthode est appelée au
moment de l'exécution, son type exact est identifié, et la méthode appropriée est appelée
à partir de la classe dérivée.
UTILISER LE POLYMORPHISME
UTILISEZ le projet que vous avez enregistré lors de l'exercice précédent pour effectuer les
étapes suivantes :
1. Modifiez la classe Polygon comme indiqué ci-dessous :
class Polygon
{
public virtual void Draw()
{
Console.WriteLine(“Drawing: Polygon”);
}
}
Lorsqu'une classe de base définit un membre virtuel, la classe dérivée dispose de deux
options pour le traiter : en particulier, la classe dérivée peut utiliser soit le mot clé
override, soit le mot clé new. Le mot clé override est prioritaire sur la définition de classe
de base du membre. Ici, l'objet de la classe dérivée appelle le membre substitué au lieu du
membre de la classe de base.
À titre de comparaison, si le mot clé new est utilisé, une nouvelle définition du membre
est créée et le membre de la classe de base est masqué. Toutefois, si la classe dérivée est
castée en une instance de la classe de base, les membres masqués de la classe peuvent
encore être appelés.
56 | Leçon 2
La classe System.Object fournit une méthode ToString. Par convention, vous devez
utiliser cette méthode pour retourner la représentation lisible par l'homme d'une classe.
REMARQUE
* Lorsque vous créez vos types, il est recommandé de substituer cette méthode pour
retourner des informations lisibles concernant les objets.
Les interfaces permettent d'établir des contrats via lesquels les objets peuvent interagir
L'ESSENTIEL les uns avec les autres sans connaître les informations d'implémentation détaillées.
Les interfaces sont définies à l'aide du mot clé interface. Une définition d'interface se
REMARQUE
* compose d'un ensemble de signatures pour les méthodes, les propriétés, les délégués,
Par convention,
les événements ou les indexeurs. Une définition d'interface ne peut pas se composer de
toutes les interfaces
n'importe quel champ de données ou de n'importe quelle information d'implémentation
définies dans le .NET
détaillée comme des corps de méthode.
Framework commencent
par un I majuscule. L'espace de noms IComparable est une interface commune définie dans l'espace de noms
Même si vous êtes System. Il s'agit d'une interface simple, définie comme suit :
libre de nommer vos
interface IComparable
interfaces comme
vous le souhaitez, {
il est préférable de int CompareTo(object obj);
suivre cette convention }
Framework.
Introduction à la programmation orientée objet | 57
UTILISEZ le projet que vous avez enregistré lors de l'exercice précédent pour effectuer les
étapes suivantes :
1. Modifiez la classe Rectangle comme indiqué ci-dessous :
class Rectangle: Polygon, IComparable
{
public double Length { get; set; }
public double Width { get; set; }
public override void Draw()
{
Console.WriteLine(“Drawing: Rectangle”);
}
public double GetArea()
{
return Length * Width;
}
public int CompareTo(object obj)
{
if (obj == null)
return 1;
if (!(obj is Rectangle))
throw new ArgumentException();
Rectangle target = (Rectangle)obj;
double diff = this.GetArea() - target.GetArea();
58 | Leçon 2
if (diff == 0)
return 0;
else if (diff > 0)
return 1;
else return -1;
}
}
3. Modifiez ensuite la méthode Main comme suit :
static void Main(string[] args)
{
Rectangle rect1 = new Rectangle
{ Length = 10, Width = 20 };
Rectangle rect2 = new Rectangle
{ Length = 100, Width = 200 };
Console.WriteLine(rect1.CompareTo(rect2));
}
4. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de la console s'ouvre
et affiche la valeur – 1, car la surface de rect1 est inférieure à la surface de rect2.
5. ENREGISTREZ votre projet.
Ici, la classe Rectangle dérive de la classe Polygon et implémente l'interface IComparable.
Une classe qui implémente une interface doit implémenter toutes les méthodes déclarées
dans cette interface.
Une interface est semblable à une classe abstraite, mais il existe toutefois quelques
différences notables. En particulier, une classe abstraite fournit une implémentation
incomplète, alors qu'une interface ne fournit absolument aucune implémentation. Une
classe peut également implémenter plusieurs interfaces, mais ne peut hériter que d'une
seule classe de base.
Donc, comment décidez-vous d'utiliser une classe abstraite ou une interface ? Une
méthode consiste à vérifier s'il existe une relation de type « is-a » entre les deux concepts.
PRÊT POUR LA Par exemple, s'il existe une relation d'héritage entre un objet SalariedEmployee et un objet
CERTIFICATION Employee, vous pouvez utiliser une classe abstraite pour standardiser les fonctionnalités
Comprenez-vous communes aux classes dérivées. En revanche, il n'existe aucune relation de type « is-a »
l'encapsulation ? entre un objet Employee et l'interface IComparable. Par conséquent, la fonctionnalité de
2.4
comparaison est mieux implémentée en tant qu'interface.
• Le mot clé this peut être utilisé pour accéder aux membres à partir de constructeurs,
de méthodes d'instance et des accesseurs de propriétés d'instance.
• Les délégués sont des types spéciaux utilisés pour encapsuler une méthode ayant
une signature spécifique.
• Les événements constituent une manière pour une classe d'avertir d'autres classes
ou d'autres objets lorsque quelque chose d'intéressant se produit. La classe qui
envoie une notification est appelée « éditeur de l'événement », et la classe qui reçoit
la notification est appelée « abonné à l'événement ».
• Les espaces de noms vous permettent d'organiser le code et de créer des noms de
classe uniques.
• Le mot clé static est utilisé pour déclarer des membres qui n'appartiennent pas à des
objets individuels, mais à une classe proprement dite.
• Un type valeur stocke directement une valeur, alors qu'un type référence stocke
uniquement une référence à une valeur réelle.
• Le mot clé struct est utilisé pour créer des types définis par l'utilisateur qui se
composent de petits groupes de champs connexes. Les structs sont des types valeur,
tandis que les classes sont des types référence.
• L'encapsulation est un mécanisme permettant de restreindre l'accès à une classe
ou à ses membres afin de cacher les décisions relatives à la conception qui sont
susceptibles de changer. L'encapsulation offre aux concepteurs de classes une
certaine flexibilité pour modifier, si nécessaire, une section de code sans changer tout
le reste du code qui utilise ce code.
• Un modificateur d'accès spécifie la région du code qui aura accès à un champ.
Par exemple, un modificateur d'accès public ne limite pas l'accès, mais un modificateur
d'accès private limite l'accès au sein de la classe dans laquelle le champ est défini.
• L'héritage vous permet de créer des classes qui réutilisent, étendent et modifient
les fonctionnalités définies dans des classes existantes. La classe qui hérite des
fonctionnalités est appelée « classe dérivée », et la classe dont les fonctionnalités
sont héritées est appelée « classe de base ».
• Le polymorphisme est la capacité des classes dérivées à partager des fonctionnalités
communes à des classes de base tout en définissant leur propre comportement unique.
• Le mot clé override remplace un membre de classe de base dans une classe dérivée.
Le mot clé new crée un membre du même nom dans la classe dérivée et masque
l'implémentation de la classe de base.
2. Vous avez défini une méthode appelée Render dans une classe. Cette méthode fournit des
fonctionnalités pour restituer des fichiers bitmap à l'écran. Vous voulez que les classes dérivées
annulent et remplacent ces fonctionnalités pour prendre en charge le rendu de formats d'image
supplémentaires. Vous voulez également que la méthode Render des classes dérivées soit exécutée
même si une classe dérivée est castée en tant que classe de base. Quel mot clé devez-vous utiliser
avec la définition de la méthode Render dans la classe de base ?
a. abstract
b. virtual
c. new
d. overrides
3. Vous avez défini une classe AdvMath qui définit des fonctionnalités mathématiques avancées. Vous
ne voulez pas que des classes dérivées héritent des fonctionnalités de cette classe. Quel mot clé
devez-vous utiliser pour définir la classe AdvMath ?
a. sealed
b. abstract
c. private
d. internal
4. Vous devez fournir une fonctionnalité de requête à plusieurs de vos classes. Chaque algorithme de
classe pour la requête sera sans doute différent. Toutes les classes n'ont pas forcément de relation
de type « is-a » entre elles. Comment devez-vous prendre en charge cette fonctionnalité ?
a. Vous ajoutez la fonctionnalité de requête à une classe de base avec le modificateur d'accès
public
b. Vous faites en sorte que toutes les classes héritent d'une classe de base abstraite et remplace la
méthode de classe de base pour fournir leur propre fonctionnalité de requête
c. Vous faites en sorte que toutes les classes héritent d'une classe de base qui fournit la
fonctionnalité de requête
d. Vous créez une interface commune qui est implémentée par toutes les classes
5. Quels éléments de classe suivants devez-vous utiliser pour définir le comportement d'une classe ?
a. Méthode
b. Propriété
c. Événement
d. Délégué
Introduction à la programmation orientée objet | 61
6. Vous écrivez du code pour une classe appelée Product. Vous devez vous assurer que
les membres de données de la classe sont initialisés à leurs valeurs correctes dès que
vous créez un objet de la classe Product. Le code d'initialisation devrait toujours être
exécuté. Que devez-vous faire ?
a. Vous créez une méthode statique dans la classe Product pour initialiser les
membres de données
b. Vous créez un constructeur dans la classe Product pour initialiser les membres
de données
c. Vous créez une propriété statique dans la classe Product pour initialiser les
membres de données
d. Vous créez un événement dans la classe Product pour initialiser les membres
de données
7. Vous créez une classe appelée Square dérivée de la classe Polygon. La classe Polygon
a le code suivant :
class Polygon
{
public virtual void Draw()
{
// additional code . . .
}
}
La méthode Draw de la classe Square doit fournir une nouvelle fonctionnalité mais
également masquer l'implémentation de la classe Polygon de la méthode Draw.
Quelle segment de code devez-vous utiliser pour y parvenir ?
a. class Square: Polygon
{
public override void Draw()
{
// additional code . . .
}
}
b. class Square: Polygon
{
public new void Draw()
{
// additional code . . .
}
}
c. class Square: Polygon
{
public virtual void Draw()
{
// additional code . . .
}
}
62 | Leçon 2
■ Évaluation de la maîtrise
Scénario 2-1 : Remplacement de la méthode ToString
Supposons que vous écriviez du code pour une classe Product. Cette classe contient
le nom et le prix d'un produit. Vous devez remplacer la méthode ToString de la classe
de base (System.Object) pour fournir des informations à propos des objets de la classe
Product au code appelant. Quel code devez-vous écrire pour la classe Product pour
satisfaire cette exigence ?
TERMES CLÉS
test d'acceptation test d'intégration test de logiciels
gestion du cycle de vie des liste liée algorithmes de tri
applications QuickSort pile
tableaux file d'attente test du système
tests de boîte noire test de régression test unitaire
Bubblesort gestion des mises en production tests de boîte blanche
structures de données analyse des spécifications
processus de conception développement logiciel
Vous êtes développeur de logiciels pour la société Northwind. Vous travaillez au sein
d'une équipe pour développer des programmes informatiques capables de résoudre
des problèmes complexes liés aux entreprises. En tant que développeur, vous devez
être au courant des différentes phases du cycle de vie de l'application, car vous jouez
un rôle important dans plusieurs parties de ce cycle. Par exemple, non seulement
vous participez aux phases de conception et de développement, mais vous avez
souvent besoin d'interagir avec l'équipe de test de logiciels au cours de la phase
de test. Vous faites aussi parfois vous-même des tests, vous devez donc avoir une
compréhension globale de ce processus.
65
66 | leçon 3
Lorsque vous développez des logiciels, vous utilisez différents types de structures
de données et d'algorithmes. Par conséquent, vous devez savoir quelle structure de
données utiliser pour la tâche à accomplir et quelles sont les répercussions de votre
choix sur les performances. Vous devez également avoir une compréhension globale
des différentes méthodes de tri.
La gestion du cycle de vie des applications désigne l'ensemble des activités qui
L'ESSENTIEL gravitent autour d'un nouveau logiciel, depuis sa création jusqu'à son arrivée à maturité,
voire parfois son retrait du marché.
Le développement d'une application logicielle ne consiste pas simplement à écrire du code.
Diverses autres activités doivent également être effectuées dans le bon ordre pour réussir
à développer une application. Ces activités sont connues sous le nom de gestion du cycle
de vie des applications. Certaines des activités qui font partie du processus de gestion du
cycle de vie des applications sont indiquées dans la figure 3-1 (notamment les exigences, la
conception, le développement, les tests, la livraison et la gestion des mises en production).
Figure 3-1
Gestion du cycle de vie des
applications Configuraon
requise
Maintenance Concepon
Tests Développement
Dans cette section, vous découvrirez les différentes activités et les rôles impliqués dans
chaque étape du processus de gestion du cycle de vie des applications.
Le cycle de vie d'une application commence lorsque la nécessité d'une nouvelle
application logicielle est identifiée. Le directeur de l'entreprise est habituellement chargé
de promouvoir le projet. Il analyse les besoins, vérifie comment le projet s'inscrit dans la
stratégie globale de l'entreprise, organise le financement et initie le processus de dotation
en personnel pour le projet.
Un chef de projet est probablement la première personne engagée par le directeur
de l'entreprise. Il est responsable de l'exécution globale du projet. Ses principales
responsabilités sont de s'assurer que le projet respecte le budget et se termine dans les
temps. Le chef de projet est également responsable de l'embauche des membres de
l'équipe et doit faciliter la coopération au sein de l'équipe.
Présentation de l'analyse des spécifications
L'analyse des spécifications est le processus qui consiste à déterminer les exigences
commerciales précises pour un nouveau système logiciel.
Présentation générale du développement logiciel | 67
Il s'agit de l'une des étapes les plus importantes dans l'application du cycle de vie. Des
spécifications précises, complètes et bien documentées sont essentielles pour la réussite
du projet. Ces spécifications peuvent être fonctionnelles ou non. Les spécifications
fonctionnelles indiquent exactement ce pour quoi le système est conçu. En revanche, les
spécifications non fonctionnelles sont des spécifications en termes de qualité, comme
l'évolutivité, la sécurité, la fiabilité et ainsi de suite.
Un analyste d'entreprise est chargé d'analyser les besoins de l'entreprise et de les convertir
en exigences pouvant être mises en œuvre par l'équipe de développement.
Présentation du processus de conception
Le processus de conception permet de créer les plans, les modèles et l'architecture
utilisés pour la mise en œuvre du logiciel.
Le développement logiciel est la partie du processus ALM dans laquelle les besoins
de l'entreprise sont implémentés dans le code en fonction de la conception créée dans
l'activité précédente. À la fin de cette activité, vous disposez d'un résultat concret sous
la forme d'un système logiciel avec lequel les utilisateurs peuvent interagir.
Parmi les participants importants du développement logiciel on trouve :
• Des développeurs : les développeurs écrivent le code en fonction des spécifications
rassemblées par l'analyste d'entreprise, l'architecture prévue par l'architecte et
l'expérience utilisateur développée par le concepteur de l'expérience utilisateur.
• Des administrateurs de bases de données : les administrateurs de bases de données
sont responsables de la mise en œuvre et de la maintenance des bases de données du
logiciel. Ils sont également chargés de prévoir l'intégrité, la sécurité et la vitesse des
données.
• Des rédacteurs techniques : les rédacteurs techniques développent les manuels et les
fichiers d'aide du système qui seront livrés avec l'application.
• Des développeurs de contenu : les développeurs de contenu sont des experts qui
développent le contenu pour le système. Par exemple, si l'application est un site Web
de critique de film, il ne suffit pas de déployer le site Web, vous devez également
vous assurer qu'il a assez de contenu pour recueillir les commentaires des utilisateurs.
68 | leçon 3
Les tests de logiciels vérifient que la mise en œuvre correspond aux exigences du système.
Ils permettent de garantir la qualité du produit final. Ils aident à identifier les éventuels
manquements entre les attentes du système, telles que décrites dans le document
définissant les spécifications, et le comportement réel du système.
Parmi les participants importants pour tester des logiciels, on trouve des testeurs qui
vérifient l'application afin de s'assurer qu'elle répond aux exigences identifiées. Lorsque
ces testeurs identifient des défauts dans l'application, ils affectent chaque défaut à une
personne compétente qui peut la corriger. Par exemple, une erreur de code serait affectée
à un développeur afin d'être résolue.
La gestion des mises en production inclut des activités telles que le packaging et le
déploiement du logiciel, la gestion des défauts de l'application et des demandes de
modification du logiciel.
Parmi les acteurs majeurs dans cette activité on trouve les personnes suivantes :
• Responsable des mises en production : le responsable des mises en production
assure la coordination entre les différentes équipes et les unités commerciales afin de
garantir la mise en production d'un produit logiciel dans le délai imparti.
• Personnel chargé des opérations : le personnel chargé des opérations s'assure
que le système est livré comme promis. Cela peut consister à graver des DVD et à
les expédier à réception des commandes ou cela pourrait entraîner la gestion d'un
logiciel en tant que service (SaaS) sur une base continue. Le personnel chargé des
opérations est également chargé de publier des mises à jour système (par exemple, des
PRÊT POUR LA corrections de bogues ou de nouvelles fonctionnalités).
CERTIFICATION
Comprenez-vous la • Personnel du support technique : ces membres du personnel échangent avec les
gestion du cycle de vie clients et les aident à résoudre leurs problèmes avec le système. Le personnel du
des applications et ses support technique peut générer des indicateurs précieux sur les zones du système qui
activités ? sont plus difficiles pour les utilisateurs et qui doivent éventuellement être mises à
3.1 jour dans la prochaine version de l'application.
Tester un logiciel consiste à vérifier que le logiciel respecte les exigences fixées. Les
L'ESSENTIEL tests ont lieu une fois que la plupart des travaux de développement sont terminés.
Comme indiqué plus haut, les tests des logiciels consistent à vérifier qu'une application
logicielle fonctionne comme prévu et s'acquitte de toutes ses exigences opérationnelles
et techniques. Lorsqu'il y a une différence entre le comportement attendu et le
comportement réel du système, un défaut de logiciel (ou « bogue ») est consigné et
transmis à une personne qui est chargée de le résoudre.
Les tests des logiciels peuvent impliquer des essais fonctionnels et non fonctionnels.
Les tests fonctionnels concernent les exigences fonctionnelles du système, et testent
les éléments qui composent les fonctionnalités principales du système. Par exemple,
Présentation générale du développement logiciel | 69
v érifier si les utilisateurs peuvent ajouter des éléments dans un panier d'achat est un
élément important de tests fonctionnels pour un site Web de commerce électronique. En
comparaison, les tests non fonctionnels impliquent de tester des attributs logiciels qui ne
font pas partie des fonctionnalités de base mais plutôt des exigences non fonctionnelles du
logiciel (comme l'évolutivité, la facilité d'utilisation, la sécurité).
Il est important de noter que le processus de test de logiciels peut uniquement aider
à trouver des défauts, il ne garantit pas l'absence de défauts. Les logiciels complexes
*
REMARQUE ont un grand nombre de chemins d'exécution possibles et de nombreux paramètres
qui peuvent affecter leurs comportements. Il n'est pas faisable et souvent pas possible
de tester toutes les différentes situations que rencontreront ces logiciels dans un
environnement de production.
Les tests sont réalisés à différentes phases du cycle de vie de développement d'une
application. Les différents niveaux de tests spécifient à quel moment du cycle de vie
un test particulier a lieu, ainsi que le genre de test effectué.
Les niveaux de test sont définis selon le moment auquel le test a lieu dans le cycle de vie
du développement logiciel. Cinq niveaux distincts de tests existent :
• Test unitaire : un test unitaire vérifie la fonctionnalité d'une unité de code. Par exemple,
un test unitaire peut déterminer si une méthode retourne la valeur correcte. Un test
unitaire est un test de boîte blanche, et il est souvent fait par le développeur qui écrit
le code. Un test unitaire utilise souvent un outil automatisé qui peut simplifier le
développement de scénarios et aussi garder une trace afin de savoir si une modification
du code provoque l'échec des tests unitaires existants. Visual Studio a un support intégré
pour les tests unitaires. Vous pouvez également utiliser des outils open source tels que
NUnit pour automatiser les tests unitaires pour le code de .NET Framework.
• Test d'intégration : un test d'intégration évalue l'interface entre les composants log-
iciels. Un test d'intégration peut s'effectuer progressivement au fur et à mesure du
développement des composants ou il peut être effectué en une seule fois lorsque tous
70 | leçon 3
les composants sont prêts à travailler ensemble. La première approche est préférable
à la dernière car elle réduit les risques et augmente la confiance des parties prenantes
au fur et à mesure du développement du système. Un test d'intégration peut n éanmoins
impliquer de tester l'interaction entre le composant et un système externe. Par exemple,
si un composant s'appuie sur les données d'un service Web externe, le test d'intégration
garantit que le composant fonctionne bien avec l'application externe.
• Test du système : le test du système est le test global du système logiciel.
À ce stade, tous les composants du système sont développés et travaillent ensemble et
avec des systèmes externes.
• Test d'acceptation : ce niveau de test est souvent effectué par les clients eux-mêmes.
Il y a généralement deux niveaux de tests avant la large diffusion d'un produit : Tests
REMARQUE
* alpha et bêta. Le test Alpha est effectué par un petit groupe d'utilisateurs. Il permet
Il s'avère beaucoup plus de donner une idée du produit aux clients les plus importants et de recueillir des
rentable d'identifier commentaires. Les versions alpha peuvent ne pas inclure certaines fonctionnalités,
les défauts en amont, et de nombreux attributs non fonctionnels tels que les performances n'y figurent
durant le cycle de généralement pas. Pour le niveau de test suivant, à savoir le test bêta, le produit est
développement du distribué à un plus large public afin de recueillir davantage de commentaires. En
produit (plutôt qu'en fin termes de fonctionnalités, la version bêta du logiciel est très proche de la version
de processus). finale. Toutefois, il est possible que les équipes de développement continuent à
améliorer les performances et à corriger les défauts connus.
• Test de régression: à mesure que les défauts d'une application logicielle sont
PRÊT POUR LA identifiés et corrigés, il est important de vérifier que chaque nouveau correctif
CERTIFICATION n'affecte pas des fonctions précédemment opérationnelles. Dans ce cas de figure,
Comprenez-vous les le test de régression est particulièrement pratique. En général, après chaque nouveau
différentes méthodes correctif logiciel, les testeurs effectuent de nombreux tests de régression pour
de test de logiciels ? s'assurer que chaque fonctionnalité qui s'exécutait correctement au préalable continue
3.1
à fonctionner normalement.
Les structures de données sont des techniques utilisées pour classer et stocker les données
dans la mémoire d'un ordinateur. La manière dont les données sont stockées affecte la
L'ESSENTIEL manière dont les données sont récupérées et manipulées. Pour comprendre une structure de
données il faut non seulement comprendre le modèle de stockage, mais aussi savoir quelles
méthodes sont utilisées pour créer, accéder et manipuler la structure de données.
Un tableau est une structure de données commune qui représente une collection d'éléments
de type similaire. Les éléments d'un tableau sont stockés dans des emplacements mémoire
contigus. Un tableau est une structure de données homogènes, car tous les é léments sont
du même type de données. N'importe quel élément d'un tableau est accessible à l'aide d'un
index unique. Dans .NET Framework, les index de tableau sont de base zéro.
REPRÉSENTATION INTERNE
Dans le code suivant, la première instruction crée une variable tableau, et la seconde
instruction initialise la variable avec un tableau de quatre entiers :
int[] numbers;
numbers = new int[4];
Dans un premier temps, les nombres variables ont la valeur null, car le tableau n'est pas
encore initialisé. Toutefois, la deuxième instruction initialise le tableau en allouant un
espace de mémoire contigu assez grand pour stocker les quatre entiers dans le segment
de mémoire. L'adresse de départ dans l'allocation de mémoire est stockée dans la variable
tableau numbers, comme illustré dans la figure 3-2. Tous les éléments du tableau sont
initialisés dans ce cas avec la valeur 0 parce que 0 est la valeur par défaut pour un entier.
Figure 3-2
Pile Tas
Représentation interne d'une
structure de données de
int [] numbers; null
tableau
Les nombres variables agissent alors comme une référence à l'emplacement de mémoire
affecté au tableau. Le nom du tableau permet d'accéder directement à chacun des éléments
du tableau. Dans .NET Framework, tous les tableaux sont de base zéro, c'est-à-dire que
le premier élément du tableau est accessible à l'aide d'un index numbers[0], le deuxième
élément est accessible par numbers[1] et ainsi de suite.
Il est également possible d'avoir des tableaux multidimensionnels. Un tableau
bidimensionnel est semblable à un tableau dans lequel chaque cellule est un élément
de tableau et peut être référencée à l'aide du numéro de ligne et de colonne auxquelles
elle appartient. L'index du numéro de ligne et du numéro de colonne est de base zéro.
Par exemple, l'expression table[2, 3] renvoie à un élément de la troisième ligne et de la
quatrième colonne d'un tableau par la table name.
OPÉRATIONS COURANTES
Les tableaux prennent en charge les opérations suivantes :
• Allocation
• Accès
Pour utiliser un tableau, vous devez d'abord allouer la mémoire en créant et en initialisant
le tableau, comme indiqué précédemment. Une fois que le tableau est alloué, vous pouvez
accéder à n'importe quel élément du tableau dans un ordre quelconque directement par
son index. Par exemple, le code suivant affecte la valeur 10 au quatrième élément d'un
tableau, puis une valeur égale à deux fois cette valeur est affectée à la variable calc :
number[3] = 10;
int calc = number[3] * 2;
72 | leçon 3
PERFORMANCE ET UTILISATION
Le contenu d'un tableau est disposé dans un bloc contigu de mémoire et est accessible
directement en utilisant l'index de tableau. Ainsi, la lecture ou l'écriture dans un
tableau est extrêmement rapide. Toutefois, les tableaux sont limités par les exigences
d'homogénéité et de taille fixe. Bien que la taille du tableau puisse être augmentée, cela
nécessite de réaffecter tous les éléments du tableau et cette opération est longue.
Les tableaux fonctionnent mieux lorsque le nombre d'éléments dans la collection est
prédéterminé et qu'un accès rapide et direct à chaque élément est requis.
Dans .NET Framework, vous pouvez utiliser la classe ArrayList pour contourner les
exigences d'un tableau à des fins d'homogénéité et de taille fixe. La classe ArrayList est
un type de collection qui peut contenir des éléments de tout type de données et s'étendre
dynamiquement lorsque c'est nécessaire. Toutefois, une classe ArrayList n'est pas aussi
rapide qu'un tableau.
La structure de données de file d'attente imite une file d'attente de la vie réelle. Dans une
file d'attente, les éléments sont traités dans l'ordre dans lequel ils ont été ajoutés à la file
d'attente. Plus particulièrement, les éléments sont toujours ajoutés à la fin de la file
d'attente et supprimés du début de la file d'attente. Ce processus est connu sous le nom de
traitement « premier entré, premier sorti » (FIFO). La capacité d'une file d'attente est le
nombre d'éléments qu'elle peut contenir. Toutefois, à mesure que des éléments sont ajoutés
à la file d'attente, la capacité peut être automatiquement augmentée. Une file d'attente est
également une structure de données hétérogènes, ce qui signifie que les éléments dans une
file d'attente peuvent être de différents types de données.
REPRÉSENTATION INTERNE
Afin d'éviter une réaffectation excessive d'espace mémoire et permettre une gestion aisée,
une file d'attente est souvent implémentée en interne comme un tableau circulaire d'objets,
comme illustré dans la figure 3-3.
Figure 3-3 8 1
Représentation interne d'une Début
null null
structure de données de file
d'attente 7 2
null Élément 1
Élément 5 Élément 2
6 3
Élément 4 Élément 3
Fin
5 4
Dans une file d'attente, l'index principal pointe vers le premier élément et l'index de
queue pointe vers le dernier élément. Dans la figure 3-3, par exemple, l'index principal
pointe vers l'emplacement 2 sur la file d'attente. Comme la file d'attente est circulaire,
tant que vous pouvez garder une trace du pointeur principal et de queue, l'emplacement
de démarrage de la file d'attente importe peu. Lorsqu'un élément est supprimé, la tête se
Présentation générale du développement logiciel | 73
déplace vers l'élément suivant de la file d'attente. Lorsqu'un nouvel élément est ajouté,
REMARQUE
* il apparaît toujours à la fin de la file d'attente, et la queue commence à pointer vers le
Une version générique nouvel élément ajouté. Les créneaux de valeur null dans une file d'attente (y compris ceux
de la classe Queue représentés dans la figure 3-3) sont des espaces vides qui peuvent être remplis avant que
est disponible dans la file d'attente nécessite une réallocation de mémoire.
le cadre de l'espace
.NET Framework fournit une implémentation de la structure de données de file d'attente
de noms System.
dans le cadre de la classe Queue dans l'espace de noms System.Collections. Dans les
Collections.Generic.
langages de programmation qui ne fournissent pas d'implémentation d'une file d'attente,
Cette version générique
vous pouvez écrire votre propre classe Queue en utilisant une structure de données de type
est utilisée pour créer
tableau et en simulant les opérations de file d'attente.
une file d'attente des
éléments qui sont du
même type de données. OPÉRATIONS COURANTES
Une file d'attente prend en charge les opérations courantes suivantes :
• Enqueue : l'opération enqueue vérifie d'abord s'il y a suffisamment de capacité
disponible dans la file d'attente pour ajouter un autre élément. Si c'est le cas, l'élément
est ajouté à la queue de la file d'attente. Si ce n'est pas le cas, le tableau est réalloué
par un facteur de croissance prédéterminé et le nouvel élément est ensuite ajouté à la
file d'attente.
• Dequeue : l'opération dequeue supprime l'élément actuel à la tête de la file d'attente
et définit la tête pour qu'elle pointe vers l'élément suivant.
• Peek : l'opération peek permet d'accéder à l'élément qui se trouve actuellement au
début de la file d'attente, sans le supprimer.
• Contains : l'opération contains permet de déterminer si un élément spécifique existe
dans la file d'attente.
PERFORMANCE ET UTILISATION
Une file d'attente est une structure de données spéciale qui convient à une application dans
laquelle vous devez traiter des éléments dans l'ordre dans lequel ils ont été reçus. Parmi
des exemples on peut trouver des spouleurs d'impression, des systèmes de messagerie et
des planificateurs de tâches. Contrairement à un tableau, une file d'attente ne permet pas
un accès aléatoire aux éléments. Des opérations telles que enqueue et dequeue ajoutent et
suppriment en fait des éléments de la file d'attente.
Par opposition à une file d'attente, une pile est une structure de données de type dernier
entré, premier sorti (LIFO). Une pile est semblable à une pile d'assiettes sur une table :
la dernière assiette ajoutée est également la première retirée. La capacité d'une pile
désigne le nombre d'éléments qu'elle peut contenir. Toutefois, lorsque des éléments sont
ajoutés à une pile, la capacité de cette dernière est automatiquement augmentée. Une pile
est une structure de données hétérogènes, ce qui signifie que les éléments qu'elle contient
peuvent être de différents types de données.
REPRÉSENTATION INTERNE
Comme une file d'attente, une pile est souvent mise en œuvre comme un tampon circulaire
afin d'éviter une réaffectation excessive d'espace mémoire et permettre une gestion plus
facile. Une pile peut être visualisée à l'instar de la file d'attente illustrée dans la figure 3-3,
sauf que la queue s'appelle maintenant le haut de la pile et la tête s'appelle maintenant le
bas de la pile.
74 | leçon 3
Un nouvel élément est toujours ajouté en haut de la pile. Après l'ajout de l'élément, le haut
REMARQUE
* de la pile pointe vers le nouvel élément. Les éléments sont également supprimés à partir
Une version générique du haut de la pile. Le haut de la pile est alors modifié de manière à pointer vers l'élément
de la classe Stack suivant dans la pile.
est disponible dans
le cadre de l'espace .NET Framework fournit une implémentation de la structure de données de pile dans le
de noms System. cadre de la classe Stack dans l'espace de noms System.Collections. Dans les langages de
Collections.Generic. programmation qui ne fournissent pas d'implémentation de la pile, vous pouvez écrire
Cette version générique votre propre classe Stack en utilisant une structure de données de type tableau et en
est utilisée pour créer simulant les opérations de pile.
une pile des éléments
qui sont du même type OPÉRATIONS COURANTES
de données. Une pile prend en charge les opérations courantes suivantes :
• Push : l'opération push vérifie d'abord s'il y a suffisamment de capacité disponible
dans la pile pour ajouter un autre élément. Si la capacité est disponible, l'élément est
ajouté en haut de la pile. Si ce n'est pas le cas, le tableau est réalloué par un facteur de
croissance prédéterminée, et le nouvel élément est ensuite ajouté à la pile.
• Pop : l'opération pop supprime l'élément au sommet de la pile et définit le haut afin
qu'il pointe vers l'élément suivant de la pile.
• Peek : l'opération peek permet d'accéder à l'élément qui se trouve actuellement en
haut de la pile, sans le supprimer.
• Contains : l'opération contains permet de déterminer si un élément spécifique existe
dans la pile.
PERFORMANCE ET UTILISATION
Une pile est une structure de données spéciale qui convient aux applications dans lesquelles
vous devez traiter des éléments dans l'ordre du dernier entré, premier sorti. Une pile est
une structure utile en raison de ses applications dans la gestion de la mémoire d'exécution,
de l'évaluation de l'expression, du suivi des appels de méthode, etc. Contrairement à un
tableau, une file d'attente ne permet pas un accès aléatoire aux éléments. Des opérations
telles que push et pop ajoutent et suppriment des éléments de la pile.
Listes liées
Une liste liée est une collection de nœuds disposés de manière à ce que chaque nœud
contienne un lien vers le nœud suivant dans la séquence.
Une liste liée est une collection de nœuds dans laquelle chaque nœud contient une
référence (ou un lien) vers le nœud suivant dans la séquence. Contrairement à un tableau,
il n'est pas nécessaire que les éléments d'une liste liée soient contigus. Par conséquent,
aucune réaffectation d'espace de mémoire n'est requise pour l'ensemble de la liste liée en
cas d'ajout d'éléments.
REPRÉSENTATION INTERNE
En mémoire, une liste liée peut être visualisée comme une collection de nœuds, comme
illustré dans la figure 3-4.
Figure 3-4
A B C
Représentation interne d'une
structure de données de liste
liée simple Début Null
Présentation générale du développement logiciel | 75
Chaque nœud d'une liste liée contient deux éléments d'information : les données
correspondant au nœud et le lien vers le nœud suivant. Le premier nœud de la liste
s'appelle le nœud principal. À l'aide de ce lien dans le nœud principal, vous pouvez
accéder au nœud suivant et continuer à parcourir les nœuds, jusqu'à ce que le lien final
corresponde à une valeur null. Souvent, le terme queue est utilisé pour désigner la liste
pointée par le nœud principal (autrement dit, il se réfère à tout après le nœud principal).
Ainsi, dans la figure 3-4, la queue est la liste liée à partir du nœud B.
Plusieurs autres implémentations de listes liées peuvent également être utilisées selon les
besoins. Par exemple, dans une liste liée circulaire, le dernier nœud dans la liste pointe
vers le premier nœud pour créer un cercle. En revanche, dans une liste doublement liée,
chaque nœud contient deux liens, comme illustré dans la figure 3-5.
Figure 3-5 Null
Représentation interne d'une
A B C
structure de données de liste
doublement liée
Début Null
À chaque nœud d'une liste doublement liée, un lien est une référence vers l'avant qui
pointe vers le nœud suivant dans la séquence, et l'autre lien est une référence vers l'arrière
qui pointe vers le nœud précédent dans la séquence. Comme vous pouvez l'imaginer, une
liste doublement chaînée est facile à parcourir dans les deux sens.
.NET Framework fournit une classe LinkedList, dans le cadre de l'espace de noms
System.Collections.Generic. Cette classe implémente une liste doublement chaînée
homogène du type de données spécifié. Vous pouvez également écrire vos propres classes
pour implémenter un autre type d'implémentation de liste liée.
OPÉRATIONS COURANTES
Une liste liée prend en charge les opérations courantes suivantes :
• Add : l'ajout ou l'insertion d'un élément dans une liste liée implique la modification
des liens, comme illustré dans la figure 3-6. Imaginons que vous vouliez insérer un
nouveau nœud (avec la valeur Z) entre les nœuds avec des valeurs A et B. Vous devez
tout d'abord allouer de la mémoire pour le nouveau nœud et assigner la valeur Z à la
Figure 3-6
Z Nouveau nœud
Ajout d'un nœud à une
liste liée
A B C
Début Null
Z Nouveau nœud
A B C
Début Null
76 | leçon 3
section de données du nœud. Vous devez ensuite copier la section liens du nœud A
dans la section liens du nœud Z, ce nœud Z pointe donc vers le nœud B. Enfin, vous
devez copier l'adresse du nœud Z nouvellement créé dans la section liens du nœud A
afin que ce nœud A pointe vers le nœud Z.
• Remove : semblable à l'opération add, l'opération remove ou delete implique aussi la
modification des liens. Par exemple, pour supprimer le troisième nœud de la f igure
3-4, vous devez remplacer le lien du deuxième nœud par une valeur null. Le troisième
nœud sera désormais une pièce non référencée de la mémoire, et il sera par la suite
retourné au pool de mémoire disponible.
• Find : l'opération find recherche un nœud avec une valeur donnée dans la liste liée.
Pour trouver une valeur, vous démarrez en général à partir du nœud principal et
vous vérifiez si la valeur correspond. Sinon, vous suivez le lien vers le nœud suivant
et vous poursuivez l'opération find jusqu'à atteindre la fin de la liste, ce qui arrive
lorsque vous rencontrez un lien null.
PERFORMANCE ET UTILISATION
Une liste liée ne permet pas un accès aléatoire à ses éléments. La seule façon d'obtenir un
élément consiste à démarrer à partir du nœud principal et de suivre les liens à partir de là.
En conséquence, les listes liées sont lentes à récupérer des données. Toutefois, pour des
opérations insert et delete, les listes liées sont extrêmement rapides, car l'insertion ou la
suppression d'un nœud implique simplement de changer un lien. Les listes liées n'ont pas non
PRÊT POUR LA plus de seuil maximal de capacité qui implique de réaffecter le contenu une fois ce seuil atteint.
CERTIFICATION En fait, une liste liée fournit une autre manière de mettre en œuvre la file d'attente et les
Comprenez-vous les
structures de données de pile. Si vos exigences imposent un accès fréquent aux données,
structures de données
mais que vous deviez rarement insérer ou supprimer des données, un tableau est la
courantes ?
3.2
meilleure solution. Si, toutefois, vos exigences imposent des opérations insert et delete
fréquentes, une liste liée peut être une meilleure solution.
Les algorithmes de tri, tels que BubbleSort et QuickSort, placent les éléments d'une
liste dans un ordre donné. Le fait de comprendre les algorithmes de tri peut vous
L'ESSENTIEL
aider à comprendre, analyser et comparer les différentes méthodes de résolution des
problèmes.
Les algorithmes de tri sont des algorithmes qui placent les éléments d'une liste dans un
ordre donné. Par exemple, vous pouvez utiliser un algorithme de tri pour trier une liste
d'étudiants par ordre croissant de leur nom de famille. Au tout début du traitement des
données, le tri était un problème important qui a engendré beaucoup de recherches. De
nos jours, vous pouvez trouver des fonctions de tri basiques déjà intégrées dans des
structures de données et des bibliothèques plus populaires. Par exemple, dans .NET
Framework, vous pouvez utiliser la méthode Array.Sort pour trier un tableau. Toutefois,
il est toujours important de considérer le tri comme une façon de comprendre la résolution
des problèmes et l'analyse des algorithmes.
Dans cette section, vous allez découvrir deux algorithmes de tri courants, BubbleSort et
QuickSort.
Présentation de BubbleSort
L'algorithme BubbleSort utilise plusieurs opérations de comparaison et de
permutation pour classer les éléments d'une liste dans l'ordre approprié.
Présentation générale du développement logiciel | 77
BubbleSort compare deux éléments pour vérifier s'ils sont dans le bon ordre ; si ce
n'est pas le cas, il les permute. L'algorithme poursuit l'opération jusqu'à ce que tous les
éléments de la liste soient dans l'ordre requis. Le nom de l'algorithme BubbleSort vient
de la manière dont il fonctionne : À mesure que l'algorithme progresse, les plus petits
éléments remontent progressivement, tels des bulles d'air.
Nous allons visualiser BubbleSort à l'aide d'un exemple. Imaginons que vous souhaitiez
organiser tous les éléments de la liste ci-dessous dans l'ordre croissant : (20, 30, 10, 40).
Ces éléments doivent être disposés du plus petit au plus grand. L'algorithme BubbleSort
tente de résoudre ce problème dans un ou plusieurs passages (à chaque passage, la liste
des éléments est complètement analysée). Si l'algorithme rencontre des éléments qui
ne sont pas dans l'ordre, il en modifie l'ordre. L'algorithme se termine lorsqu'il scanne
l'ensemble de la liste sans modifier l'ordre des éléments. S'il n'y a aucune permutation,
alors tous les éléments sont dans le bon ordre et la liste est complètement triée.
Tableau 3-1
Premier passage de Étape Avant Après Commentaires
BubbleSort 1 20, 30, 10, 40 20, 30, 10, 40 L'algorithme compare les deux
remiers éléments (20 et 30). Comme
p
ils sont dans le bon ordre, aucune
permutation n'est nécessaire.
2 20, 30, 10, 40 20, 10, 30, 40 L'algorithme compare les deux
é léments suivants (30 et 10). Comme
ils ne sont pas dans le bon ordre, les
éléments sont permutés.
3 20, 10, 30, 40 20, 10, 30, 40 L'algorithme compare les deux
é léments suivants (30 et 40). Comme
ils sont dans le bon ordre, aucune
permutation n'est nécessaire.
Comme indiqué dans le tableau 3-1, à la fin du premier passage, BubbleSort a effectué
une permutation et il est possible que les éléments ne soient pas encore complètement
triés. Par conséquent, BubbleSort fait un deuxième passage dans la liste, comme illustré
dans le tableau 3-2.
Tableau 3-2
Deuxième passage de Étape Avant Après Commentaires
BubbleSort 1 20, 10, 30, 40 10, 20, 30, 40 L 'algorithme compare les deux
premiers éléments (20 et 10). Comme
ils ne sont pas dans le bon ordre, les
éléments sont permutés.
2 10, 20, 30, 40 10, 20, 30, 40 L 'algorithme compare les deux
éléments suivants (20 et 30). Comme
ils sont dans le bon ordre, aucune
permutation n'est nécessaire.
3 10, 20, 30, 40 10, 20, 30, 40 L 'algorithme compare les deux
éléments suivants (30 et 40). Comme
ils sont dans le bon ordre, aucune
permutation n'est nécessaire.
78 | leçon 3
Tableau 3-3
Troisième passage de Étape Avant Après Commentaires
BubbleSort 1 10, 20, 30, 40 10, 20, 30, 40 L 'algorithme compare les deux
premiers éléments (10 et 20). Comme
REMARQUE
* ils sont dans le bon ordre, aucune
Lorsque vous utilisez permutation n'est nécessaire.
BubbleSort, vous êtes
sûr que le nombre de 2 10, 20, 30, 40 10, 20, 30, 40 L 'algorithme compare les deux
passages nécessaires éléments suivants (20 et 30). Comme
pour trier le tableau est ils sont dans le bon ordre, aucune
inférieur au nombre permutation n'est nécessaire.
d'éléments. Donc, s'il 3 10, 20, 30, 40 10, 20, 30, 40 L 'algorithme compare les deux
y a quatre éléments éléments suivants (30 et 40). Comme
(comme dans le ils sont dans le bon ordre, aucune
scénario de l'exemple), permutation n'est nécessaire.
le tableau sera trié en
trois passages (peu
importe l'ordre dans
lequel il est au départ). À la fin du troisième passage, BubbleSort n'effectue plus de changement. Cela garantit
que la liste est maintenant triée et que l'algorithme peut se terminer.
En C#, l'algorithme BubbleSort peut être exprimé par la méthode suivante :
static int[] BubbleSort(int[] numbers)
{
bool swapped;
do
{
swapped = false;
for (int i = 0; i < numbers.Length − 1; i++)
{
if (numbers[i] > numbers[i + 1])
{
//swap
int temp = numbers[i + 1];
numbers[i + 1] = numbers[i];
numbers[i] = temp;
swapped = true;
}
}
} while (swapped == true);
return numbers;
}
Présentation générale du développement logiciel | 79
Présentation de QuickSort
L'algorithme QuickSort utilise des opérations de partitionnement et de comparaison
pour classer les éléments d'une liste dans l'ordre approprié.
L'algorithme QuickSort utilise la technique « diviser pour régner » pour partitionner une
liste jusqu'à ce que la taille du problème soit très petite et qu'un tri ne soit pratiquement
plus nécessaire. Les étapes suivantes expliquent ce processus plus en détail :
• Une liste de taille zéro ou un est toujours triée par elle-même.
• Pour une liste plus grande, vous devez choisir un élément quelconque dans la liste
comme un élément pivot. Vous devez ensuite partitionner la liste de telle sorte que
tous les éléments inférieurs ou égaux à l'élément pivot aillent dans la liste de gauche
et tous les éléments supérieurs à l'élément pivot aillent dans la liste de droite. À
présent, la combinaison de la liste de gauche, de l'élément pivot et de la liste de droite
est toujours dans l'ordre, si les listes de droite et de gauche sont dans l'ordre.
• Le problème est maintenant partitionné en deux plus petites listes, la liste de gauche
et la liste de droite.
• Ces deux listes sont résolues en utilisant la technique décrite ci-dessus.
• Enfin, toutes les petites listes triées sont fusionnées pour créer la liste triée complète
finale.
Le tableau suivant explique l'algorithme QuickSort à l'aide d'un petit exemple.
Tableau 3-4
Visualisation de Étape Données à trier Commentaires
QuickSort 1 50, 10, 30, 20, 40 Commencez par une liste non triée et
choisissez un élément pivot (30 dans ce cas).
2 20, 10 30 50, 40 Partitionnez la liste et placez les
éléments inférieurs à l'élément pivot
dans la liste de gauche et les éléments
supérieurs à l'élément pivot dans la
liste de droite. Ensuite, pour trier la
liste de gauche, choisissez un élément
pivot (ici, 10). De même, pour trier la
liste de droite, choisissez un élément
pivot (ici, 40) pour cette liste.
3 - 10 20 30 - 40 50 ans la liste de gauche, 20 est supérieur
D
à 10, et dans la liste de droite, 50 est
supérieure à 40. Par conséquent, 20
et 50 vont dans la liste de droite. Cela
donne des listes d'un seul numéro, qui
sont toutes triées par définition.
4 10, 20, 30, 40, 50 Toutes les petites listes triées sont
fusionnées pour créer la liste triée
complète finale.
Jusqu'ici, la principale lacune de l'algorithme QuickSort semble être la mémoire
supplémentaire requise par la création de listes distinctes plus petites. Cependant, il n'est
pas nécessaire de créer des listes séparées. En utilisant une technique légèrement différente,
le tableau peut être partitionné tel quel, comme le montre la liste de code suivante :
static int Partition (int[] numbers, int left,
int right, int pivotIndex)
80 | leçon 3
{
int pivotValue = numbers[pivotIndex];
// move pivot element to the end
int temp = numbers[right];
numbers[right] = numbers[pivotIndex];
numbers[pivotIndex] = temp;
// newPivot stores the index of the first
// number bigger than pivot
int newPivot = left;
for (int i = left; i < right; i++)
{
if (numbers[i] <= pivotValue)
{
temp = numbers[newPivot];
numbers[newPivot] = numbers[i];
numbers[i] = temp;
newPivot++;
}
}
//move pivot element to its sorted position
temp = numbers[right];
numbers[right] = numbers[newPivot];
numbers[newPivot] = temp;
return newPivot;
}
Avec cette technique, l'élément pivot est tout d'abord déplacé à la fin du tableau. Ensuite,
tous les éléments inférieurs ou égaux à l'élément pivot sont déplacés au début du tableau.
Enfin, l'élément pivot est placé juste avant l'élément supérieur à lui-même, ce qui
partitionne efficacement le tableau.
Cet algorithme de partitionnement peut ensuite être utilisé par QuickSort pour partitionner
la liste, pour réduire le problème à des problèmes plus petits, et pour le résoudre de
manière récursive :
static int[] QuickSort(int[] numbers,
int left, int right)
{
if (right > left)
{
int pivotIndex = left + (right − left) / 2;
//partition the array
pivotIndex = Partition(
numbers, left, right, pivotIndex);
//sort the left partition
QuickSort(
Présentation générale du développement logiciel | 81
4. Un/une ______ est une collection d'éléments dans laquelle le dernier élément ajouté à
la collection est le premier élément supprimé.
5. L'___ est le processus qui consiste à déterminer les exigences commerciales précises
pour un nouveau système logiciel.
6. Une liste liée est une collection de nœuds disposés de manière à ce que chaque nœud
contienne un/une ____ vers le nœud suivant dans la séquence.
7. L'opération ______ ajoute un élément à la file d'attente, tandis que l'opération ______
retire un élément de la file d'attente.
8. L'algorithme QuickSort utilise des opérations de ______ et de comparaison pour
classer les éléments d'une liste dans l'ordre approprié.
9. Un/une ______ est chargé(e) d'analyser les besoins de l'entreprise et de les convertir
en exigences pouvant être mises en œuvre par l'équipe de développement.
10. Les tests alpha et bêta font partie du test d'______ d'un système.
6. Vous développez un programme qui exige le suivi des appels de méthode. Vous ne
pouvez appeler qu'une seule méthode à la fois. Toutefois, un appel de méthode peut
à son tour appeler d'autres méthodes. À la fin d'une méthode, celle-ci renvoie le
contrôle à la méthode d'appel. Quelle structure de données devez-vous utiliser pour
assurer le suivi de ces appels de méthode ?
a. File d'attente
b. Tableau
c. Liste liée
d. Pile
7. Vous développez un programme qui simule un processeur de travail. Les travaux
arrivent souvent plus rapidement qu'il n'est possible de les traiter et, dans ce cas, ils
attendent leur tour avant d'être traités. Vous devez vous assurer que le travail arrivé
le premier est également le premier travail traité. Parmi les structures de données
suivantes, laquelle convient le mieux pour cette exigence ?
a. Tableau
b. File d'attente
c. Liste liée
d. Pile
8. Vous écrivez le code suivant dans un programme :
int[] numbers = {2, 3, 1, 4};
numbers[2] = 4;
Quel sera le contenu du tableau après l'exécution de la seconde instruction ?
a. {2, 4, 1, 4}
b. {2, 3, 4, 4}
c. {2, 4, 1, 2}
d. {4, 3, 1, 4}
9. Vous développez un programme qui exécute de nombreuses opérations d'insertion
et de suppression dans les données. Votre programme requiert également qu'il soit
possible d'accéder à l'enregistrement précédent ou suivant lorsque l'utilisateur appuie
sur le bouton Précédent ou Suivant. Parmi les structures de données suivantes,
laquelle convient le mieux pour cette exigence ?
a. Tableau
b. Liste liée circulaire
c. Liste liée
d. Liste doublement liée
10. Vous développez un programme qui exécute de nombreuses opérations d'insertion
et de suppression dans les données. À l'instar d'une pile, les éléments de données
doivent être accessibles, avec la fonctionnalité « dernier entré, premier sorti ».
Votre solution doit utiliser aussi peu de mémoire que possible. Parmi les structures
de données suivantes, laquelle convient le mieux pour cette exigence ?
a. Tableau
b. Liste liée circulaire
c. Liste liée
d. Liste doublement liée
■ Évaluation de la maîtrise
Scénario 3-3 : Utilisation des piles
Vous écrivez un programme qui utilise deux piles. Les données figurant dans chaque pile
sont déjà classées par ordre décroissant. Vous devez traiter le contenu des deux piles de
manière à ce que la sortie affichée à l'écran soit classée par ordre croissant. Comment
allez-vous écrire ce programme ?
TERMES CLÉS
feuilles de style en cascade (CSS) JavaScript répertoire virtuel
programmation côté client protocole SOAP (Simple Object hébergement Web
gestion d'état côté client Access Protocol) services Web
HTML (Hypertext Markup programmation côté serveur WSDL (Web Services Description
Language) gestion d'état côté serveur Language)
Internet Information gestion d'état site Web
Services (IIS)
Vous êtes développeur de logiciels pour une grande entreprise. Vous devez développer
une application qui peut être utilisée sur un réseau tel que le World Wide Web.
L'application sera déployée sur un serveur Web Windows, mais les utilisateurs de
l'application utiliseront plusieurs systèmes d'exploitation et navigateurs Web.
Une page Web est un document transmis sur le World Wide Web (WWW) et qui
peut être affiché par un navigateur Web. Les pages Web sont développées à l'aide du
L'ESSENTIEL
langage HTML (Hypertext Markup Language) et sont stockées sur un serveur Web.
Les navigateurs Web téléchargent le code HTML requis à partir du serveur Web et le
restituent sur l'écran de l'utilisateur.
85
86 | Leçon 4
Les termes « Internet » et « le Web » sont souvent utilisés de façon interchangeable,
mais ils sont en fait distincts et il ne faut pas les confondre. Internet est un système
*
REMARQUE mondial de communication de données qui assure la connectivité entre des ordinateurs.
En revanche, le Web est un des services disponibles sur Internet et qui permet aux
utilisateurs d'accéder à des ressources contenant des liens hypertexte.
Le langage utilisé par le serveur Web et le navigateur Web pour décrire une page Web
est le langage HTML (Hypertext Markup Language). HTML est un langage basé sur du
texte, qui utilise différentes balises pour décrire l'affichage du contenu. HTML permet de
référencer des images, des vidéos et d'autres objets dans un fichier pour créer des pages
Web multimédias. Le langage HTML peut également incorporer des scripts (tels que
JavaScript) qui affectent le comportement des pages Web. Il peut, en outre, être utilisé
pour inclure des feuilles de style en cascade (CSS) afin de définir la mise en forme et la
disposition du contenu d'une page. Le navigateur Web lit le code HTML et restitue les
résultats à l'écran.
Une page Web peut contenir des liens hypertexte vers d'autres ressources, telles que
des images et des vidéos. Chacune de ces ressources est identifiée par sa propre URL.
Par conséquent, afin de restituer totalement une page, le navigateur effectuera des
requêtes HTTP supplémentaires pour obtenir ces ressources et les afficher en tant que
partie de la page Web.
Dans les sections suivantes, vous allez découvrir plus en détail les différents composants
qui constituent une page Web, notamment HTML, CSS et JavaScript.
HTML (Hypertext Markup Language) est le langage utilisé par les navigateurs et les
serveurs Web pour décrire une page Web.
L'objectif du langage HTML est de fournir un langage standard pour décrire des pages
Web afin que les différents navigateurs Web puissent comprendre ce langage et afficher
la page correspondante. HTML est un langage basé sur du texte, ce qui signifie que vous
pouvez écrire et modifier des pages HTML à l'aide de n'importe quel éditeur de texte.
Lorsque du code HTML est envoyé à un navigateur Web, le texte complet de la page
est envoyé. En fait, la plupart des navigateurs vous permettent d'afficher le code source
HTML d'une page Web.
Présentation des applications Web | 87
Cette leçon ne traite pas de tous les éléments HTML. Pour en savoir plus sur ces
*
REMARQUE
éléments, recherchez « éléments HTML » sur MSDN.
UTILISER HTML
<body>
<h1>Mimas photographié par la sonde Cassini</h1>
La balise img permet d'afficher l'image d'une
<a href="http://en.wikipedia.org/wiki/Mimas_(moon)">
Lune de Saturne</a> : <br />
<img height="400px" width="400px"
alt="Mimas photographié par la sonde Cassini"
src="http://goo.gl/3BeK"/>
</body>
</html>
4. Sélectionnez Débogage > Démarrer le débogage (ou appuyez sur F5). La page default.
htm s'ouvre dans un navigateur Web. Le résultat doit ressembler à la figure 4-1, où
vous pouvez voir les balises <img> et <a> en action.
Figure 4-1
Une page HTML simple qui
contient une image et un lien
hypertexte
Les feuilles de style en cascade (CSS) vous permettent de stocker les informations
de style et de mise en forme d'une page Web séparément du code HTML. Cette
séparation facilite la mise à jour de l'aspect de votre site Web. Visual Studio inclut
des outils permettant de créer vos feuilles de style et d'en afficher un aperçu.
CSS est un langage qui décrit les informations relatives à l'affichage d'une page Web.
Lors du rendu de pages Web dans un navigateur, le code HTML spécifie ce qui s'affiche,
et les feuilles de style en cascade (CSS) indiquent comment ces éléments seront affichés.
Par exemple, le code HTML peut spécifier que votre document comporte un titre H1 avec
un texte donné, et le code CSS peut spécifier la police et la couleur qui seront appliquées
à ce titre.
CSS permet de séparer la disposition d'une page Web de son contenu. Cette séparation
vous permet de changer l'un sans affecter l'autre. Associer le contenu et le style réduit
la facilité de maintenabilité d'un site Web. Supposons, par exemple, que vous souhaitiez
modifier la couleur et la police de tous les titres H1 sur votre site Web. Une approche
consiste à ouvrir un éditeur HTML et à modifier chaque fichier sur le site Web qui
utilise la balise H1. Cela peut être une solution acceptable si le site Web ne comprend
Présentation des applications Web | 89
qu'une ou deux pages, mais que se passe-t-il si le site comprend un grand nombre de
pages, par exemple 50 ou 100 ? Imaginez ce que représente la modification manuelle
de chaque page ! Si ces changements doivent être effectués régulièrement, le processus
de développement Web sera ennuyeux et susceptible de générer des erreurs. Après tout,
comment pouvez-vous garantir que vous n'avez laissé passer aucune balise H1 ?
REMARQUE
* Heureusement, avec CSS, vous pouvez placer toutes ces informations de style dans
Quand elles sont
un fichier distinct et connecter ce fichier à toutes les pages d'un site Web. Ensuite,
utilisées de manière
une fois que le fichier CSS est configuré, vous pouvez modifier n'importe quel style
pertinente, les feuilles
(par exemple, la couleur et la police des titres H1) en changeant simplement ce style dans
de style en cascade sont
le fichier CSS : cette modification unique affectera toutes les pages du site Web.
un excellent outil pour
accroître la cohérence
et la maintenabilité CONCEPTION DE FEUILLES DE STYLE EN CASCADE
à l'échelle du site. Le langage CSS, qui est basé sur du texte, est facile à lire et à comprendre. Voici un exemple
de page HTML qui définit des styles CSS :
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Présentation de CSS</title>
<style type="text/css">
body
{
font-family: Verdana;
font-size: 9pt;
}
div
{
color:Red;
}
.block
{
background-color: Yellow;
border-color: Blue;
border-width: thin;
border-style: outset;
font-family: Arial;
}
</style>
</head>
<body>
Exemple de corps de texte <br />
<div>Exemple de texte DIV</div>
<div class="block">Exemple de texte DIV
avec la classe block</div>
<span class="block">Exemple de texte SPAN
avec la classe block</span>
</body>
</html>
90 | Leçon 4
Notez que les définitions CSS doivent être incluses dans l'élément <style> et qu'elles sont
définies sous l'élément <head>. Ce code CSS particulier définit deux styles d'élément et
un style de classe. Le premier style s'applique à l'élément body HTML et spécifie que tout
le texte de l'élément body doit utiliser la police Verdana avec la taille de police 9 points.
Le deuxième style d'élément spécifie que le texte placé dans l'élément DIV doit être écrit
en rouge. Enfin, une classe nommée « block » est définie. Les définitions de classes CSS
sont précédées d'un point (« . »). Le contenu de tout élément HTML qui utilise ces classes
s'affiche avec un arrière-plan jaune et une bordure. Lorsque vous affichez cette page
particulière dans un navigateur, elle doit apparaître comme illustré à la figure 4-2.
Figure 4-2
Mise en forme du code
HTML avec des feuilles de
style en cascade
Dans la figure, remarquez que le texte en surbrillance s'affiche comme résultat de la classe
block. Toutefois, la classe CSS block ne spécifie pas la couleur du texte. Dans la première
ligne de texte en surbrillance, la classe block est appliquée à l'élément DIV ; dans la
deuxième ligne du texte en surbrillance, elle est appliquée à l'élément SPAN. Dans le
premier cas, étant donné que la classe block est appliquée à un texte DIV, le style de
couleur de l'élément DIV est reporté dans le rendu final.
Dans l'exemple précédent, le fichier CSS a été écrit à l'intérieur du fichier HTML.
Une approche plus utile consiste à écrire le code CSS dans son propre fichier distinct,
puis à lier le fichier HTML à ce fichier CSS. Vous allez apprendre à le faire dans
l'exercice suivant.
.block
{
background-color: Yellow;
border-color: Blue;
border-width: thin;
border-style: outset;
font-family: Arial;
}
3. Sélectionnez Projet > Ajouter un nouvel élément, puis sélectionnez le modèle
Page HTML. Nommez le fichier default.htm. Remplacez le code par défaut du fichier
par le code suivant :
<!DOCTYPE html PUBLIC
"–//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1–
transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="STYLESHEET"
type="text/css" href="styles.css" />
<title>Understanding CSS</title>
</head>
<body>
Exemple de corps de texte <br />
<div>Exemple de texte DIV</div>
<div class="block">Exemple de texte DIV
avec la classe bloc</div>
<span class="block">Exemple de texte SPAN
avec la classe bloc</span>
</body>
REMARQUE
* </html>
Quand les feuilles
de style en cascade 4. Sélectionnez Déboguer > Démarrer le débogage (ou appuyez sur F5). La page default.
sont stockées dans htm s'ouvre dans un navigateur Web, et le résultat doit ressembler à la figure 4-2
des fichiers distincts, (présentée précédemment).
le navigateur de
l'utilisateur télécharge Comme indiqué dans l'exercice exemple, l'élément HTML <link> est utilisé pour lier un
et stocke ces fichier CSS à une page HTML :
fichiers localement. <link rel="STYLESHEET"
Par conséquent, ils
peuvent être utilisés sur type="text/css" href="styles.css" />
plusieurs pages sans L'élément <link> est toujours placé dans l'élément <head>, et l'attribut href spécifie
qu'il soit nécessaire l'adresse du fichier CSS à utiliser. Pour lier plusieurs pages au même fichier CSS, vous
de les télécharger
à nouveau. Cela réduit devez mettre l'élément <link> dans chaque page HTML.
le transfert de données Visual Studio inclut un concepteur de style intégré qui peut vous aider à concevoir de
inutiles. nouveaux styles CSS ou à modifier des styles existants. Lorsque vous ouvrez un fichier .
css, vous voyez un nouveau menu nommé Styles. Ce menu vous permet de créer un
nouveau style en sélectionnant Styles > Ajouter une règle de style. Vous pouvez également
modifier le style actuellement sélectionné en choisissant l'option Styles > Créer un style.
Cette option ouvre la boîte de dialogue Modifier le style, comme illustré à la figure 4-3.
92 | Leçon 4
Figure 4-3
La boîte de dialogue Modifier
le style
Présentation de JavaScript
JavaScript est un langage de script côté client qui s'exécute à l'intérieur des
navigateurs Web pour créer des pages Web beaucoup plus interactives que ce qui est
possible en HTML seul. JavaScript est utilisé dans des millions de pages Web et est
pris en charge par tous les navigateurs Web modernes.
JavaScript est utilisé pour rendre les sites Web plus réactifs et les pages Web plus
interactives. Pour ce faire, JavaScript exécute le code côté client (dans le navigateur Web)
et diminue le nombre d'allers-retours inutiles vers et à partir du serveur Web. Prenons un
exemple dans lequel un utilisateur a besoin d'entrer des données personnelles sur une page
Web, telles que son nom, son adresse e-mail et son numéro de téléphone. Effectuer une
validation des données pour s'assurer que les champs d'entrée ne sont pas vides et que
l'adresse e-mail et le numéro de téléphone de l'utilisateur ont été fournis sous la forme
requise constitue une exigence courante. Sans JavaScript, il serait nécessaire d'envoyer
le formulaire au serveur, qui effectue une validation des données et retourne les résultats
au client. Cette transmission d'informations prend du temps et dégrade l'expérience
utilisateur. Toutefois, une solution JavaScript peut effectuer ce type de validation des
données depuis le navigateur, ce qui offre une meilleure expérience utilisateur.
Comme indiqué précédemment, le code JavaScript s'exécute localement dans le navigateur
Web (le client), plutôt que sur le serveur Web. Par conséquent, JavaScript est parfois
également appelé « langage de script côté client », et la programmation avec JavaScript
est appelée « programmation côté client ».
Le comportement de l'exécution du code côté client au moment de l'exécution dépend du
navigateur qui l'exécute. Toutefois, ce comportement est indépendant de la technologie
du serveur ou de l'infrastructure de programmation. Ainsi, pour le code JavaScript qui
est exécuté dans un navigateur Web, il importe peu que la page Web ait été générée par
ASP.NET ou par PHP, ou que la page soit transmise par un serveur Web Windows ou un
serveur Web Linux.
JavaScript et le langage de programmation C# utilisent tous les deux une syntaxe influencée
par le langage de programmation C. Pourtant, JavaScript et C# sont très différents dans la
façon dont ils sont exécutés. En particulier, JavaScript est exécuté par le navigateur Web,
et le code JavaScript est interprété et non pas compilé, comme dans le cas de C#.
Présentation des applications Web | 93
Beaucoup de sites Web modernes offrent une expérience hautement interactive qui
rivalise avec celle des applications de bureau. Ces sites peuvent être développés à l'aide
de la programmation Ajax. Ajax est l'abréviation de « Asynchronous JavaScript and
*
REMARQUE
XML ». Ajax utilise JavaScript de manière intensive afin de fournir des applications
Web réactives. L'infrastructure AJAX ASP.NET vous permet d'implémenter la
fonctionnalité Ajax sur les pages Web ASP.NET.
Tout le code JavaScript doit être placé à l'intérieur de l'élément <script>. L'élément
<script> est généralement placé à l'intérieur de l'élément <head>, même si ce n'est pas
obligatoire. Plusieurs éléments <script> peuvent exister dans une seule et même page.
Pour voir JavaScript en action, essayez l'exercice suivant.
UTILISER JAVASCRIPT
3. Sélectionnez Déboguer > Démarrer le débogage (ou appuyez sur F5). La page default.
htm s'ouvre dans un navigateur Web. Notez que le code JavaScript vous invite à entrer
votre nom. Une fois que vous avez effectué cette opération, une boîte de dialogue
affiche un message basé sur la longueur de votre nom, comme illustré aux figures 4-4
et 4-5.
Figure 4-4
Invite utilisateur JavaScript
Figure 4-5
Boîte de dialogue JavaScript
Comme avec les fichiers CSS, vous pouvez également placer votre code JavaScript dans
un fichier distinct et lier ce fichier à un fichier HTML à l'aide de l'élément script, comme
indiqué ci-dessous :
<script src="SampleScript.js">
</script>
Ici, le fichier SampleScript.js contient tout le code JavaScript, et l'élément script établit un
lien à ce fichier à l'aide de l'attribut src. Le stockage de code JavaScript dans des fichiers
externes présente de nombreux avantages :
REMARQUE
*
Bien que tous les • Facilité de maintenabilité : si vous utilisez le même code JavaScript sur chaque page
navigateurs modernes d'un site Web, vous pouvez stocker le code sur une page centrale, au lieu de le répéter
prennent en charge sur chaque page. Ainsi, quand le code JavaScript doit être modifié, vous n'avez à le
JavaScript, ils peuvent changer qu'à un seul endroit.
être configurés pour • Performances améliorées : le stockage de code JavaScript dans un fichier distinct
que JavaScript soit permet de réduire la taille d'une page Web. De plus, les navigateurs peuvent
désactivé. Vous télécharger et mettre en cache le fichier JavaScript externe pour qu'il ne soit
à nouveau téléchargé que s'il est modifié.
pouvez utiliser un
élément <noscript> Visual Studio inclut la prise en charge IntelliSense complète du code JavaScript. Même
pour afficher un les contrôles ASP.NET, tels que le contrôle TreeView ou les contrôles de validation,
message spécifique utilisent JavaScript lorsque c'est possible pour restituer du contenu de façon dynamique.
aux utilisateurs qui
choisissent de ne pas
exécuter JavaScript. Présentation de la programmation côté client et de la programmation côté
serveur
Le fait qu'un programme soit côté client ou côté serveur dépend de l'endroit où le
programme est exécuté au final.
ASP.NET est la partie du .NET Framework qui vous permet de développer des
formulaires Web et des services Web programmables. Comme avec n'importe quelle
L'ESSENTIEL application .NET Framework, vous pouvez développer des applications ASP.NET
dans tout langage compatible avec le Common Language Runtime .NET, notamment
Visual Basic et C#.
Figure 4-6
Communication entre un
client et un serveur Web
96 | Leçon 4
En tant que développeur, vous devez savoir ce qui se passe en coulisses lorsqu'un serveur Web
exécute une requête pour une page ASP.NET. Les étapes suivantes décrivent ce processus :
1. Lorsque les services Internet Information Services (IIS) reçoivent une requête HTTP,
ils utilisent l'extension de nom de fichier pour déterminer quel programme ISAPI
(Internet Server Application Programming Interface) exécuter pour traiter la requête.
Lorsque la requête porte sur une page ASP.NET, ils transmettent la demande à la
DLL ISAPI capable de gérer les requêtes pour des pages ASP.NET, à savoir la DLL
aspnet_isapi.dll.
2. Le processus aspnet_isapi.dll transmet la requête au processus de travail ASP.NET
(aspnet_wp.exe), qui traite la requête.
3. Le processus de travail ASP.NET compile le fichier .aspx en un assembly qu'il
demande au CLR (Common Language Runtime) d'exécuter.
4. Lorsque l'assembly s'exécute, il prend les services de différentes classes de la
bibliothèque de classes .NET Framework pour exécuter sa tâche et générer les
messages de réponse à l'attention du client demandeur.
5. Le processus de travail ASP.NET recueille les réponses générées par l'exécution de
la page Web, crée un paquet de réponse et le passe au processus aspnet_isapi.dll.
6. Aspnet_isapi.dll transmet le paquet de réponse à IIS qui, à son tour, transmet la
réponse à l'ordinateur client demandeur.
Avant l'exécution, chaque page ASP.NET est convertie en classe. Cette classe dérive la
plupart de ses fonctionnalités de la classe System.Web.UI.Page. La classe Page fournit
plusieurs propriétés importantes, comme Request, Response, Session et Server.
Lorsqu'une page s'exécute, elle passe par différentes phases de traitement. La page
déclenche également quelques événements auxquels vous pouvez attacher un gestionnaire
d'événements pour exécuter du code personnalisé à différentes phases de traitement de la
page. En fait, les développeurs ASP.NET doivent bien comprendre le cycle de vie de la
page afin de pouvoir écrire du code qui est exécuté exactement lors de la phase souhaitée
du traitement de la page.
Le tableau 4.1 répertorie les différentes étapes du cycle de vie et les événements qui leurs
sont associés.
Dans un formulaire de contact classique, vous entrez des informations et vous appuyez
sur un bouton d'envoi. Lorsque vous soumettez cette page, elle peut traiter les données
envoyées pour entreprendre une action, telle que le stockage des informations dans
une base de données ou l'envoi d'un courrier électronique. Dans de nombreux cas, la
page initiale s'affiche à nouveau avec une confirmation de l'envoi du formulaire. Une
*
REMARQUE
publication (postback) se produit lorsque les informations sont publiées sur la même
page Web pour être traitées. Une publication (postback) est différente de la charge
initiale de la page, car la page reçoit des informations supplémentaires (telles que des
données de formulaire) dans le cadre de la publication (postback).
Présentation des applications Web | 97
Tableau 4-1
Phases importantes du cycle de vie d'une page ASP.NET
Lorsque vous souhaitez gérer un événement, vous devez écrire avec l'événement du
code qui inscrit une méthode pour gérer l'événement (également appelé « gestionnaire
d'événements »). Cette opération s'effectue généralement à l'aide du modèle d'inscription
d'événement courant utilisé dans l'ensemble du .NET Framework :
objet.événement += new EventHandler(gestionnaire_événements);
Ici, remplacez objet par le nom de l'objet qui expose l'événement, événement par le nom de
l'événement et gestionnaire_événements par le nom de la méthode qui gère l'événement.
Notez, cependant, qu'ASP.NET fournit six méthodes spéciales reconnues comme
gestionnaires d'événements par défaut et qui ne nécessitent pas le code d'inscription
mentionné ci-dessus. Ce sont les méthodes spécifiquement nommées Page_Init, Page_
Load, Page_DataBind, Page_PreRender et Page_Unload. Ces méthodes sont traitées
comme des gestionnaires d'événements pour les événements correspondants exposés par
la classe Page. Cette association automatique d'événements est contrôlée par l'attribut
AutoEventWireup de la directive @Page. Par défaut, la valeur de cet attribut est true, ce
qui signifie que ces méthodes spécifiquement nommées sont automatiquement associées
à leurs événements correspondants.
98 | Leçon 4
PRÉPAREZ-VOUS. Pour voir comment les différents événements de la classe Page sont
exécutés, effectuez les actions suivantes :
1. Créez un projet basé sur le modèle Application Web ASP.NET vide à la solution Lesson04.
Nommez le projet PageEvents.
2. Sélectionnez Projet > Ajouter un nouvel élément. Sélectionnez le modèle Formulaire
Web. Nommez le fichier WebForm1.aspx.
3. Dans les balises HTML de la page (WebForm1.aspx), assurez-vous que l'attribut
AutoEventWireup de la directive @Page a la valeur true :
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="WebForm1.aspx.cs"
Inherits="PageEvents.WebForm1" %>
4. Cliquez avec le bouton droit dans la fenêtre de code, puis sélectionnez Afficher le code
dans le menu contextuel pour basculer en mode Code. Remplacez le code contenu
dans le fichier code-behind (WebForm1.aspx.cs) par ce qui suit :
using System;
namespace PageEvents
{
public partial class WebForm1
: System.Web.UI.Page
{
protected void Page_Load
(object sender, EventArgs e)
{
Response.Write
("Message from Page_Load. <br/>");
}
protected void Page_Init
(object sender, EventArgs e)
{
Response.Write
("Message from Page_Init. <br/>");
}
protected void Page_PreRender
(object sender, EventArgs e)
{
Response.Write
("Message from Page_PreRender. <br/>");
}
protected void Page_PreInit
(object sender, EventArgs e)
{
Response.Write
("Message from Page_PreInit. <br/>");
}
}
}
Présentation des applications Web | 99
5. Sélectionnez Déboguer > Démarrer le débogage (ou appuyez sur F5). La page default.
htm s'ouvre dans un navigateur Web, comme illustré à la figure 4-7.
Figure 4-7
Formulaire Web affichant
l'ordre de l'exécution des
événements pour une page
ASP.NET
Dans l'exemple d'exercice, notez que les caractères <% et %> sont utilisés pour incorporer
des blocs de code dans les balises HTML d'une page. Le code situé à l'intérieur de ces
blocs incorporés est exécuté au cours de la phase de rendu de la page. Dans les blocs de
code incorporés, la syntaxe <%=expression> est utilisée pour résoudre une expression et
retourner sa valeur dans le bloc. Prenons, par exemple, le bloc de code suivant :
<i><% = DateTime.Now.ToShortDateString() %></i>
Lorsqu'il est exécuté, ce code affiche la date actuelle en italique :
12/01/2010
La directive @Page spécifie plusieurs attributs qui contrôlent la façon dont ASP.NET
effectue le rendu d'une page. Par exemple, dans cet exercice, les attributs de la directive
@Page spécifient les point suivants :
• C# est le langage de programmation pour cette page Web (Language="C#")
• Les événements de la page sont automatiquement associés (AutoEventWireup=true)
• Le nom du fichier de code qui contient la classe associée à la page
(CodeBehind="WebForm1.aspx.cs")
• Le nom de classe pour la page à hériter (Inherits="PageEvents.WebForm1")
La gestion d'état est le processus de gestion de l'état d'une page Web au cours des
allers-retours. Les valeurs des variables et des contrôles constituent collectivement l'état
d'une page Web.
ASP.NET offre plusieurs techniques pour conserver les informations d'état au travers
des publications (postbacks) de la page. D'une façon générale, ces techniques peuvent
être classées dans la catégorie « côté client » ou « côté serveur », selon l'endroit où les
ressources sont utilisées.
100 | Leçon 4
L'état de session peut être configuré pour le stockage sur un autre serveur ou sur un
serveur SQL. Cela s'avère utile lorsque la demande de l'utilisateur peut être traitée par
l'un des nombreux serveurs d'une batterie de serveurs Web. Une batterie de serveurs
*
REMARQUE
Web est une collection de serveurs Web utilisés collectivement pour traiter un site Web.
Les batteries de serveurs Web sont nécessaires pour prendre en charge le trafic sur les
sites Web populaires.
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server"
Text="Please enter your name:" /><br />
<asp:TextBox ID="TextBox1" runat="server" />
<br /><br />
<asp:Button ID="Button1" runat="server"
Text="Submit" onclick="Button1_Click" />
</div>
</form>
</body>
</html>
4. Cliquez avec le bouton droit dans la fenêtre de code, puis sélectionnez Afficher le
code dans le menu contextuel pour basculer vers le fichier code-behind (WebForm1.
aspx.cs). Remplacez le code contenu dans ce fichier par ce qui suit :
using System;
namespace UsingSessionState
{
public partial class WebForm1
: System.Web.UI.Page
{
protected void Page_Load
(object sender, EventArgs e)
{
if (Session["Name"] != null)
Response.Redirect("WebForm2.aspx");
}
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" /> <br />
<asp:Button ID="Button1" runat="server"
Text="Clear Session"
onclick="Button1_Click" />
</div>
</form>
</body>
</html>
6. Modifiez le code contenu dans le fichier code-behind (WebForm2.aspx.cs) du formulaire
afin qu'il s'affiche comme suit :
using System;
namespace UsingSessionState
{
public partial class WebForm2
: System.Web.UI.Page
{
protected void Page_Load(
object sender, EventArgs e)
{
if (Session["Name"] != null)
Label1.Text = String.Format(
"Welcome, {0}", Session["Nom"]);
else
Response.Redirect("WebForm1.aspx");
}
protected void Button1_Click(
object sender, EventArgs e)
{
Session.Remove("Nom");
Response.Redirect("WebForm1.aspx");
}
}
}
7. Sélectionnez Déboguer > Démarrer le débogage (ou appuyez sur F5). La page
WebForm1.aspx s'ouvre dans un navigateur Web, comme illustré à la figure 4-8. Entrez
un nom, puis cliquez sur le bouton Envoyer. Cette page stocke le nom entré dans l'état
de session.
104 | Leçon 4
Figure 4-8
Cette page stocke le nom
entré dans l'état de session
PRÊT POUR LA 8. Vous serez ensuite transféré vers WebForm2.aspx, comme illustré à la figure 4-9.
CERTIFICATION WebForm2.aspx récupère le nom d'utilisateur à partir de l'état de session. Dans la
Comprenez-vous les
même fenêtre de navigateur (afin que vous soyez dans la même session), essayez
concepts de base
du développement
d'accéder à WebForm1.aspx. Notez que tant que la session contient une entrée pour
d'applications Web le nom, vous êtes redirigé vers WebForm2.aspx. Appuyez sur le bouton Effacer la
Microsoft ASP.NET ? session. Cela efface la session et vous transfère vers WebForm1.aspx.
4.2
Figure 4-9
Cette page récupère le nom
affiché à partir de l'état
de session
Les applications ASP.NET doivent être déployées sur un serveur Web IIS (Internet
Information Services). IIS fait partie intégrante des systèmes d'exploitation Windows
Server et fournit des fonctionnalités pour l'hébergement de sites Web.
Le déploiement d'une application ASP.NET est simple, car ASP.NET fournit le déploiement
XCopy. Cela signifie que pour déployer un site Web ASP.NET sur un serveur Web, il
vous suffit de copier les fichiers vers les emplacements appropriés. Vous pouvez copier
ces fichiers à l'aide de la commande xcopy de Windows ou d'une application FTP
(File Transfer Protocol).
Certaines applications Web complexes peuvent nécessiter que vous déployiez des
REMARQUE
* fichiers DLL dans le Global Assembly Cache (GAC). Dans ce cas, vous devrez en fait
peut-être créer un package Windows Installer pour le déploiement au lieu d'utiliser
XCopy ou FTP.
Présentation des applications Web | 105
Vous pouvez utiliser IIS pour héberger plusieurs sites Web et partager des informations
avec des utilisateurs sur Internet ou sur un intranet. IIS utilise une relation hiérarchique
entre les sites, les applications et les répertoires virtuels comme élément de base essentiel
de l'hébergement de contenu en ligne.
IIS peut être administré à l'aide de l'outil Gestionnaire des services IIS, qui fait partie
du système d'exploitation Windows. L'outil Gestionnaire des services IIS, tel qu'illustré
à la figure 4-10, fournit une interface graphique utilisateur pour configurer des sites,
applications et répertoires virtuels Web. La capture d'écran de la figure 4-10 provient d'un
ordinateur exécutant Windows 7. L'interface utilisateur du Gestionnaire des services IIS
est différente sous Windows XP.
Figure 4-10
Interface du Gestionnaire
des services Internet (IIS)
sur un ordinateur exécutant
Windows 7
Un site Web est un conteneur d'applications et de répertoires virtuels qui sont accessibles
via une adresse Web. Par exemple, l'URL www.northwind.com peut pointer vers un
site Web qui comprend beaucoup de répertoires virtuels, tels que des commandes et des
comptes, chacun étant accessible en association avec l'adresse du site Web (par exemple,
via www.northwind.com/orders et www.northwind.com/account).
Un serveur Web n'expose jamais l'adresse physique réelle et l'emplacement des fichiers
au monde extérieur. Au lieu de cela, il utilise un système d'alias qui sont mappés aux
répertoires physiques. Ces alias sont aussi appelés « répertoires virtuels ». Les répertoires
106 | Leçon 4
virtuels deviennent une partie de l'URL, comme illustré dans l'exemple précédent. Lorsqu'IIS
reçoit une requête pour une telle URL, il mappe le répertoire virtuel à l'emplacement
physique des fichiers. L'exercice suivant montre comment créer un répertoire virtuel.
Figure 4-11
Boîte de dialogue Ajouter
un répertoire virtuel
Il existe deux façons principales de déployer des fichiers sur un site Web :
• À l'aide de XCopy ou FTP : un grand nombre d'applications Web et de services Web
requièrent simplement que les fichiers soient copiés sur le serveur Web. Ces sites et
services ne requièrent aucune action spéciale, comme le redémarrage des services IIS,
PRÊT POUR LA l'inscription des composants sur le Registre Windows, etc. Le déploiement XCopy ou
CERTIFICATION FTP est idéal dans ces scénarios.
Comprenez-vous les
concepts de base • À l'aide de Windows Installer : Windows Installer permet d'effectuer un certain
de l'hébergement nombre d'actions personnalisées pendant le processus de déploiement. Par conséquent,
Web avec le serveur il peut être utilisé pour le déploiement de sites Web complexes qui requièrent la
Web IIS ? création automatique de répertoires virtuels, le redémarrage de services, l'inscription
4.3 de composants, etc.
Présentation des applications Web | 107
Les services Web fournissent un moyen d'interagir avec les objets de programmation
situés sur les ordinateurs distants. C'est le fait que toutes les communications entre les
serveurs de services Web et leurs clients s'effectuent par le biais de messages XML
(Extensible Markup Language) transmis via HTTP (Hypertext Transfer Protocol) qui rend
les services Web spéciaux.
En utilisant ces technologies standard, les objets distants peuvent être publiés et utilisés
par les systèmes qui, sans cela, seraient incompatibles. Par exemple, un objet distant écrit
en C# et publié en tant que service Web sur un serveur Web Windows peut être traité par
du code Java exécuté sur un ordinateur Linux.
Avant d'entrer dans les détails de la création et de l'utilisation de services Web, nous allons
nous familiariser avec les deux principales technologies qui rendent les services Web
possibles :
• protocole SOAP (Simple Object Access Protocol)
• langage WSDL (Web Services Description Language)
Présentation de SOAP
SOAP est le protocole d'échange d'informations structurées lors d'une communication
de service Web entre deux ordinateurs distants.
SOAP est le protocole qui définit la façon dont les ordinateurs distants échangent des
messages dans le cadre d'une communication de service Web. SOAP s'appuie sur XML
pour son format de message et utilise HTTP pour la transmission des messages. L'utilisation
de SOAP pour communiquer présente deux avantages majeurs. Tout d'abord, étant donné
que les messages de service Web sont au format XML, ils sont plus faciles à comprendre
par les systèmes incompatibles. Ensuite, étant donné que ces messages sont transmis via
le protocole HTTP largement répandu, ils peuvent normalement atteindre n'importe quel
ordinateur sur Internet sans être bloqués par des pare-feu.
Voici un paquet SOAP classique envoyé à partir d'un client à un service Web :
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:xsi=http://www.w3.org/2001/XMLSchema–instance
xmlns:xsd=http://www.w3.org/2001/XMLSchema
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ToLower xmlns="http://northwindtraders.com">
<inputString>SAMPLE STRING</inputString>
</ToLower>
</soap:Body>
</soap:Envelope>
108 | Leçon 4
Présentation de WSDL
WSDL est un langage XML permettant de décrire des services Web.
*
REMARQUE WSDL est l'acronyme de Web services description language (langage de description
Un service Web peut de services). Ce langage fournit une norme par laquelle un service Web peut indiquer
exister sans fichier à son client quel genre de messages il acceptera et quels résultats seront retournés. Un
WSDL, mais vous fichier WSDL agit comme interface publique d'un service Web et inclut les informations
devez connaître le suivantes :
message SOAP entrant • les types de données qu'il peut traiter ;
exact que le service
• les méthodes qu'il expose ;
Web attend avant de
pouvoir utiliser ce • les URL à travers lesquelles les méthodes sont accessibles.
service.
Création de services Web
Dans cette section, vous allez apprendre à créer et à publier un service Web.
Dans cette section, vous allez apprendre comment créer un service Web simple appelé
TextWebService qui expose deux méthodes : ToLower et ToUpper. Ces méthodes
convertissent une chaîne donnée en minuscules et en majuscules, respectivement. Bien
que cet exemple soit simple, il traite tous les aspects de la création d'un service Web qui
peut impliquer une logique de traitement plus complexe.
Présentation des applications Web | 109
Figure 4-12
Sélectionner le modèle
Application Web
ASP.NET vide
Figure 4-13
Sélectionner le modèle
Service Web
{
[WebMethod]
public string ToUpper(string inputString)
{
return inputString.ToUpper();
}
[WebMethod]
public string ToLower(string inputString)
{
return inputString.ToLower();
}
}
REMARQUE
* 4. Sélectionnez Débogage > Générer TextWebService pour compiler le projet et vous
Vous pouvez utiliser assurer qu'il n'y a pas d'erreurs. Le service Web est maintenant prêt à être utilisé.
le nom de domaine de
Dans le code ci-dessus, il y a certains points importants à noter. Tout d'abord, notez que
votre entreprise dans
chaque classe exposée en tant que service Web XML doit avoir un attribut WebService.
le cadre de l'espace de
L'attribut WebService a une propriété Namespace dont la valeur par défaut est
noms pour distinguer
https://tempuri.org/. Même s'il est normal d'avoir cette valeur au moment du développement,
vos services Web des
la valeur de l'espace de noms doit être modifiée avant que le service Web soit publié.
services publiés par
En fait, chaque service Web individuel doit avoir un espace de noms unique pour que les
d'autres sociétés.
applications clientes le distinguent des autres services Web.
Chaque méthode exposée à partir du service Web doit aussi avoir un attribut WebMethod.
Les méthodes marquées avec des attributs WebMethod sont également appelées
« méthodes Web ». Les deux méthodes utilisées dans cet exercice convertissent une
chaîne donnée en majuscules et en minuscules, respectivement.
Pour tester un service Web simple, tel que le service TextWebService créé ci-dessus, tout
ce dont vous avez besoin est un navigateur Web. Vous pouvez sélectionner les méthodes
à appeler, passer des paramètres et examiner les valeurs retournées à partir du navigateur,
comme indiqué dans l'exercice suivant.
Figure 4-14
Page de test du service Web
Présentation des applications Web | 111
2. Sur la page de test, cliquez sur le lien Description du service. De cette façon, vous
pourrez afficher le WSDL de ce service Web. Cliquez sur le bouton Précédent pour
revenir à la page de test.
3. Notez que toutes les méthodes Web apparaissent sous forme de liens sur la page de
test. Pour appeler une méthode Web particulière, cliquez sur son lien. Cela étant fait,
une page permettant de tester la méthode Web sélectionnée doit s'afficher, comme
illustré à la figure 4-15.
Figure 4-15
Page de test d'une
méthode Web
4. Chaque page de test de méthode Web montre les messages SOAP et d'autres messages
que le service Web comprend. Elle contient également un formulaire qui vous permet
d'entrer des paramètres de méthode et de tester la méthode Web. Entrez une chaîne
d'entrée de test, puis cliquez sur le bouton Appeler. Un résultat doit s'afficher sur la
page suivante, comme illustré à la figure 4-16.
Figure 4-16
Valeur de retour du test
de service Web
5. Testez les deux méthodes. Lorsque vous avez terminé, fermez le navigateur Web.
112 | Leçon 4
Comme cet exercice l'a démontré, lorsque vous cliquez sur le bouton Appeler, la page de
test construit les paquets SOAP appropriés pour le service Web à traiter, puis affiche les
résultats retournés par le service Web.
Précédemment dans la leçon, vous avez appris comment appeler un service Web à partir
de la page de test d'un service Web. Dans cette section, vous allez apprendre comment
appeler un service Web par programme à partir d'une application cliente ASP.NET.
Figure 4-17
Boîte de dialogue Ajouter
une référence Web
Figure 4-18
Nœud Web References
du projet
ToUpper method:
<asp:Label ID="toUpperLabel"
runat="server"
Text="Label" ForeColor="Green" />
</p>
</form>
</body>
</html>
5. Ouvrez le mode Design pour Default.aspx, puis double-cliquez sur le contrôle Button.
Cela ajoute un code pour le gestionnaire d'événements Click. Modifiez le code comme
indiqué ci-dessous :
REMARQUE
*
Lorsque vous appelez protected void Button1_Click(
une méthode de service object sender, EventArgs e)
Web, vous pouvez {
choisir d'utiliser une var webService =
méthode synchrone
new textWebService.TextWebService();
ou une méthode
asynchrone. Vous toLowerLabel.Text =
pouvez utiliser la webService.ToLower(TextBox1.Text);
méthode asynchrone toUpperLabel.Text =
pour augmenter webService.ToUpper(TextBox1.Text);
la réactivité de
l'application cliente. }
6. Sélectionnez Débogage > Démarrer le débogage pour exécuter l'application Web.
Entrez un exemple de texte, puis cliquez sur le bouton Appeler les méthodes de
service. Les résultats du service TextWebService doivent s'afficher, comme illustré
à la figure 4-19.
Figure 4-19
Valeur de retour en
provenance du service Web
Dans l'exercice ci-dessus, lorsque vous ajoutez une référence Web, Visual Studio crée un
proxy local qui représente le service distant. Le proxy simplifie la communication avec le
service Web en acceptant les messages, en les transférant au service Web et en retournant
les résultats en provenance du service Web.
Vous pouvez facilement utiliser ce proxy pour créer des objets à partir du service Web
et appeler des méthodes. Par conséquent, l'utilisation d'objets distants est semblable
à l'utilisation d'objets locaux.
Présentation des applications Web | 115
Lorsque vous créez une référence Web, Visual Studio lit le fichier WSDL approprié pour
PRÊT POUR LA
CERTIFICATION déterminer quelles classes et méthodes sont disponibles sur le serveur distant. Lorsque
Comprenez-vous les vous appelez une méthode sur un objet distant, le .NET Framework convertit votre appel
concepts de base du et vos résultats en messages SOAP et les transmet sans aucune intervention de votre part.
développement de
services Web ?
4.4
</html>
Quel est le style du texte affiché dans le cadre de l'élément <div> ?
a. Font family: Verdana; font weight: bold; font size: 12pt
b. Font family: Verdana; font weight: bold; font size: 9pt
c. Font family: Verdana; font size: 12pt
d. Font family: Verdana; font size: 9pt
Présentation des applications Web | 117
2. Vous développez un site Web de cartographie qui permet aux utilisateurs d'explorer
interactivement les cartes à l'aide d'actions telles qu'un panoramique ou un zoom.
Vous voulez que le site Web soit réactif et accessible dans la plupart des navigateurs
Web modernes. Cependant, vous ne voulez pas que les utilisateurs aient à installer
des plug-ins supplémentaires pour pouvoir utiliser votre site Web. Parmi les
technologies suivantes, laquelle devez-vous utiliser pour afficher les cartes ?
a. HTML
b. Technologie de programmation côté serveur telle qu'ASP.NET
c. Adobe Flash
d. JavaScript
3. Votre page ASP.NET contient une variable de niveau page de type Customer. Vous
souhaitez conserver la valeur de cette variable à travers les publications (postbacks)
de la page, mais vous n'en avez pas besoin dans les autres pages de l'application.
Parmi les techniques de gestion d'état suivantes, laquelle est le meilleur moyen d'y
parvenir ?
a. Chaînes de requête
b. Cookies
c. ViewState
d. Session
4. Vous développez une application Web pour une banque en ligne. Votre application
permet aux utilisateurs d'accéder à leurs informations de compte et à leurs
transactions à partir d'un navigateur Web. Quand un utilisateur se connecte
à l'application Web, vous souhaitez afficher son nom d'utilisateur et le solde de son
compte sur toutes les pages de l'application jusqu'à ce qu'il se déconnecte. Vous
voulez également que l'application soit protégée contre les utilisateurs malveillants.
Parmi les techniques de gestion d'état suivantes, laquelle devez-vous utiliser ?
a. Cookies
b. ViewState
c. ViewState avec chiffrement
d. Session
5. Vous développez un formulaire Web afin afficher les informations de la météo.
Lorsqu'un utilisateur demande le formulaire Web, celui-ci doit procéder à une
initialisation pour modifier son aspect et affecter des valeurs à certains contrôles.
Où devez-vous placer le code ?
a. Dans le gestionnaire d'événements PreInit de la classe Page
b. Dans le gestionnaire d'événements Init de la classe Page
c. Dans le gestionnaire d'événements Load de la classe Page
d. Dans le gestionnaire d'événements PreRender de la classe Page
6. Vous voulez afficher les valeurs des expressions C# dans une page ASP.NET.
Parmi les types de blocs de code suivants, lequel devez-vous utiliser pour encadrer
l'expression ?
a. <script runat=“server”>…</script>
b. <script>…</script>
c. <%= … %>
d. <form>…</form>
7. Vous avez développé une application de feuille de temps qui sera utilisée par tous
les employés de votre entreprise. Vous avez utilisé ASP.NET pour développer
l'application et l'avez déployée sur le serveur Web de la société. Que doivent installer
tous les employés de la société sur leur ordinateur pour accéder à l'application de
feuille de temps ?
a. Le package redistribuable .NET Framework
b. Le Kit de développement logiciel (SDK) .NET Framework
c. Visual Studio
d. Un navigateur Web
118 | Leçon 4
8. Votre application cliente appelle un service Web qui exécute des calculs longs et
complexes. Un utilisateur se plaint qu'au retour des résultats, l'interface utilisateur
se bloque momentanément. Quelle approche devez-vous adopter pour résoudre ce
problème ?
a. Vous devez installer un meilleur processeur sur le serveur Web.
b. Vous devez installer un meilleur processeur sur l'ordinateur client.
c. Vous devez opter pour une connexion Internet plus rapide.
d. Vous devez utiliser les appels asynchrones pour invoquer le service Web.
9. Vous avez créé un service Web ASP.NET qui permet de convertir une devise en une
autre. L'une des méthodes de votre service Web est définie par le code suivant :
public double Convert(double amount,
string from, string to)
{
// code to perform currency conversion
}
Les utilisateurs du service Web constatent qu'ils peuvent définir une référence au
service Web, mais qu'ils ne peuvent pas accéder à la méthode Convert. Quel peut être
le problème ?
a. Le fichier .asmx du service Web n'est pas disponible sur le serveur Web.
b. La classe du service Web n'est pas marquée avec l'attribut WebService.
c. La méthode Convert n'est pas marquée avec l'attribut WebMethod.
d. Les services Web ne peuvent exposer que les méthodes qui retournent des valeurs
de texte.
10. Vous travaillez sur deux projets Visual Studio. Le premier projet est un service Web
qui retourne un objet DataSet appartenant à l'espace de noms System.Data. Le second
projet accède au service Web créé par le premier projet. Quel projet de ce scénario
requiert une référence à l'espace de noms System.Data ?
a. Le projet du service Web
b. Le projet client qui accède au service Web
c. Le projet client et le projet du service Web
d. Ni le projet client ni le projet du service Web
TERMES CLÉS
paramètres de ligne de commande programme d'installation applications Windows Forms
application console applications d'interface service Windows
délégués multidocument (MDI)
événements héritage visuel
Vous êtes développeur de logiciels pour une grande entreprise. Vous devez développer
une application qui s'intègre étroitement avec le Bureau Windows de l'utilisateur
et qui fournit une interface utilisateur similaire à celle des applications de bureau
répandues sur la plateforme Windows. L'application doit être fonctionnelle, qu'elle soit
connectée ou non au réseau. Elle doit également être capable de communiquer avec
des périphériques comme des imprimantes et des scanneurs portatifs.
Les applications Windows Forms sont des applications clientes intelligentes composées
d'un ou de plusieurs formulaires qui affichent une interface visuelle pour l'utilisateur.
L'ESSENTIEL Elles s'intègrent parfaitement dans le système d'exploitation, utilisent des périphériques
connectés et peuvent fonctionner en étant connectées ou non à Internet.
120
Présentation des applications de bureau | 121
Un Windows Form est une surface visuelle capable d'afficher plusieurs contrôles,
notamment des zones de texte, des boutons et des menus. Visual Studio fournit
un concepteur Windows Forms de type glisser-déplacer qui vous permet de créer
facilement vos applications.
REMARQUE
* Pour concevoir des Windows Forms, vous devez commencer par décider quels contrôles
Un contrôle est un mettre sur le formulaire. Les Windows Forms fournissent une grande collection de
élément distinct contrôles courants que vous pouvez facilement utiliser pour créer une excellente interface
d'interface utilisateur utilisateur. Si la fonctionnalité que vous recherchez ne figure pas déjà dans les contrôles
qui accepte une entrée courants, vous avez la possibilité de créer un contrôle personnalisé ou d'en acheter un
de l'utilisateur ou auprès d'un fournisseur tiers.
affiche les sorties
pour l'utilisateur. Vous pouvez utiliser les fonctionnalités fournies par le concepteur Windows Forms
de Visual Studio pour placer et réorganiser les contrôles en fonction de vos besoins
rapidement. Visual Studio permet d'accéder facilement aux contrôles disponibles
par le biais de sa boîte à outils, comme illustré dans la figure 5-1.
Figure 5-1
Boîte à outils Visual Studio
Figure 5-2
Boîte de dialogue Nouveau projet Visual Studio
Figure 5-3
Windows Form avec un
contrôle DateTimePicker
et un contrôle Label
5. Sélectionnez Débogage > Démarrer le débogage (ou appuyez sur F5) pour exécuter le
REMARQUE
* projet. Sur l'interface utilisateur, sélectionnez une nouvelle date et vérifiez que celle
Dans cet exercice,
sélectionnée s'affiche sur le contrôle Label.
nous avons utilisé les
noms de contrôles Dans cet exercice, notez que si le formulaire est affiché dès le départ, le contrôle Label
par défaut. Dans les est défini sur une chaîne vide. Puis, dès que vous modifiez la sélection de la date en
formes complexes avec manipulant le contrôle DateTimePicker, la valeur de la date sélectionnée est définie en
plus de contrôles, c'est tant que texte du contrôle Label.
toujours une bonne
idée de donner aux
Présentation du modèle d'événement Windows Form
commandes des noms
plus significatifs.
La gestion des événements joue un rôle clé dans la programmation basée sur
l'interface utilisateur. Par l'intermédiaire de la gestion des événements, vous
pouvez répondre aux divers événements qui sont déclenchés à la suite des actions
de l'utilisateur et ainsi rendre les programmes interactifs. Le modèle d'événement
Windows Forms utilise des délégués .NET Framework pour lier des événements
à leurs gestionnaires d'événements respectifs.
Dans les applications Windows Forms, chaque formulaire et chaque contrôle exposent un
ensemble prédéfini d'événements. Lorsqu'un événement se produit, le code du gestionnaire
d'événements associé est appelé. Par exemple, dans l'exercice précédent, lorsque vous
double-cliquez sur le contrôle DateTimePicker pour ajouter du code au gestionnaire
d'événements, Visual Studio génère le code suivant pour attacher le gestionnaire
d'événements à l'événement :
this.dateTimePicker1.ValueChanged +=
new System.EventHandler(
REMARQUE
*
Un délégué peut être this.dateTimePicker1_ValueChanged);
lié à n'importe quelle Ici, ValueChanged est l'événement du contrôle DateTimePicker que nous voulons capturer.
méthode dont la Une nouvelle instance du délégué de type EventHandler est donc créée et la méthode
signature correspond dateTimePicker1_ValueChanged est passée au gestionnaire d'événements. La méthode
à celle du gestionnaire dateTimePicker1_ValueChanged est celle dans laquelle vous écrirez le code de gestion
d'événements. d'événements.
Ce code est automatiquement généré par le concepteur Visual Studio. Vous le trouverez
dans le fichier code-behind du concepteur (Form1.Designer.cs), à l'intérieur d'une région
de code intitulée Code généré par le Concepteur Windows Form.
Encore une chose à noter : la syntaxe pour ajouter un délégué utilise l'opérateur +=.
En effet, .NET Framework prend en charge les délégués multicast dans lesquels un
délégué peut être lié à plus d'une méthode, ce qui permet des notifications un-à-plusieurs
lorsqu'un événement est déclenché.
Un Windows Form est pour l'essentiel une autre classe. Par conséquent, l'héritage s'applique
aussi. Toutefois, lorsque l'héritage est appliqué à un Windows Form, cela entraîne l'héritage
de toutes les caractéristiques visuelles d'un formulaire, telles que la taille, la couleur et tous
les contrôles placés sur le formulaire. Vous pouvez également manipuler visuellement toute
propriété héritée de la classe de base. Par conséquent, l'héritage de Windows Forms est
souvent appelé héritage visuel. Dans l'exercice suivant, vous allez créer un Windows Form
par l'intermédiaire de l'héritage visuel d'un formulaire existant.
Figure 5-4
Modèle de formulaire hérité
Présentation des applications de bureau | 125
3. Cliquez sur le bouton Ajouter. Ensuite, dans la boîte de dialogue Sélecteur d'héritage,
sélectionnez Form1 à partir de l'espace de noms WindowsFormsDesign, comme illustré
dans la figure 5-5, puis cliquez sur le bouton OK.
Figure 5-5
Boîte de dialogue
Sélecteur d'héritage
4. Sélectionnez le mode Code pour le formulaire hérité InheritedForm ; vous verrez que
la classe InheritedForm hérite de Form1, comme indiqué ci-dessous. Si vous n'avez pas
utilisé le modèle de formulaire hérité à l'étape 2, vous devrez modifier manuellement
le code pour ajouter le code pour l'héritage (indiqué en caractères gras) :
public partial class InheritedForm
: WindowsFormsDesign.Form1
{
public InheritedForm()
{
InitializeComponent();
}
}
8. Sélectionnez Débogage > Démarrer le débogage (ou appuyez sur F5) pour exécuter
le projet. Lorsque InheritedForm est chargé, la date actuellement sélectionnée est
affichée sur le contrôle Label. Cela diffère du Form1 préalablement créé, dans lequel
le contrôle Label est initialement vide.
Le formulaire InheritedForm prouve que vous pouvez obtenir toutes les fonctionnalités
de Form1 simplement en héritant de la forme. Lorsque vous remplacez le modificateur
d'accès private des contrôles membre de Form1, label1 et dateTimePicker1 par protected,
vous êtes en mesure d'y accéder depuis le formulaire hérité. Cet exercice montre également
comment étendre les fonctionnalités du formulaire de base dans un formulaire hérité.
Figure 5-6
Microsoft Excel 2010 dans
une application MDI
Présentation des applications de bureau | 127
Les applications MDI contrastent avec des applications d'interface SDI (single-document
interface) dans lesquelles chaque fenêtre contient son propre menu et sa barre d'outils.
Les applications SDI s'appuient sur le système d'exploitation pour fournir une fonctionnalité
REMARQUE
* de gestion de fenêtre. Par exemple, dans Windows, vous pouvez basculer entre plusieurs
Il peut être difficile fenêtres à l'aide de la barre des tâches Windows.
de mettre en œuvre
la prise en charge de Il y a beaucoup de discussions parmi les concepteurs d'interface utilisateur pour savoir
plusieurs moniteurs quelle est l'interface d'application qui fonctionne le mieux. De manière générale, les
dans les applications applications SDI sont considérées comme plus adaptées aux utilisateurs novices, tandis
MDI car la fenêtre que les applications MDI sont considérées comme plus adaptées aux utilisateurs avancés.
parent doit s'étendre sur De nombreuses applications très répandues telles que Microsoft Word et Microsoft Excel
tous les moniteurs de prennent en charge SDI et MDI. Word et Excel s'installent par défaut en tant qu'applications
l'utilisateur. SDI, mais fournissent aux utilisateurs une option pour basculer entre SDI et MDI.
Par exemple, dans Word 2010 et Excel 2010, vous pouvez basculer en mode MDI en
décochant l'option « Afficher toutes les fenêtres dans la barre des tâches » dans le menu
Options.
Figure 5-7
Ajout d'options de menu
128 | Leçon 5
Le signe & devant un caractère dans le texte d'un menu n'apparaît pas tel quel ; au
contraire, il définit le caractère qui sera la touche de raccourci pour le menu. Par
exemple, le menu &Fenêtre peut être invoqué en appuyant sur Alt+F. Les touches
*
REMARQUE
d'accès ne seront pas accessibles tant que l'utilisateur n'a pas appuyé sur la touche
Alt. Un paramètre du système d'exploitation Windows permet de définir si les touches
d'accès rapide sont toujours visibles ou non.
6. Sur le formulaire parent, double-cliquez sur l'élément de menu Fenêtre > Nouvelle
fenêtre et ajoutez le gestionnaire d'événements suivant pour son événement Click :
private void newWindowToolStripMenuItem_Click(
object sender, EventArgs e)
{
ChildForm child = new ChildForm();
child.MdiParent = this;
child.Show();
}
8. Sélectionnez Débogage > Démarrer le débogage (ou appuyez sur F5) pour exécuter
le projet. Sélectionnez Fenêtre > Nouvelle fenêtre pour créer plusieurs nouvelles
fenêtres enfants. Basculez entre les fenêtres enfants. Notez qu'il n'y a qu'une seule
instance de l'application dans la barre des tâches Windows. Maintenant, utilisez
les options du menu Fenêtre > Organiser pour organiser les fenêtres enfants.
Par exemple, une application avec trois fenêtres enfants pourrait ressembler à l'image
de la figure 5-8 lorsque les fenêtres enfants sont disposées horizontalement.
Figure 5-8
Une application MDI avec
trois fenêtres enfants
disposées horizontalement
Passons en revue quelques-unes des propriétés importantes et des méthodes utilisées dans
cet exercice. Tout d'abord, pour le formulaire parent, la propriété IsMdiContainer est
définie sur True. Cette propriété indique que le formulaire est un conteneur pour plusieurs
formulaires MDI enfants. Parallèlement, pour chaque formulaire enfant, vous devez
définir la propriété MdiParent pour spécifier le formulaire conteneur parent.
Ensuite, la propriété MdiWindowListItem du MenuStrip sert à indiquer quel élément de
menu sera utilisé pour afficher la liste des fenêtres MDI enfants. Lorsque cette propriété
est définie, l'élément de menu répertorie toutes les fenêtres enfants et vous permet
également de basculer entre les fenêtres enfants. Suite au code de la méthode ChildForm_
PRÊT POUR LA Load, la barre de titre pour chaque formulaire affiche la date et l'heure de chargement du
CERTIFICATION formulaire.
Comprenez-vous
comment développer Enfin, la méthode LayoutMdi est utilisée par les éléments de menu du menu Fenêtre pour
des applications organiser les fenêtres enfants. La méthode accepte un paramètre de type énumération
Windows Forms ? MdiLayout. La valeur d'énumération détermine si les fenêtres enfants doivent être disposées
5.1 en mosaïque horizontale ou verticale, en cascade, ou s'afficher sous forme d'icônes.
REMARQUE
* Comme leur nom l'indique, les applications consoles sont exécutées à partir de la fenêtre
Pour activer la lecture de la console. L'entrée de cette application peut être fournie à l'aide de paramètres de
depuis ou l'écriture ligne de commande ou l'application peut lire de manière interactive des caractères de la
vers la console à partir fenêtre de la console. De même, la sortie d'une application console peut aussi bien être
d'une application écrite dans la fenêtre de commande. Vous pouvez activer la lecture ou l'écriture dans la
Windows Forms, dans console en créant une application qui utilise le modèle Application console dans Visual
les propriétés du projet, Studio.
définissez le type Vous pouvez également utiliser des applications console pour créer des commandes
Output du projet sur pouvant être exécutées à partir de la ligne de commande. Par exemple, vous pouvez tirer
Application console. parti des canaux et des filtres fournis par le système d'exploitation pour passer la sortie
d'une commande en tant qu'entrée pour une autre commande et créer ainsi des commandes
plus puissantes en combinant des commandes simples.
130 | Leçon 5
Dans cette section, vous apprendrez à accepter des paramètres de ligne de commande
à partir d'une application console.
L'exercice suivant crée une application console simple qui accepte le nom d'un fichier
texte comme un argument de ligne de commande et affiche le contenu de ce fichier.
Figure 5-9
Modèle Application console
2. Dans le fichier Program.cs, modifiez le code dans la méthode Main comme indiqué
ci-dessous :
static void Main(string[] args)
{
if (args.Length < 1)
return;
string[] lines = File.ReadAllLines(args[0]);
foreach (string item in lines)
{
Console.WriteLine(item);
}
}
3. Ajoutez la directive using suivante au fichier :
using System.IO;
Présentation des applications de bureau | 131
4. Sélectionnez Générer > Générer la solution (ou appuyez sur F6) pour générer le projet.
5. Créez un fichier texte à l'aide de Visual Studio ou du bloc-notes, entrez un exemple
de texte et enregistrez le fichier sous exemple.txt dans le même dossier que le fichier
exécutable. (Le fichier exécutable est créé par défaut dans le dossier bin\debug sous le
dossier du projet).
6. Ouvrez une invite de commandes et accédez à l'emplacement du fichier EXE du projet.
Exécutez la commande suivante :
PRÊT POUR LA DisplayFile sample.txt
CERTIFICATION
Comprenez-vous Cette commande doit afficher le contenu du fichier texte dans la fenêtre de commande.
comment développer des 7. Vous pouvez également passer l'argument de ligne de commande de Visual Studio
applications console ? en utilisant la fenêtre Propriétés du projet, comme illustré dans la figure 5-10. Pour
5.2 afficher la fenêtre Propriétés du projet, sélectionnez l'option du menu Projet >
Propriétés de DisplayFile.
Figure 5-10
Définition des options de
démarrage dans la fenêtre
Propriétés du projet
Un service Windows est une application qui s'exécute en arrière-plan et n'a aucune
L'ESSENTIEL interface utilisateur.
De par leur nature, les services Windows sont parfaits pour créer des programmes
longs qui s'exécutent en arrière-plan et ne fournissent pas d'interaction utilisateur
directe. Un service Windows peut être démarré, mis en pause, redémarré et arrêté.
Un service Windows peut également être configuré pour démarrer automatiquement au
démarrage de l'ordinateur.
Parmi des exemples de services Windows on peut trouver un serveur Web qui écoute
les demandes entrantes et envoie une réponse, ou un spouleur d'impression de système
d'exploitation qui fournit des services d'impression aux programmes d'application.
132 | Leçon 5
Les services jouent un rôle important dans une architecture d'applications d'entreprise. Par
exemple, vous pouvez avoir un service qui écoute des commandes entrantes et démarre un
flux de travail de traitement de commandes dès qu'une commande est reçue.
Comme un service Windows peut s'exécuter en arrière-plan, il n'a pas besoin qu'un
utilisateur soit connecté pour fonctionner. Les services Windows s'exécutent dans
REMARQUE
* leur propre session Windows dans le contexte de sécurité spécifié. Pourtant, selon les
autorisations nécessaires, vous pouvez spécifier un compte d'utilisateur sous lequel
exécuter le service.
Pour créer un service Windows dans Visual Studio, utilisez le modèle d'application
de service Windows. Notez qu'un service Windows doit être installé avant de pouvoir
être utilisé.
REMARQUE
* Tous les services Windows doivent dériver de la classe ServiceBase. Cette classe de
Visual Studio Express
base fournit la structure de base et les fonctionnalités pour créer un service Windows.
Edition ne fournit pas
Vous pouvez remplacer les méthodes de classe de base OnStart, OnStop, OnPause et
de modèles pour créer
OnContinue pour ajouter votre propre logique personnalisée qui s'exécute en réponse
des projets de service
aux changements des états de service.
Windows. Ainsi, vous
aurez besoin d'une L'exercice suivant explique comment créer un service Windows simple qui écrit des
version non express messages dans le journal d'événements d'applications. Les journaux d'événements
de Visual Studio pour constituent la partie de Windows qui est utilisée par les tâches du système d'exploitation
effectuer les exercices et les applications qui s'exécutent en arrière-plan pour consigner des erreurs ou
qui utilisent des projets d'autres messages d'information. Windows définit trois journaux d'événements par
de service Windows. défaut : Système, Application et Sécurité. Les applications utilisent généralement le
journal d'événements d'applications pour enregistrer leur message. L'utilitaire Observateur
d'événements Windows permet d'afficher les messages dans les journaux d'événements.
Figure 5-11
Sélection du modèle de
projet de service Windows
Présentation des applications de bureau | 133
7. Ajoutez le code suivant aux méthodes de changement d'état de service pour définir
leur comportement. La méthode WriteEntry du composant de journal d'événements,
eventLog1, est utilisée pour écrire un message dans un journal d'événements. Dans
le cadre de la méthode, vous pouvez spécifier le type de message. Par exemple, votre
message peut être simplement un élément d'information, un message d'avertissement
ou un message d'erreur :
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry(
“Démarrage du service”,
EventLogEntryType.Information, 1001);
}
8. Sélectionnez Générer > Générer la solution (ou appuyez sur F6) pour générer le projet.
Ici, le code de FirstService remplace les méthodes OnStart, OnStop, OnPause, OnContinue
et OnShutdown pour écrire des messages dans le journal d'événements. Tous les services
n'ont cependant pas à remplacer ces méthodes. Le fait qu'un service doive remplacer ces
méthodes dépend de la valeur des propriétés CanPauseAndContinue et CanShutdown du
service Windows.
La méthode WriteEntry du journal d'événements prend le message à écrire dans le journal,
le type d'entrée de journal d'événements (informations, erreur, avertissement, etc.) et un ID
d'événement, qui est un id spécifique à l'application utilisée pour identifier l'événement.
Le service Windows FirstService est désormais prêt, mais avant qu'il puisse être utilisé,
il doit être installé dans la base de données du service Windows. Il faut pour cela ajouter
un programme d'installation de service au projet de service Windows. L'exercice suivant
montre comment procéder.
Figure 5-12
Vue du concepteur pour
ProjectInstaller.cs
Présentation des applications de bureau | 135
3. Émettez la commande suivante ; vous devriez voir des résultats comme ceux illustrés
dans la figure 5-13 :
installutil FirstService.exe
Figure 5-13
Utilisation d'installutil.exe
REMARQUE
* 4. Le service Windows FirstService est maintenant installé.
Pour installer un
service Windows, L'application de service Windows est maintenant stockée dans la base de données du
il faut un accès au service Windows. Lorsque vous avez ajouté une classe ServiceInstaller pour FirstService,
Registre Windows. vous avez défini la propriété StartType du composant serviceInstaller1 sur Manuel. Par
Par conséquent, conséquent, vous devez démarrer manuellement le service en cas de besoin. L'exercice
vous devez exécuter suivant explique comment démarrer, suspendre, poursuivre et arrêter un service Windows.
installUtil.exe en tant
qu'administrateur.
Figure 5-14
La section Services vous
permet de travailler avec
les services installés
Présentation des applications de bureau | 137
Figure 5-15
Message de contrôle de
service lors du démarrage
d'un service
Figure 5-16
Le journal de l'application
Windows
c.
this.MouseDown += new MouseEventHandler
(Form1_HandleMouse);
d.
this.MouseMove += new MouseEventHandler
(Form1_HandleMouse);
7. Vous développez un Windows Form avec une interface multidocument (MDI). Vous
devez écrire du code qui dispose les fenêtres enfants verticalement dans la région du
client du formulaire parent MDI. Laquelle des instructions suivantes devriez-vous
utiliser ?
a.
LayoutMdi(MdiLayout.TileVertical);
b.
LayoutMdi(MdiLayout.Cascade);
c.
MdiLayout(LayoutMdi.TileVertical);
d.
MdiLayout(LayoutMdi.Cascade);
8. Vous développez une application qui sera exécutée à partir de la ligne de commande.
Parmi les méthodes suivantes, laquelle utiliseriez-vous pour une sortie vers la ligne
de commande ?
a. Console.Read
b. Console.Write
c. File.Read
d. File.Write
9. Vous voulez développer une application qui affiche une surface visuelle capable
d'afficher plusieurs contrôles, tels que des zones de texte, des boutons et des menus.
L'application devrait également permettre à plusieurs fenêtres enfants de résider sous
une fenêtre parent unique. Parmi les types d'applications suivants, lesquels devriez-
vous développer ?
a. Application console
b. Application de service Windows
c. Application d'interface SDI (single-document interface)
d. Application d'interface multidocument (MDI)
10. Vous étendez une application Windows existante. Vous aimeriez créer un formulaire
qui dérive ses caractéristiques visuelles (dont la taille, la couleur et certains contrôles)
d'un formulaire créé précédemment. Quelle technique devriez-vous utiliser pour créer
le formulaire ?
a. Héritage visuel
b. Encapsulation visuelle
c. Abstraction visuelle
d. Polymorphisme visuel
TERMES CLÉS
attribut première forme normale (1FN) conception de base de données
DataSet fichiers plats relationnelle
base de données dépendance fonctionnelle deuxième forme normale (2FN)
intégrité de base de données normalisation procédure stockée
système de gestion de base procédures stockées paramétrables SQL (Structured Query Language)
de données (SGBD) clé primaire troisième forme normale (3FN)
applications déconnectées instructions de traitement XML (Extensible Markup Language)
élément base de données relationnelle
diagrammes d'entité-relation
Vous êtes développeur de logiciels pour la société Northwind. Dans le cadre de votre
travail, vous interagissez avec des données relatives aux clients, produits, fournisseurs
et commandes, et vous traitez ces données. Votre travail consiste à interagir avec
des bases de données relationnelles telles que Microsoft SQL Server. Toutefois,
vous travaillez également avec les données stockées dans d'autres formats, tels que
des fichiers plats, des fichiers XML et des données en mémoire. Pour être efficace
dans votre travail, vous devez savoir comment vous connecter à diverses sources de
données, et comment récupérer et mettre à jour les données contenues dans ces sources.
Une base de données relationnelle est une collection de données reliées entre elles,
L'essentiel
basées sur le modèle relationnel développé par E. F. Codd. Ce modèle définit des
entités de données distinctes, leurs attributs et les relations entre les entités.
142
Présentation des bases de données | 143
Une base de données est une collection organisée de données liées entre elles et qui
sont gérées comme une seule unité.
Une base de données vous permet de stocker, de tenir à jour et de récupérer des données
importantes. Si une base de données est correctement conçue, elle peut être utilisée par
plusieurs applications et par plusieurs utilisateurs. En revanche, un système de gestion de
base de données (SGBD) est un logiciel qui organise des bases de données et fournit des
fonctionnalités telles que le stockage, l'accès aux données, la sécurité, la sauvegarde, etc.
Microsoft SQL Server, Microsoft Access, Oracle et MySql constituent des exemples de
SGBD très répandus.
Les systèmes de gestion de base de données peuvent être implémentés en fonction de
différents modèles. Parmi ces modèles, le modèle relationnel est le plus répandu. Dans
le modèle relationnel, les données sont organisées en tables, chacune pouvant comporter
plusieurs lignes. Les SGBD basés sur des modèles relationnels sont appelés « système
de gestion de base de données relationnelle » ou « SGBD relationnel » (SGBDR).
SQL Server, Access, Oracle et MySql sont tous des SGBDR.
D'autres systèmes de gestion de base de données sont basés sur des modèles différents.
Par exemple, les SGBD orientés objet (ODBMS) reposent sur le modèle objet, dans lequel
les données sont stockées en tant que collection d'objets. Dans cette leçon, cependant,
l'accent sera mis uniquement sur les bases de données relationnelles les plus courantes.
Les SGBD relationnels utilisent SQL (Structured Query Language) pour récupérer et
manipuler les données. Les systèmes de gestion de base de données relationnelle les plus
populaires prennent en charge la version normalisée de SQL, ce qui vous permet d'utiliser
vos compétences sur différents systèmes de base de données relationnelle.
Une base de données relationnelle organise les données en tables à deux dimensions
composées de colonnes et de lignes.
Une base de données relationnelle organise les informations en tables. Une table est une
liste de lignes et de colonnes qui, d'un point de vue conceptuel, est semblable à une feuille
de calcul Microsoft Excel. Une ligne est aussi appelée « enregistrement » ou « tuple »,
et une colonne est parfois appelée « champ ». La colonne ou le champ spécifie le type
des données qui seront stockées pour chaque enregistrement de la table. Par exemple,
les commandes des clients peuvent être stockées dans une table Orders dans laquelle
chaque ligne représente une commande unique. Dans cette table, les colonnes telles
que OrderDate peuvent être utilisées pour spécifier qu'une valeur valide est du type de
données correct. Un exemple de la table Orders est illustré à la figure 6-1.
Figure 6-1
Une table Orders dans
une base de données
relationnelle
144 | Leçon 6
Les diagrammes d'entité-relation sont utilisés pour modéliser des entités, leurs
attributs et les relations entre les entités. Les diagrammes d'entité-relation peuvent vous
aider à déterminer quelles données doivent être stockées dans une base de données.
• Relation : une relation est une association entre entités. Par exemple, Prend est une
relation entre une entité Employee et une entité Order (c'est-à-dire, Employee Prend
Order).
Notez que les diagrammes d'entité-relation ne montrent pas des entités uniques ou des
relations uniques. Par exemple, il peut y avoir des milliers d'entités Order et des centaines
d'entités Customer. Au lieu de cela, ces diagrammes montrent des jeux d'entités et des
ensembles de relations ; par exemple, les milliers d'entités Order peuvent former un seul
et même jeu d'entités. En fait, lorsqu'une valeur Order ou Customer apparaît dans un
diagramme d'entité-relation (ERD), il fait généralement référence à un jeu d'entités plutôt
qu'à une entité individuelle.
Les diagrammes d'entité-relation utilisent certaines conventions de conception. En particulier :
• Un rectangle représente un jeu d'entités.
• Une ellipse représente un attribut.
• Un losange représente un ensemble de relations.
• Des lignes pleines lient des jeux d'entités à des ensembles de relations et des jeux
d'entités à des attributs.
La figure 6-2 montre un exemple de diagramme d'entité-relation (ERD). Dans ce
diagramme, les deux jeux d'entités sont Customer et Order. Les attributs associés
à Customer sont ID, Name et City. Les attributs associés à Order sont OrderID, OrderDate
et ShipDate. Ces attributs qui constituent une clé primaire sont soulignés. En outre,
comme indiqué dans la figure, la relation entre Customer et Order est Passe.
Figure 6-2
Un diagramme
d'entité-relation
Dans un diagramme d'entité-relation (ERD), une relation peut être classée comme relation
un-à-un, relation un-à-plusieurs ou relation un-à-plusieurs. Dans la figure 6-2, la ligne qui
relie la relation Passe au jeu d'entités Customer est étiqueté « 1 », alors que la ligne entre
Passe et le jeu d'entités Order est étiqueté « N ». Il s'agit d'un exemple de relation un-à-
plusieurs. Dans cette relation, un client peut passer plusieurs commandes, mais un seul
client peut être associé à une commande.
Customers
ID Name City
1001 Jane Doe Berlin
1002 John Doe Tokyo
1003 Howard Steel Sydney
Orders
L'analyse des relations entre les entités vous permet de garantir que vous avez identifié les
éléments de données appropriés pour votre base de données. Ensuite, pendant le processus
de normalisation des données, vous appliquez un ensemble de règles de normalisation
pour garantir que vous avez établi la conception de base de données qui convient. En
d'autres termes, vous vérifiez si les colonnes appartiennent aux tables appropriées afin de
garantir que votre base de données ne comporte aucun problème indésirable.
Par exemple, dans le cadre de l'analyse des relations entre les entités, vous pouvez arriver
à une table Books qui comporte les colonnes suivantes :
Books
Customer
REMARQUE
* Id FirstName LastName PhoneNumber
Par convention, le nom 1 Jane Doe (503) 555-6874
des colonnes d'une
table qui font partie 2 John Doe (509) 555-7969,
de la clé primaire doit (509) 555-7970
être souligné. 3 Howard Steel (604) 555-3392,
(604) 555-3393
Pour que cette table soit en 1FN, vous devez diviser la table en deux :
Customer
Id FirstName LastName
1 Jane Doe
2 John Doe
3 Howard Steel
CustomerPhones
Id PhoneNumber
1 (503) 555-6874
2 (509) 555-7969
2 (509) 555-7970
3 (604) 555-3392
3 (604) 555-3393
148 | Leçon 6
Ici, la table Customers et la table CustomerPhones sont toutes les deux en 1FN. Les deux
tables ont une clé primaire (Id dans la première table et la combinaison d'Id et de
PhoneNumber dans la deuxième table) qui établit une relation entre elles. À partir de
n'importe quel ID d'un client, vous pouvez trouver tous les numéros de téléphone de ce
client sans risque de confusion. En revanche, LastName n'est pas une clé primaire car un
nom de famille peut avoir des entrées en double.
La 2FN s'applique uniquement aux tables ayant des clés primaires composites (c'est-
à-dire que plusieurs colonnes ensemble constituent la clé primaire). Les valeurs
*
REMARQUE combinées de tous les champs d'une clé primaire composite doivent être uniques.
Si une table est conforme à la 1FN et n'a qu'une seule colonne dans sa clé primaire,
cette table est également conforme à la 2FN.
Orders
Ici, les colonnes OrderId et CustomerId associées identifient une ligne unique et
constituent, par conséquent, une clé primaire composite. Néanmoins, la colonne OrderDate
est fonctionnellement dépendante d'OrderId uniquement, et la colonne CustomerName
est fonctionnellement dépendante de CustomerId uniquement. Cela n'est pas conforme
à la 2FN car les colonnes ne correspondant pas à une clé sont fonctionnellement
dépendantes uniquement d'une partie de la clé primaire.
Vous pouvez modifier la table Orders pour qu'elle soit conforme à la 2FN en sortant
CustomerName de la table et en ayant seulement trois colonnes (OrderId, CustomerId
et OrderDate), avec uniquement OrderID comme clé primaire. Dans cette solution,
CustomerId et OrderDate sont toutes les deux fonctionnellement dépendantes d'OrderId et,
par conséquent, conformes à la 2FN.
Présentation des bases de données | 149
Items
Ici, ItemId est la clé primaire. Cependant, ReorderFax est un numéro de fax du fournisseur
et est donc fonctionnellement dépendant de SupplierId. Pour être conforme à l'exigence
de la 3FN, cette table doit être décomposée en deux tables : Items (ItemId, SupplierId)
et Supplier (SupplierId, ReorderFax).
Items
ItemId SupplierId
101 100
102 11
103 525
Supplier
PRÊT POUR LA
CERTIFICATION SupplierId ReorderFax
Comprenez-vous les
100 (514) 555-2955
concepts de base des
systèmes de gestion 11 (514) 555-9022
de base de données
relationnelle ? 525 (313) 555-5735
6.1
SQL est le langage utilisé par la plupart des systèmes de base de données pour gérer
les informations contenues dans leurs bases de données. Les commandes SQL vous
permettent de récupérer et de mettre à jour des données. Les commandes SQL vous
permettent également de créer et de gérer des objets de base de données tels que des
tables. SQL peut être considéré comme un langage de programmation pour les bases
de données relationnelles. Cependant, SQL est déclaratif par nature, contrairement au
caractère impératif des langages de programmation les plus courants.
150 | Leçon 6
Dans SQL, vous indiquez à la base de données ce qui doit être fait, et c'est à cette dernière
de définir comment procéder. Par exemple, vous pouvez indiquer à la base de données
de sélectionner les 10 premières lignes d'une table. Comparez cela avec un langage de
programmation impératif tels que C#, dans lequel vous devez spécifier en détail comment
le travail doit être effectué. Par exemple, vous aurez peut-être besoin de créer une boucle
qui s'exécute dix fois, de configurer et d'initialiser des variables, de déplacer des pointeurs
d'enregistrements, etc.
SQL est une norme ANSI (American National Standards Institute), mais différents
fournisseurs de base de données ont implémenté leurs propres extensions du langage SQL
standard. L'implémentation de SQL dans Microsoft SQL Server s'appelle Transact-SQL
(T-SQL).
Il existe deux manières principales de soumettre T-SQL à SQL Server. Vous pouvez
soit utiliser des instructions SQL ad hoc qui sont exécutées directement, soit utiliser des
procédures stockées. Les procédures stockées sont des collections d'instructions SQL et
de logique de programmation qui sont stockées sur le serveur de base de données en tant
qu'objets nommés.
Utilisation de requêtes SQL
Les instructions SELECT, INSERT, UPDATE et DELETE sont les quatre principaux
types d'instructions SQL utilisés pour manipuler des données SQL Server.
L'utilisation de requêtes SQL ad hoc constitue un moyen flexible de travailler avec
une base de données SQL Server. Dans cette partie de la leçon, vous allez découvrir
les notions de base relatives aux quatre principaux types d'instructions SQL qui vous
permettent de manipuler des données SQL Server :
• Les instructions SELECT vous permettent de récupérer des données stockées dans
une base de données.
• Les instructions INSERT vous permettent d'ajouter de nouvelles données à une base
de données.
• Les instructions UPDATE vous permettent de modifier des données existantes dans
une base de données.
• Les instructions DELETE vous permettent de supprimer des données d'une base
de données.
CONNEXION À UNE BASE DE DONNÉES SQL SERVER
Vous devez vous connecter à une base de données SQL Server avant de pouvoir
manipuler des informations contenues dans cette base de données.
Dans cet exercice, vous allez apprendre à travailler avec une base de données Microsoft
SQL Server. Si vous n'avez pas accès à une version récente de SQL Server, vous pouvez
télécharger gratuitement SQL Server 2008 Express à partir du site www.microsoft.
com/express/database. Cet exercice utilise l'exemple de base de données SQL Server
Northwind. Cette base de données n'est pas installée par défaut avec SQL Server, mais
vous pouvez télécharger le fichier de base de données en suivant les instructions fournies
sur le site www.msdn.com/en-us/library/ms143221.aspx.
Effectuez l'exercice suivant pour vous connecter à la base de données Northwind et
l'utiliser avec Visual Studio.
Figure 6-3
Connexion à la base de
données Northwind
Figure 6-4
Accès à la base de données
Northwind via l'Explorateur
de serveurs
152 | Leçon 6
Figure 6-5
Fenêtre Propriétés de la base
de données Northwind
PAUSE. Vous accéderez aux données de la base de données Northwind dans le prochain
exercice.
EXÉCUTION DE REQUÊTES SQL
Figure 6-6
Concepteur de requêtes
Visual Studio
Figure 6-7
Exécution de requêtes à
partir d'une application C#
Présentation des bases de données | 155
Le code mentionné dans cet exercice implémente une méthode SelectData qui initialise un
objet SqlDataAdapter et l'utilise pour remplir un objet DataTable. L'objet DataTable est alors
lié en tant que source de données du composant de DataGridView. L'objet SqlDataAdapter
joue le rôle de pipeline entre SQL Server et l'objet DataTable pour la récupération des
données. La méthode Fill modifie les données contenues dans l'objet DataTable pour qu'elles
correspondent aux données de la source de données. La valeur selectCommandText est
utilisée pour identifier les données présentes dans la source de données.
SÉLECTION DE DONNÉES
Cette requête indique à SQL Server de prendre chaque ligne dans la table Orders et
de la faire correspondre à toutes les lignes dans la table Customers dans lesquelles la
valeur CustomerId de la commande est égale à la valeur CustomerId du client. Comme
CustomerId est unique dans la table Customers, cela revient à inclure une seule ligne
pour chaque commande dans le jeu de résultats. Dans ce cas, le jeu de résultats comprend
autant de lignes qu'il y a de lignes dans la table Orders.
Mais que se passe-t-il si vous voulez voir uniquement certaines des lignes dans la
REMARQUE
* table ? Dans ce cas, vous pouvez utiliser la clause WHERE. La clause WHERE évalue
Dans SQL Server, le
une condition pour chaque ligne, puis décide s'il faut l'inclure dans le jeu de résultats.
délimiteur standard
Par exemple :
pour le texte et les
dates est le guillemet SELECT *
simple. FROM Orders
WHERE ShipCountry = 'Canada'
Ici, la clause WHERE examine chaque ligne de la table Orders pour voir si la valeur
ShipCountry a la valeur exacte « Canada ». Si tel est le cas, la ligne est incluse dans
le jeu de résultats ; sinon, la ligne n'est pas incluse dans le jeu de résultats.
Vous pouvez également associer plusieurs conditions dans une clause WHERE unique.
Par exemple :
SELECT *
FROM Orders
WHERE (ShipCountry = 'Canada')
AND (OrderDate >= '01/01/97')
AND (OrderDate <= '01/31/97')
Ici, la condition WHERE filtre les commandes dans lesquelles la valeur ShipCountry est
« Canada » et la date de la commande est en janvier 1997.
Par défaut, SQL ne garantit pas que les résultats seront dans un ordre particulier.
Toutefois, vous pouvez utiliser la clause ORDER BY pour garantir que les données que
vous souhaitez sont retournées dans un ordre spécifique. Par exemple, pour répertorier
les commandes en fonction de leur date de commande, vous pouvez utiliser la requête
suivante :
SELECT *
FROM Orders
WHERE (ShipCountry = 'Canada')
AND (OrderDate >= '01/01/97')
AND (OrderDate <= '01/31/97')
ORDER BY OrderDate
Vous pouvez modifier l'ordre de tri en utilisant le mot clé ASC (pour un ordre croissant)
ou le mot clé DESC (pour un ordre décroissant). L'ordre de tri par défaut est l'ordre
croissant. Par conséquent, la requête suivante affiche les commandes les plus récentes
en haut :
SELECT *
FROM Orders
WHERE (ShipCountry = 'Canada')
AND (OrderDate >= '01/01/97')
AND (OrderDate <= '01/31/97')
ORDER BY OrderDate DESC
Présentation des bases de données | 157
Il est assez fréquent que les applications de gestion des informations professionnelles
demandent des données agrégées ou synthétisées. Ces exigences peuvent être traitées
à l'aide de la clause GROUP BY et des fonctions d'agrégation. Par exemple, vous pouvez
utiliser la requête suivante pour trouver à quels pays vous expédiez la plupart de vos
commandes :
SELECT ShipCountry, COUNT(ShipCountry) AS OrderCount
FROM Orders
GROUP BY ShipCountry
ORDER BY OrderCount DESC
Cette requête affiche le nom de chaque pays, suivi du nombre total de commandes
expédiées vers ce pays. La clause ORDER BY trie le résultat et place les pays ayant
le plus grand nombre de commandes en haut de la liste.
Vous pouvez considérer la clause GROUP BY comme la création de « compartiments »
(dans le cas présent, un pour chaque pays). Lorsque le moteur de base de données
examine chaque enregistrement, il le place dans le compartiment approprié. Une fois ce
processus terminé, le moteur de base de données compte le nombre d'enregistrements qui
finit dans chaque compartiment et retourne une ligne pour chacun d'eux. La figure 6-8
présente le début du jeu de résultats de cette requête.
Figure 6-8
Synthèse des informations
à l'aide de la clause
GROUP BY
L'instruction UPDATE est utilisée pour mettre à jour les informations contenues dans
des tables de base de données.
L'instruction UPDATE est une autre instruction SQL. L'objectif d'une instruction UPDATE
est de mettre à jour ou de modifier des données. Par exemple, vous pouvez mettre à jour un
champ d'un enregistrement de la table Customers à l'aide de la requête suivante :
UPDATE Customers
SET ContactName = 'Maria Anderson'
WHERE CustomerId = 'ALFKI'
158 | Leçon 6
Dans cette requête, le mot clé SET indique à SQL Server les colonnes à mettre à jour,
REMARQUE
* et le mot clé WHERE lui indique les lignes à mettre à jour. Dans la table Customers,
Dans une instruction CustomerId est une clé primaire et identifie de manière unique une seule ligne.
UPDATE, la clause Par conséquent, cette instruction UPDATE peut mettre à jour au maximum une ligne.
SET est requise et ne
peut être spécifiée Notez, cependant, que vous n'êtes pas limité à mettre à jour un seul enregistrement.
qu'une seule fois. En revanche, si la clause WHERE sélectionne plusieurs enregistrements, tous ces
enregistrements sont mis à jour :
UPDATE Customers
REMARQUE
* SET Country = 'United States'
Il est fortement WHERE Country = 'USA'
recommandé
d'examiner avec soin Vous pouvez également mettre à jour plusieurs champs à la fois avec une instruction
la clause WHERE de UPDATE, comme dans l'exemple suivant :
chaque instruction UPDATE Customers
UPDATE. Vous
SET ContactName = 'Maria Anderson',
risquez, en effet, de
mettre à jour par CITY = 'Tokyo'
inadvertance les WHERE CustomerId = 'ALFKI'
données d'un plus
grand nombre de lignes
INSERTION DE DONNÉES
qu'initialement prévu.
L'instruction INSERT est utilisée pour ajouter une ou plusieurs lignes à une table de
base de données.
L'instruction INSERT répertorie les champs de la table cible, suivis d'un ensemble de
valeurs à insérer dans ces champs. Par exemple, l'instruction INSERT suivante insère une
ligne dans la table Order Details :
INSERT INTO [Order Details]
(OrderId, ProductId, UnitPrice, Quantity, Discount)
VALUES (10248, 2, 19.00, 2, 0)
Des crochets sont requis quand les noms de tables ou de champs contiennent des espaces.
Ici, la première paire de parenthèses contient une liste de colonnes, et la deuxième paire
contient les valeurs à insérer. Si un champ a une valeur par défaut, s'il peut être nul ou s'il
s'agit d'un champ d'identité, vous pouvez ne pas le placer dans la liste de champs, comme
dans l'exemple suivant :
INSERT INTO [Order Details]
(OrderId, ProductId, UnitPrice, Quantity)
VALUES (10249, 2, 19.00, 2)
Cette instruction fonctionne même si aucune valeur n'est spécifiée pour le champ Discount.
De plus, avec cette instruction, vous pouvez réorganiser une liste de champs à condition
de réorganiser la liste de valeurs en conséquence :
INSERT INTO [Order Details]
(ProductId, OrderId, UnitPrice, Quantity)
VALUES (2, 10250, 19.00, 2)
L'instruction INSERT n'est pas limitée à insérer un seul enregistrement. En fait, il y a un
deuxième format qui insère les résultats d'une instruction SELECT dans la table cible.
Par exemple, cette requête insère un produit de chaque fournisseur dans la table Products :
INSERT INTO Products
(SupplierId, ProductName, CategoryId)
SELECT SupplierId, 'Almond', 7
FROM Suppliers
Présentation des bases de données | 159
Cette requête fonctionne en générant les résultats de l'instruction SELECT, puis en plaçant
chaque ligne retournée par les instructions SELECT dans la table cible. Naturellement,
les colonnes doivent toujours correspondre.
SUPPRESSION DE DONNÉES
L'instruction DELETE est utilisée pour supprimer des informations des tables de base
de données.
L'instruction DELETE supprime des données d'une table. À des fins d'exercice et pour
éviter de supprimer des données de la même base de données, vous pouvez copier une
table à l'aide d'une instruction SELECT, comme dans l'exemple suivant :
SELECT * INTO CustomersCopy
FROM Customers
Cette instruction sélectionne tous les enregistrements de la table Customers et les copie
dans une nouvelle table appelée CustomersCopy.
Pour supprimer une ligne unique de données de la table CustomersCopy, utilisez
l'instruction DELETE suivante :
DELETE FROM CustomersCopy
WHERE CustomerId = 'ALFKI'
Soyez prudent, car si vous omettez la clause WHERE, vous supprimerez toutes les
données de la table :
DELETE FROM CustomersCopy
Une procédure stockée est un ensemble d'instructions SQL qui est stocké dans
une base de données. Les procédures stockées peuvent être utilisées par plusieurs
applications.
Contrairement aux requêtes ad hoc, les procédures stockées sont des requêtes qui sont
stockées de façon permanente sur un serveur SQL Server. Vous pouvez considérer les
procédures stockées comme l'équivalent SQL des méthodes C#.
Les procédures stockées présentent deux avantages principaux. Tout d'abord, vous pouvez
les utiliser pour enregistrer des instructions SQL complexes en vue d'une exécution
ultérieure. Ensuite, SQL Server compile des procédures stockées pour qu'elles s'exécutent
plus rapidement que des requêtes ad hoc. Dans cette section de la leçon, vous allez
apprendre comment créer et exécuter des procédures stockées.
PRÉPAREZ-VOUS. Pour créer une procédure stockée dans Visual Studio, procédez comme
suit :
1. Ouvrez l'Explorateur de serveurs, puis sélectionnez la base de données Northwind.
Cliquez avec le bouton droit sur le nœud Procédure stockée, puis sélectionnez
l'option Ajouter une nouvelle procédure stockée.
2. Dans le concepteur de procédures stockées, remplacez le texte réutilisable par le
code suivant :
CREATE PROCEDURE GetCustomersFromFrance
AS
SELECT * FROM Customers
Where Country = 'France'
RETURN
REMARQUE
* 3. Enregistrez la procédure stockée. La procédure stockée est à présent ajoutée à la base
Vous pouvez de données.
utiliser l'instruction 4. Pour exécuter la procédure stockée, cliquez avec le bouton droit sur la procédure
ALTER PROCEDURE stockée dans l'Explorateur de serveurs, puis sélectionnez Exécuter. Le résultat de la
pour modifier la procédure stockée doit s'afficher dans la fenêtre Sortie.
définition d'une
5. Vous pouvez également exécuter cette procédure stockée à partir du projet QueryCS
procédure stockée précédemment créé. Ici, au lieu d'une instruction SQL, tapez simplement le nom
existante. de la procédure stockée, puis cliquez sur le bouton Exécuter SQL. Le résultat de la
procédure stockée s'affichera dans le Windows Form.
PRÉPAREZ-VOUS. Pour créer une procédure stockée paramétrable, procédez comme suit :
1. Ouvrez l'Explorateur de serveurs, puis sélectionnez la base de données Northwind.
Cliquez avec le bouton droit sur le nœud Procédure stockée, puis sélectionnez
l'option Ajouter une nouvelle procédure stockée.
2. Dans le concepteur de procédures stockées, remplacez le texte réutilisable par le
code suivant :
CREATE PROCEDURE dbo.GetCustomerSales
(
@CustomerId char(5),
@TotalSales money OUTPUT
)
Présentation des bases de données | 161
AS
SELECT @TotalSales = SUM(Quantity * UnitPrice)
FROM (Customers INNER JOIN Orders
ON Customers.CustomerId = Orders.CustomerId)
INNER JOIN [Order Details]
ON Orders.OrderId = [Order Details].OrderId
WHERE Customers.CustomerId = @CustomerId
RETURN
3. Enregistrez la procédure stockée. La procédure stockée est à présent ajoutée à la base
de données.
Dans cette procédure stockée, @CustomerId et @TotalSales sont tous les deux des
paramètres. @CustomerId est un paramètre d'entrée : vous devez fournir une valeur pour
ce paramètre lorsque vous exécutez la procédure stockée. @TotalSales est un paramètre
de sortie : il retourne une valeur à partir de la procédure stockée. Lorsque vous exécutez
cette procédure stockée à partir de Visual Studio, une boîte de dialogue vous invitant
à entrer la valeur de tous les paramètres s'affiche, comme illustré à la figure 6-9.
Figure 6-9
La boîte de dialogue Exécuter
la procédure stockée invite
à entrer les valeurs de
paramètre
Pour exécuter cette procédure stockée, tapez ALFKI comme valeur pour @CustomerId et
entrez NULL comme valeur pour @TotalSales. Lorsque vous appuyez sur le bouton OK,
la valeur calculée du paramètre de sortie, @TotalSales, s'affiche dans la fenêtre Sortie.
Vous ne pouvez toutefois pas exécuter une procédure stockée paramétrable à partir du
projet QueryCS, car le code, ici, ne peut pas accepter de paramètres.
Figure 6-10
Exécution de procédures
stockées paramétrables
à partir d'une application C#
Dans le code, les paramètres sont représentés par des objets SqlParameter. Le code
fonctionne en définissant la valeur du paramètre @CustomerId, en exécutant l'objet
SqlCommand correspondant à la procédure stockée, puis en récupérant la propriété Value
du paramètre @TotalSales.
Si vous ajoutez une nouvelle ligne à une table comportant une colonne d'identité, vous
REMARQUE
* pouvez utiliser la variable SQL Server @@IDENTITY pour récupérer la valeur de la
colonne d'identité de la ligne nouvellement créée.
C# fournit également une instruction using qui permet de garantir que les objets coûteux
REMARQUE
* tels que les connexions de base de données sont automatiquement fermés lorsque
L'objet utilisé avec vous avez terminé de les utiliser. Voici une autre version du code ci-dessus qui utilise
l'instruction using doit l'instruction using pour fermer automatiquement la connexion de base de données :
implémenter l'interface
IDisposable. // suppression d'objets avec une instruction using
using (connection)
PRÊT POUR LA {
CERTIFICATION connection.Open();
Comprenez-vous les
diverses méthodes command.ExecuteNonQuery();
d'interrogation de base totalSales = Double.Parse(
de données ?
6.2 command.Parameters["@TotalSales"]
.Value.ToString());
PRÊT POUR LA }
CERTIFICATION
Comprenez-vous les Notez que l'instruction using définit une étendue pour l'objet de connexion. Lorsque le
méthodes de connexion code atteint la fin de cette étendue, l'objet de connexion est automatiquement fermé, et
de base de données ? toutes les ressources sont libérées.
6.3
Les applications de gestion des informations professionnelles peuvent exiger des données
L'essentiel
dans différents formats. Par exemple, vous pouvez avoir à travailler avec des fichiers
plats, des fichiers XML et des objets en mémoire.
Le .NET Framework fournit des classes qui sont optimisées pour l'utilisation de fichiers
plats, de fichiers XML et d'objets en mémoire. Les données stockées dans des fichiers
plats peuvent être gérées à l'aide des classes de l'espace de noms System.IO. Les classes
de l'espace de noms System.Xml permettent de travailler avec des données XML. Enfin,
pour travailler avec des objets en mémoire tels qu'un DataSet, les classes de l'espace de
noms System.Data sont utilisées. Dans les sections suivantes, vous allez découvrir plus
en détail comment travailler avec chacun de ces formats de données.
Un fichier plat est une table de base de données qui est stockée dans un fichier sur
disque autonome.
Un fichier plat contient généralement une ligne de données par rangée, et les colonnes sont
séparées par des délimiteurs tels que des virgules ou ont une longueur fixe. Les données
contenues dans un fichier plat peuvent être binaires ou en texte brut. Ces fichiers sont
appelés « fichiers plats » pour les distinguer des formes plus structurées de stockage, telles
que des bases de données relationnelles et des fichiers XML.
Historiquement, avant l'avènement des bases de données modernes, les fichiers plats étaient
un moyen courant de stocker et d'organiser des informations. Les fichiers plats sont encore
utiles aujourd'hui, même si c'est dans un petit nombre de scénarios uniquement, et pas
en tant que bases de données à usage général. Les fichiers plats sont utilisés, notamment,
dans des fichiers de configuration d'application ou de système d'exploitation, lors du
transfert de données vers des systèmes distants et lors de la migration de données entre
des systèmes non compatibles.
Dans le .NET Framework, l'entrée et la sortie basées sur des fichiers s'articulent autour du
concept des flux et du magasin de stockage. Un flux est un débit de données brutes, et un
magasin de stockage est la source ou la destination du flux. Un magasin de stockage peut
être un fichier sur disque, de la mémoire, une connexion réseau, etc. L'espace de noms
System.IO comprend des classes permettant de travailler avec les flux et les magasins
de stockage.
Présentation des bases de données | 165
Comme indiqué précédemment, les fichiers plats peuvent être au format binaire ou en
texte brut. Les fichiers texte sont souvent organisés en lignes de texte séparées par des
caractères de fin de ligne. Les classes StreamReader et StreamWriter vous permettent de
manipuler facilement des fichiers texte.
Les fichiers binaires stockent leur contenu sous la forme d'une séquence d'octets. Bien que
les fichiers binaires ne soient pas lisibles par l'homme comme les fichiers texte, ils peuvent
stocker différentes données, telles que des images, des sons, des données vidéo, etc. Vous
aurez toujours besoin d'un logiciel pour interpréter le contenu d'un fichier binaire. Les
classes BinaryReader et BinaryWriter vous permettent de manipuler facilement des fichiers
binaires.
Dans l'exercice suivant, vous sélectionnez des colonnes de la table Customers et vous les
écrivez dans un fichier texte. Ensuite, vous ouvrez ce fichier texte et vous affichez son
contenu dans la fenêtre de console.
PRÉPAREZ-VOUS. Pour lire et écrire dans un fichier texte, procédez comme suit :
1. Créez un projet d'application console appelé WorkingWithTextFiles.
2. Ajoutez le code suivant à la classe Program. Vous devez corriger le chemin d'accès
à votre base de données Northwind dans ce code :
static void Main(string[] args)
{
string myDocumentsPath =
Environment.GetFolderPath(
Environment.SpecialFolder.MyDocuments);
CopyDataToTextFile(myDocumentsPath
+ @"\CustomerList.txt");
DisplayTextFile(myDocumentsPath
+ @"\CustomerList.txt");
}
static private void CopyDataToTextFile(
string fileName)
{
try
{
// Modifier la chaîne de connexion
// pour faire correspondre à votre système.
string connectionString =
@"Data Source=.\SQLEXPRESS;" +
@"AttachDbFilename=" +
@"c:\SqlSampleDB\NORTHWND.MDF;" +
@"Integrated Security=True;" +
@"Connect Timeout=30;User Instance=True";
SqlConnection connection =
new SqlConnection(connectionString);
SqlCommand command =
connection.CreateCommand();
166 | Leçon 6
command.CommandText =
"SELECT CustomerId, CompanyName,"
+ "ContactName, Phone FROM Customers";
using (connection)
{
connection.Open();
SqlDataReader reader =
command.ExecuteReader();
using (StreamWriter sw =
new StreamWriter(fileName))
{
while (reader.Read())
{
string customerRow =
String.Format("{0}, {1}, {2}, {3}",
reader.GetValue(0),
reader.GetValue(1),
reader.GetValue(2),
reader.GetValue(3));
sw.WriteLine(customerRow);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static void DisplayTextFile(string fileName)
{
try
{
using (StreamReader sr =
new StreamReader(fileName))
{
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
Présentation des bases de données | 167
Utilisation du langage XML
En XML, vous pouvez stocker des données et des métadonnées (informations sur les données
stockées). Par exemple, le code XML suivant représente les données de deux clients :
<?xml version="1.0" encoding="utf-8"?>
<!--Customer List-->
<Customers>
<Customer Id="ALFKI">
<CompanyName>Alfreds Futterkiste</CompanyName>
<Phone>030-0074321</Phone>
</Customer>
<Customer Id="EASTC">
<CompanyName>Eastern Connection</CompanyName>
<Phone>(171) 555-0297</Phone>
</Customer>
</Customers>
Même si vous n'avez aucune connaissance sur XML, vous pouvez comprendre le contenu
de ce fichier simplement en le regardant. XML est composé de balises (placées entre
crochets pointus) et de données. Les balises apparaissent toujours par paires, chaque balise
d'ouverture correspondant à une balise de fermeture. Par exemple, <Customers> est une
balise d'ouverture, et </Customers> est la balise de fermeture correspondante.
La première ligne d'un document XML est la déclaration XML :
<?xml version="1.0" encoding="utf-8"?>
Les balises XML qui commencent par <? sont appelées instructions de traitement.
Cette instruction de traitement indique que le document est un document XML, qu'il est
conforme aux spécifications XML version 1.0, et qu'il utilise le jeu de caractères UTF-8
pour ses éléments de données.
168 | Leçon 6
Une balise d'ouverture et une balise de fermeture avec leur contenu sont appelées élément.
Par exemple, voici un élément XML unique du document ci-dessus :
<Phone>030-0074321</Phone>
Ce bit de code définit un élément portant le nom Phone et dont la valeur est 030-0074321.
Les éléments peuvent être imbriqués, mais ils ne peuvent pas se chevaucher. Par exemple,
le code XML suivant n'est pas valide en raison du chevauchement entre les éléments
CompanyName et Phone :
<Customer Id="EASTC">
<CompanyName>Eastern Connection<Phone>
</Phone>(171) 555-0297</CompanyName>
</Customer>
</Customers>
Les documents XML sont hiérarchiques par nature. Chaque document XML comprend un
élément racine unique qui contient tous les autres nœuds. Un document XML peut donc
être visualisé comme une arborescence de nœuds.
Les éléments peuvent contenir des attributs. Un attribut est un élément de données qui
décrit un élément de manière plus approfondie. Par exemple :
<Customer Id="ALFKI">
Ici, l'élément Customer inclut un attribut dont le nom est Id et dont la valeur est ALFKI.
Enfin, un document XML peut contenir des commentaires. Les commentaires
commencent par les caractères <!-- et se terminent par les caractères -->.
Le code XML est souvent plus complexe que ce qui est décrit dans cette section.
Toutefois, ces notions de base sont suffisantes pour vous permettre de comprendre la
plupart des documents XML que vous allez probablement rencontrer jusqu'à ce que vous
commenciez à travailler avec XML de manière approfondie.
Il existe de nombreuses façons d'utiliser des données XML. Les classes qui utilisent des
données XML sont organisées dans l'espace de noms System.Xml. Cette partie de la leçon
porte sur les classes couramment utilisées suivantes :
• XmlReader et XmlWriter : les classes XmlReader et XmlWriter fournissent une
manière rapide, non mise en cache et vers l'avant uniquement de lire ou d'écrire des
données XML.
• XmlDocument : la classe XmlDocument est une représentation en mémoire de
données XML et permet de parcourir et d'éditer le document XML.
Dans l'exercice suivant, vous utilisez la classe XmlReader pour lire le nom de fichier XML
Customers.xml de façon séquentielle et vers l'avant uniquement.
if (reader.IsStartElement())
{
switch (reader.Name)
{
case "CompanyName":
if (reader.Read())
{
Console.Write(
"Company Name: {0}, ",
reader.Value);
}
break;
case "Phone":
if (reader.Read())
{
Console.WriteLine(
"Phone: {0}", reader.Value);
}
break;
}
}
}
}
3. Ajoutez ensuite la directive using suivante au programme :
using System.Xml;
4. Ajoutez maintenant un nouveau fichier XML appelé Customers.xml au projet.
Assurez-vous que le fichier XML contient les données suivantes :
<?xml version="1.0" encoding="utf-8"?>
<!--Customer List-->
<Customers>
<Customer Id="ALFKI">
<CompanyName>Alfreds Futterkiste</CompanyName>
<Phone>030-0074321</Phone>
</Customer>
<Customer Id="EASTC">
<CompanyName>Eastern Connection</CompanyName>
<Phone>(171) 555-0297</Phone>
</Customer>
</Customers>
Générez le programme. Copiez le fichier Customers.xml dans le dossier de l'exécutable
du programme. Exécutez le programme. La liste de tous les noms et numéros de
téléphone de sociétés doit s'afficher.
170 | Leçon 6
Le code présenté dans cet exercice crée d'abord une instance de XmlReader à l'aide
de la méthode XmlReader.Create. Cette opération lève une exception si le fichier est
introuvable. L'exécution du programme se termine quand la méthode XmlReader.Read n'a
rien à lire. Vous pouvez utiliser des propriétés telles que Name et Value pour accéder aux
différentes parties du code XML.
Vous pouvez également vous connecter à une base de données SQL Server à l'aide
des classes OdbcAdapter et OleDbAdapter. Cependant, la classe SQLDataAdapter est
*
REMARQUE
optimisée pour SQL Server. Par conséquent, lorsque vous travaillez avec SQL Server,
il est préférable d'utiliser la classe SQLDataAdapter.
Dans une application classique qui crée et met à jour un DataSet, vous devez effectuer les
étapes suivantes :
1. Créez et remplissez chaque DataTable du DataSet avec des données provenant de la
source de données à l'aide d'un DataAdapter.
Présentation des bases de données | 171
2. Modifiez les données présentes dans les objets DataTable individuels en ajoutant,
en mettant à jour ou en supprimant des objets DataRow.
3. Appelez la méthode AcceptChanges sur le dataset. Cette méthode se connecte aux
sources de données d'origine et les met à jour avec toutes les modifications apportées
au DataSet depuis son chargement ou depuis le dernier appel d'AcceptChanges.
Vous pouvez également appeler la méthode RejectChanges pour annuler toutes les
modifications apportées au DataSet depuis son chargement ou depuis le dernier appel
d'AcceptChanges.
Dans l'exercice suivant, vous utilisez les classes abordées jusqu'à présent pour lire des
données de la base de données Northwind de SQL Server dans un DataSet, puis vous
itérez la table Customer pour afficher les numéros de commande de chaque client.
PRÉPAREZ-VOUS. Pour lire à partir d'un objet DataSet en mémoire, procédez comme suit :
1. Créez un projet d'application console appelé WorkingWithDataSet.
2. Remplacez le code de la classe Program par le code suivant. Veillez à modifier la chaîne
de connexion pour la faire correspondre au chemin d'accès local du fichier de base de
données sur votre ordinateur :
static void Main(string[] args)
{
WorkingWithDataSet();
}
static void WorkingWithDataSet()
{
string cString = @"Data Source=.\SQLEXPRESS;"
+ @"AttachDbFilename=B:\SqlSampleDB\NORTHWND.MDF;"
+ "Integrated Security=True;"
+ "Connect Timeout=30;User Instance=True";
SqlConnection northwindConnection =
new SqlConnection(cString);
string customerCommandText =
"SELECT * FROM Customers";
SqlDataAdapter customerAdapter =
new SqlDataAdapter(
customerCommandText, northwindConnection);
string ordersCommandText =
"SELECT * FROM Orders";
SqlDataAdapter ordersAdapter =
new SqlDataAdapter(
ordersCommandText, northwindConnection);
172 | Leçon 6
Un DataSet peut lire et écrire des données sous la forme de documents XML. Pour
écrire des données au format XML, utilisez la méthode WriteXml de la classe DataSet.
REMARQUE
* Pour lire les données de documents XML, utilisez la méthode ReadXml de la classe
DataSet.
Présentation des bases de données | 173
6. L'application que vous développez doit lire des données à partir d'un fichier plat qui
inclut des éléments tels qu'une clé de type entier à cinq chiffres, suivie d'un nom de
client à 20 caractères et de deux champs date et heure. Laquelle des classes suivantes
devez-vous utiliser ?
a. FileStream
b. StreamReader
c. BinaryReader
d. DataReader
7. Vous développez une application qui devra copier des données à partir d'une vue
SQL Server vers un DataSet. Vous nommez dsData l'objet DataSet. Parmi les
méthodes suivantes, laquelle devez-vous utiliser pour copier les données ?
a. Fill
b. InsertCommand
c. SelectCommand
d. Update
8. Vous développez une application qui gère les clients et leurs commandes. Parmi les
situations suivantes, laquelle n'est pas appropriée pour l'implémentation avec des
procédures stockées dans votre application ?
a. Récupération de la liste de tous les clients de la base de données
b. Récupération de la liste de toutes les commandes de clients particuliers
c. Insertion d'une nouvelle commande dans la table Orders
d. Exécution de requêtes ad hoc par l'administrateur de base de données
9. Votre application se connecte à une base de données SQL Server qui contient une
table appelée Employees comportant les colonnes suivantes :
EmployeeID (int, identity)
EmployeeType (char(1))
EmployeeDate (datetime)
Vous devez écrire une requête qui supprime de la table toutes les lignes où la
valeur EmployeeType est C ou T. Vous ne voulez supprimer aucune autre ligne.
Quelle instruction devez-vous utiliser ?
a. DELETE FROM Employees
WHERE EmployeeType LIKE '[CT]'
b. DELETE FROM Employees
WHERE EmployeeType LIKE '[C-T]'
c. DELETE FROM Employees
WHERE EmployeeType LIKE 'C' OR 'T'
d. DELETE * FROM Employees
WHERE EmployeeType IN ('C', 'T')
10. Votre application inclut un objet SqlDataAdapter nommé sqlDataAdapter qui
se connecte à une table Employees. Sur la base de ce SQLDataAdapter, votre
application inclut également un objet DataSet dsEmployees. Quelle ligne de
code devez-vous utiliser pour charger les données de la base de données dans
l'objet DataSet ?
a. dsEmployees = sqlDataAdapter.Fill("Employees");
b. sqlDataAdapter.Fill("dsEmployees", "Employees");
c. sqlDataAdapter.Fill(dsEmployees);
d. sqlDataAdapter.Fill(dsEmployees, "Employees");
176 | Leçon 6
Books
Vous devez appliquer des règles de normalisation pour garantir l'intégrité des données.
Comment pouvez-vous vous assurer que la table Books est en troisième forme normale ?
179
180 | Index
opérateurs R
15, 42 récursivité, 22
défini, 10 relation plusieurs-à-plusieurs, 145
priorité en langage C#, 10 relation un-à-plusieurs, 144, 145
organigrammes, 2–3 relation un-à-un, 145
répertoire virtuel, 105 – 106
P Requêtes, SQL. Voir aussi Structured Query Language (SQL)
paramètres de ligne de commande, 129 Application C#, exécution à partir de, 153-154
Peek, 73, 74 Visual Studio, exécution à partir de, 152-153
pensée orientée objet, 33
piles S
opérations, 74 Services Internet (IIS), 104–106
performance et utilisation, 74 Services Web
représentation interne, 73–74 application cliente, accès à partir de, 112-114
Polymorphisme attribut WebMethod, 110
défini, 53 création, 108–110
utilisation, 54–55 défini, 107
Pop, 74 SOAP, 107–108
Postback, 96, 97 tests, 110–112
Premier formulaire normal, 147–148 Services Windows
procédures stockées paramétrées, 160–164 création, 132–134
procédures stockées défini, 131
création et exécution, 159-160 exemples, 131
défini, 159 installation, 135–136
paramétré, création, 160-161 programme d'installation, ajout à, 134-135
paramétrée, exécution à partir de C#, 161-164 utilisation, 136–137
Visual Studio, création à partir de, 160 signature, 34
processus de conception, 67 signe &, 128
programmation côté client, 94–95 sites Web, 104–105
programmation côté serveur, 94–95 SQL. Voir Structured Query Language (SQL)
Programmation orientée objet Structs, 44–45
encapsulation, 47–48 Structured Query Language (SQL)
héritage, 48–53 fonctions d'agrégation, 157
interfaces, 56–58 instruction DELETE, 150, 159
objets, 33–44 instruction INSERT, 150, 158–159
polymorphisme, 53–56 instruction SELECT, 150, 155–157
valeurs et références, 44–47 instruction UPDATE, 150, 157–158
programme d'installation, 135 instructions ad-hoc, 150
programme, 4 nature déclarative, 149-150
propriété Account, 135 Structures de décision
propriété Application, 101 défini, 11
propriété Namespace, 110 instruction if, 11–13
propriété QueryString, 100 instruction if-else, 13–15
propriété StartType, 135 instruction switch, 15–17
propriétés implémentées automatiquement, 37–38 structures de données
Propriétés files d'attente, 72–73
accesseurs, 36 listes liées, 74–76
auto-implémenté, 37-38 piles, 73–74
création, 36–37 tableaux, 70–72
défini, 36 Structures de répétition
écriture seule, 37 boucle do-while, 19–20
lecture seule, 37 boucle for, 20–21
protocole SOAP (Simple Object Access Protocol) boucle foreach, 21–22
défini, 107 boucle while, 17–19
éléments, 108 méthode récursive, 23
Push, 74 récursivité, 22
système de gestion des bases de données (SGBD), 143
Q système de numération binaire, 4
QuickSort, 79–81
Index | 183
tableaux U
accès, 71 Uniform Resource Locator (URL), 86
allocation, 71
applications C#, 9–10 V
défini, 9, 70 Variables, 8
opérations, 71 ViewState, 100
performance et utilisation, 72 Visual Studio
représentation interne, 71 Concepteur de requêtes, 153
tables de décision, 3–4 modèle de service Windows, 132 – 134
tables, 143, 146–149 programme d'installation de service Windows, ajout, 134-135
Test boîte blanche, 69 requêtes, exécution à partir de, 152-153
Test boîte noire, 69 service Windows, installation, 135-136
test d'acceptation, 70
test de boucle, 19
W
test de logiciels. Voir Tests
Web Service Definition Language (WSDL), 108
test de régression, 70
Windows Installer, 106
Test d'intégration, 69–70
World Wild Web, 86
test du système, 70
test unitaire, 69
Tests X
acceptation, 70 xcopy, 106
boîte blanche, 69 XML
boîte noire, 69 attributs, 168
intégration, 69–70 balises, 167
méthodes, 69 défini, 167
niveaux, 69–70 éléments, 168
régression, 70 fichiers, lecture, 168-170
services Web, 110–112 XmlDocument, 168
système, 70 XmlReader, 168
unité, 69 XmlWriter, 168
troisième formulaire normal, 149
T-SQL. Voir Structured Query Language (SQL)
types de données, 8–9
types de référence, 44, 45, 46-47
types valeur, 44, 45, 46
Remarques
Remarques
Remarques
Remarques
Remarques
Remarques
Remarques
Remarques
Remarques
Remarques