Vous êtes sur la page 1sur 220

Notions

fondamentales sur
le développement
logiciel

Official Academic Course


This page intentionally left blank
Microsoft® Official Academic Course

Notions fondamentales sur


le développement logiciel,
examen 98-361
Crédits
ÉDITEUR Bryan Gambrel
DIRECTEUR DES VENTES Mitchell Beaton
DIRECTEUR DU MARKETING Chris Ruel
CHEF DE PRODUIT SENIOR Microsoft Merrick Van Dongen de Microsoft Learning
ASSISTANT ÉDITORIAL Jennifer Lartz
GESTIONNAIRE DE CONTENU Micheline Frederick
DIRECTEUR DE LA PRODUCTION Amy Weintraub
DIRECTEUR DE LA CRÉATION Harry Nolan
CONCEPTEUR DE LA COUVERTURE Jim O’Shea
TECHNOLOGIE ET MÉDIAS Tom Kulesa/Wendy Ashenberg
Cover photo: Credit: © Pgiam/iStockphoto
Cet ouvrage a été réalisé en Garamond par Aptara, Inc. et imprimé et relié par Bind Rite Robbinsville.
La couverture a été imprimée par Bind Rite Robbinsville.
Copyright © 2012 par John Wiley & Sons, Inc. Tous droits réservés.
Aucune partie de cette publication ne peut être reproduite, stockée dans un système de récupération ou transmise
sous quelque forme ou par quelque moyen, électronique, mécanique, photocopie, enregistrement, numérisation ou
autrement, sauf tel que permis par les articles 107 ou 108 de la loi américaine sur les droits d'auteur de 1976 (United
States Copyright Act), sans l'autorisation écrite préalable de l'éditeur, ou l'autorisation obtenue moyennant le paiement
des frais par copie appropriés au Copyright Clearance Center, Inc. 222 Rosewood Drive, Danvers, MA 01923, site
Web www.copyright.com. Les demandes d'autorisation à l'éditeur doivent être adressées par courrier à Permissions
Department, John Wiley & Sons, Inc., 111 River Street, Hoboken, NJ 07030-5774, (201)748-6011, télécopie
(201)748-6008, Site Web http://www.wiley.com/go/permissions.
Microsoft, ActiveX, Excel, InfoPath, Microsoft Press, MSDN, OneNote, Outlook, PivotChart, PivotTable, PowerPoint,
SharePoint, SQL Server, Visio, Visual Basic, Visual C#, Visual Studio, Windows, Windows 7, Windows Mobile,
Windows Server et Windows Vista sont des marques déposées ou des marques commerciales de Microsoft Corporation
aux États-Unis et/ou dans d'autres pays. Les autres noms de produits et de sociétés mentionnés dans ce document sont
des marques de leurs propriétaires respectifs.
Les exemples de sociétés, organisations, produits, noms de domaine, adresses électroniques, logos, personnes, lieux
et événements mentionnés dans le présent document sont fictifs. Aucune association avec une société, organisation,
produit, nom de domaine, adresse de messagerie, logo, personne, lieu ou événement réel n'est intentionnelle ou ne doit
être inférée.
Le livre exprime les points de vue et les opinions de l'auteur. Les informations contenues dans cet ouvrage sont
fournies sans garantie expresse, légale ou implicite. Ni les auteurs, John Wiley & Sons, Inc., Microsoft Corporation,
ni leur revendeurs ou distributeurs ne seront tenus responsables pour tout dommage causé ou présumé avoir été causé
directement ou indirectement par ce livre.
Fondée en 1807, John Wiley & Sons, Inc. est une source précieuse de connaissances et de compétences depuis plus de
200 ans, qui aide des personnes du monde entier à répondre à leurs besoins et réaliser leurs aspirations. Notre société
est fondée sur des principes dont la responsabilité envers les communautés que nous servons et où nous vivons et
travaillons. En 2008, nous avons lancé une Initiative de citoyenneté sociétale, un effort mondial pour relever les défis
environnementaux, sociaux, économiques et éthiques auxquels nous sommes confrontés dans le cadre de notre activité.
Nous abordons des questions telles que l'impact carbone, les spécifications et l'achat de papier, la conduite éthique au
sein de notre entreprise et parmi nos fournisseurs et le soutien à la communauté et aux œuvres caritatives. Pour plus
d'informations, veuillez visiter notre site Web : www.wiley.com/go/citizenship.
ISBN 978-0-470-88911-4
Imprimé aux États-Unis d'Amérique
10 9 8 7 6 5 4 3 2 1

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

WILEY POUR LE LIVRE ÉLECTRONIQUE


MOAC ET LE CONTENU DU FORMATEUR
Le présent document est le Contrat de Licence Utilisateur Final limité de John Wiley and Sons Inc. (« Wiley ») et régit
votre utilisation du livre électronique Microsoft Official Academic Course de Wiley (le « Livre Électronique MOAC ») et du
contenu s’y rapportant (le « Contenu du Formateur »). EN TELECHARGEANT, EN UTILISANT OU EN ACCEDANT
AU LIVRE ÉLECTRONIQUE MOAC OU AU CONTENU DU FORMATEUR, VOUS ACCEPTEZ LES CONDITIONS
GENERALES DU PRESENT CONTRAT. SI VOUS NE LES ACCEPTEZ PAS, VOUS NE DEVEZ PAS TELECHARGER,
UTILISER OU ACCEDER AU LIVRE ÉLECTRONIQUE MOAC OU AU CONTENU DU FORMATEUR.
Licence :
Par les présentes, Wiley concède au membre du Programme Microsoft IT Academy, au formateur ou à l’étudiant
exerçant ses droits en vertu du présent contrat (« vous »), et vous acceptez, une licence non exclusive et non
transférable pour utiliser le Livre Électronique MOAC et le Contenu du Formateur sous réserve du respect des
conditions générales suivantes uniquement :
a. Vous reconnaissez que le Livre Électronique MOAC et le Contenu du Formateur vous sont concédés sous
licence pour une durée limitée et que votre utilisation est soumise aux conditions générales du présent contrat.

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.

� Le programme Microsoft Official Academic Course


La série Microsoft Official Academic Course est un programme complet dont l'objectif
est de permettre aux instructeurs et aux établissements d'enseignement de préparer et
de fournir des cours de grande qualité sur les technologies logicielles Microsoft. Avec
MOAC, nous reconnaissons qu'en raison de l'évolution rapide des technologies et du
programme développé par Microsoft, il existe un ensemble constant de besoins qui vont
au-delà des outils d'enseignement en classe pour qu'un instructeur soit prêt à donner le
cours. Le programme MOAC s'efforce de fournir des solutions pour tous ces besoins
de manière systématique afin de garantir une expérience fructueuse et enrichissante de
cours pour l'instructeur et l'étudiant, une formation technique et un programme pour la
préparation de l'instructeur avec les nouvelles versions de logiciel ; le logiciel lui-même,
destiné à être utilisé par l'étudiant à la maison pour acquérir des compétences pratiques,
évaluer et valider l'acquisition des compétences ; et un ensemble d'outils très utiles pour
l'enseignement en classe et en laboratoire. Tous ces éléments sont importants pour fournir
sans problème un cours intéressant sur les logiciels Microsoft, et tous sont fournis avec
le programme MOAC. Nous considérons le modèle ci-dessous comme le gage que nous
vous soutenons complètement dans votre objectif de fournir un cours de grande qualité.
Lorsque vous évaluez vos options de matériel pédagogique, vous pouvez utiliser ce
modèle à des fins de comparaison avec les produits disponibles :

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

Aide au lecteur instructifs STOP


FIN

« 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.

PRÉSENTATION DES TABLEAUX

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

2. Remplacez le code de la classe Program par le code suivant :


class Program
{
  static void Main(string[] args)
  {
     Rectangle rect = new Rectangle
      { Length = 10.0, Width = 20.0 };
     Console.WriteLine(“Shape Name: {0}, Area: {1}”,
      Rectangle.ShapeName,
      rect.GetArea());
  }
}
3. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de console s'ouvre
pour afficher le nom et l'aire de la forme.
4. ENREGISTREZ votre projet.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Lorsqu'une instance d'une classe est créée, une copie distincte est créée pour chaque champ
d'instance, mais une seule copie d'un champ statique est partagée par toutes les instances.
PRÊT POUR LA
CERTIFICATION Un membre statique ne peut pas être référencé via un objet d'instance. Au lieu de cela,
Comprenez-vous les un membre statique est référencé via le nom de la classe (comme Rectangle.ShapeName
notions fondamentales dans l'exercice ci-dessus). Notez qu'il n'est pas possible d'utiliser la référence de mot clé
sur les classes ? this avec une méthode ou une propriété statique, car le mot clé this peut uniquement être
2.1 utilisé pour accéder aux objets d'instance.

■ Présentation des valeurs et des références

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

Présentation des tests de logiciels

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.

Présentation de la gestion des mises en production


L'activité de gestion des mises en production permet de gérer le déploiement, la
livraison et la prise en charge des versions logicielles.

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.

■ Présentation des tests


Exercices étape par étape
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 46 | Leçon 2
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
name, le composant d'exécution saura que son contenu n'est pas stocké dans la variable
comportement réel du système, un défaut de logiciel (ou « bogue ») est consigné et
elle-même, mais plutôt à l'emplacement de mémoire pointé par la variable.
transmis à une personne qui est chargée de le résoudre.
Les tests des logiciels peuvent impliquer des essais fonctionnels et non fonctionnels. COPIER LES TYPES VALEUR ET RÉFÉRENCE
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, 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 :

Alerte Prêt pour struct Point


{

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)

« Remarque » déclarer Point p1; pour


créer une variable de
type struct.

{
Point p1 = new Point();
p1.X = 10;
p1.Y = 20;
Point p2 = p1;
p2.X = 100;
Console.WriteLine(“p1.X = {0}”, p1.X);
Rectangle rect1 = new Rectangle
Introduction à la programmation | 7
{ Length = 10.0, Width = 20.0 };
REMARQUE
* Rectangle rect2 = rect1;
Figure 1-3
Lorsque vous copiez rect2.Length = 100.0;
Listing d'un programme avec
des numéros de ligne une variable de type Console.WriteLine(“rect1.Length = {0}”,
référence sur une autre rect1.Length);
variable du même type,

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.

d'écran variables pointent vers


le même objet.
4. ENREGISTREZ votre projet.
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
Un programme C# est constitué d'une ou de plusieurs classes. Une classe est un ensemble disponible dans leurs emplacements de mémoire respectifs. Donc, lorsque l'instruction
de données et de méthodes. Par exemple, le code de la figure 1-3 définit une classe simple suivante est exécutée :

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

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 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 méthodes de test de logiciels sont généralement divisées en deux catégories :


tests de boîte blanche et de boîte noire.

Traditionnellement, il existe deux approches générales des tests de logiciels :


• Tests de boîte noire
• Tests de boîte blanche
Les tests de boîte noire traitent le logiciel comme une « boîte noire » et, à ce titre,
se concentrent uniquement sur les entrées et les sorties. Avec cette approche, les
connaissances du fonctionnement interne du système ne sont pas utilisées pendant le test.
En revanche, avec les tests de boîte blanche, les testeurs s'appuient sur leur connaissance
du fonctionnement interne du système lors du test. Par exemple, dans les tests de boîte
blanche, les testeurs ont accès au code source.
Ces deux techniques de test se complètent mutuellement. Les tests de boîte noire sont
généralement utilisés pour vérifier qu'une application logicielle respecte toutes ses
spécifications. En revanche, les tests de boîte blanche permettent de vérifier qu'il existe
des cas de test appropriés pour chaque méthode ou fonction.

Présentation des niveaux de test Résumé des compétences


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é. Présentation des bases de données | 173

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.

64 | Leçon 2 Évaluation des ■ Évaluation des connaissances

connaissances Compléter l'espace vide


Complétez les phrases suivantes en écrivant le ou les mots corrects dans l'espace fourni.
■ Évaluation des compétences
1. Pour qu'une table se trouve dans la _______________, aucune des colonnes ne doit
contenir plusieurs valeurs sur la même ligne de données.
Scénario 2-1 : Création de propriétés
2. La _______________ exige que toutes les colonnes ne correspondant pas à une clé
Vous devez créer une classe appelée Product qui représente un produit. Cette classe a une soient fonctionnellement dépendantes de l'intégralité de la clé primaire.
seule propriété appelée Name. Les utilisateurs de la classe Product doivent pouvoir obtenir
et définir la valeur de la propriété Name. Toutefois, à chaque tentative de définition de 3. La _______________ exige qu'il n'existe aucune dépendance fonctionnelle entre les
la valeur Name sur une chaîne vide ou une valeur nulle, une exception doit être levée. attributs ne correspondant pas à une clé.
De plus, les utilisateurs de la classe Product ne doivent pas pouvoir accéder à d'autres 4. Les éléments de base essentiels d'un diagramme d'entité-relation sont
membres de données de la classe Product. Comment allez-vous créer une telle classe ? _______________, _______________ et _______________.

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

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 ?

Scénario 2-2 : Création et gestion d'événements


Imaginons que vous écrivez du code pour créer et gérer des événements dans votre
Scénarios
programme. La classe SampleClass doit implémenter l'interface suivante :
public delegate void SampleDelegate();
public interface ISampleEvents
{
  event SampleDelegate SampleEvent;
  void Invoke();
}
Vous devez écrire du code pour la classe SampleClass et pour une méthode de test qui crée
une instance de la classe SampleClass et appelle l'événement. Quel code devez-vous écrire ?

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

MSDN ACADEMIC ALLIANCE — ABONNEMENT DE 3 ANS


GRATUIT OFFERT AUX UTILISATEURS QUALIFIÉS !
Le programme Microsoft Developer Network Academic Alliance (MSDN AA) est
conçu pour fournir le moyen le plus simple et le plus économique pour les universités
de rendre les derniers outils de développement, produits et technologies de Microsoft
disponibles dans les laboratoires, salles de classe et sur les PC des étudiants. MSDN
AA est un programme d'abonnement annuel destiné aux départements d'enseignement
des cours de sciences, technologie, ingénierie et mathématiques. L'abonnement offre
une solution complète destinée à permettre aux laboratoires universitaires, professeurs
et étudiants de rester à la pointe de la technologie.
Les logiciels disponibles dans le programme MSDN AA sont offerts gratuitement
aux départements qui s'abonnent dans le cadre du partenariat d'édition entre Wiley et
Microsoft.
En prime dans cette offre gratuite, les programmes Faculty Connection et
Academic Resource Center de Microsoft seront présentés dans les universités.
Il faut du temps et de la préparation pour maintenir les étudiants impliqués tout
en leur donnant une compréhension fondamentale de la théorie. Le programme
Faculty Connection de Microsoft est conçu pour aider les professeurs dans les
domaines des sciences, de la technologie, de l'ingénierie et des mathématiques
à accomplir cela. Ce programme leur fournit des articles, des programmes et
des outils qu'ils peuvent utiliser pour motiver et impliquer les élèves dans les
technologies d'aujourd'hui.
* Contactez votre représentant Wiley pour plus de détails.
Pour plus d'informations sur le programme MSDN Academic Alliance, rendez-vous sur :
http://msdn.microsoft.com/academic/
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.

� Adresses Web et numéros de téléphone importants


Pour localiser le représentant de l'enseignement supérieur Wiley dans votre
région, rendez-vous sur http://www.wiley.com/college et cliquez sur le lien
« Who’s My Rep? » (Qui est mon représentant) situé en haut de la page, ou appelez
le numéro gratuit du programme MOAC : 1 + (888) 764-7001 (États-Unis et
Canada uniquement).
Pour savoir comment devenir Microsoft Certified Technology Specialist et connaître la
disponibilité de l'examen, visitez le site www.microsoft.com/learning/mcp/mcp.

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.

Wiley Desktop Editions


Les éditions Wiley MOAC Desktop Editions sont des versions électroniques novatrices
des manuels imprimés. Les étudiants achètent la version de bureau jusqu'à 50 % moins
cher que le prix américain du texte imprimé, et ils obtiennent la valeur ajoutée de la
permanence et la portabilité. Les éditions Wiley Desktop Editions fournissent également
aux étudiants de nombreux avantages supplémentaires qui ne sont pas disponibles avec
d'autres solutions de texte électronique.
Les éditions Wiley Desktop Editions ne sont PAS des abonnements. Les étudiants
téléchargent l'édition Wiley Desktop Edition sur le bureau de leurs ordinateurs. Les étudiants
sont propriétaires du contenu qu'ils achètent et peuvent le conserver aussi longtemps
qu'ils le souhaitent. Une fois une édition Wiley Desktop Edition téléchargée sur le bureau
de l'ordinateur, les étudiants ont un accès instantané à tout le contenu sans être en ligne.
Les étudiants peuvent imprimer les sections qu'ils préfèrent lire sur support papier. Les
étudiants ont également accès à des ressources entièrement intégrées au sein de leur Wiley
Desktop Edition. De la mise en surbrillance du texte électronique à la prise et au partage
de notes, les étudiants peuvent facilement personnaliser leur édition Wiley Desktop
Edition au fur et à mesure de leurs lectures ou en classe.

�À propos de la certification Microsoft Technology


Associate (MTA)
Préparer la main-d'œuvre technologique de demain
La technologie joue un rôle dans pratiquement toutes les entreprises du monde entier.
Posséder des connaissances fondamentales du fonctionnement d'une technologie et
comprendre son impact sur l'environnement académique et professionnel d'aujourd'hui
est de plus en plus important, en particulier pour les étudiants qui souhaitent explorer
des professions qui impliquent des technologies. C'est pourquoi Microsoft a créé la
certification Microsoft Technology Associate (MTA), un nouveau programme de crédit de
niveau débutant qui valide les connaissances technologiques fondamentales des étudiants
qui cherchent à faire carrière dans les technologies.
La certification Microsoft Technology Associate (MTA) est le moyen idéal et privilégié
d'accéder aux programmes de certification technologiques de renommée mondiale de
Microsoft, tels que Microsoft Certified Technology Specialist (MCTS) et Microsoft
Certified IT Professional (MCITP). MTA est en passe de devenir le premier programme
de certification destiné aux personnes qui cherchent à explorer et à poursuivre une carrière
dans les technologies ou renforcer leurs connaissances dans des activités connexes telles
que l'entreprise ou tout autre domaine où la technologie est omniprésente.

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

Profil du candidat à la certification MTA


Le programme de certification MTA est conçu spécifiquement pour les étudiants de
niveau secondaire et post-secondaire qui souhaitent explorer des options universitaires et
professionnelles dans un domaine technologique. Il offre aux étudiants une certification
en informatique de base et en développement. En tant que nouveau point d'entrée
recommandé pour les certifications technologiques Microsoft, MTA est destiné tout
spécialement aux étudiants qui découvrent l'informatique et le développement de logiciels.
Il est disponible exclusivement dans les contextes éducatifs et s'intègre facilement dans les
programmes des cours d'informatique existants.

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).

Fourniture des examens MTA : la licence Campus MTA

Avec la licence Campus de MTA, mettre en œuvre un nouveau programme de certification


dans votre salle de classe n'a jamais été aussi facile. L'achat d'une licence Campus de
MTA annuelle, rend inutile les demandes de budget ad hoc et les achats récurrents de
bons d'examens. Désormais, vous pouvez prévoir un budget pour un petit prix pour toute
l'année et donner accès aux examens MTA à vos étudiants et autres professeurs dans
l'ensemble de votre campus où et quand vous le voulez.
La licence Campus de MTA fournit une suite pratique et abordable de certifications
technologiques de niveau débutant conçue pour donner des moyens aux éducateurs et
motiver les étudiants au fur et à mesure qu'ils construisent les fondations de leur carrière.
La licence Campus de MTA est administrée par Certiport, fournisseur exclusif d'examen
MTA de Microsoft.
Pour en savoir plus sur comment obtenir la certification Microsoft Technology Associate,
ainsi que sur la disponibilité de l'examen, visitez le site www.microsoft.com/learning/mta.

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

�Activez votre test pratique GRATUIT pour la


certification MTA !
Votre achat de ce livre vous donne droit à un test pratique gratuit pour la certification
MTA de GMetrix (d'une valeur de 30 $). Rendez-vous sur www.gmetrix.com/mtatests
et utilisez le code de validation suivant pour activer votre test gratuit :
MTA98-361-A19875B7D810
Le système de gestion des compétences GMetrix fournit tout ce dont vous avez besoin
pour vous entraîner pour la certification Microsoft Technology Associate (MTA).
Présentation des fonctionnalités de test :
• Carte des tests pratiques en fonction des objectifs de l'examen Microsoft Technology
Associate (MTA)
• Les tests pratiques de la certification MTA de GMetrix simulent l'environnement de
test MTA réel
• Plus de 50 questions par test, qui couvrent tous les objectifs
• Progressez à votre propre rythme, enregistrez le test pour reprendre plus tard et revenir
aux questions ignorées
• Rapports détaillés et imprimables sur les notes, qui soulignent les domaines qui
requièrent une étude plus approfondie
Pour tirer le meilleur parti de votre préparation de MTA, profitez de votre test pratique
gratuit pour la certification MTA GMetrix dès aujourd'hui !
Pour des questions de support technique sur l'installation ou l'activation du code, veuillez
envoyer un message électronique à support@gmetrix.com.

www.wiley.com/college/microsoft ou
appelez le numéro gratuit de MOAC : 1 + (888) 764-7001 (États-Unis et Canada uniquement)
Remerciements

� MOAC MTA - Réviseurs des notions technologiques fondamentales


Nous aimerions remercier les nombreux réviseurs qui ont relu le manuscrit et fourni de précieux commentaires
destinés à améliorer la qualité du matériel pédagogique :

Yuke Wang, Université du Texas à Dallas David Koppy, Baker College


Palaniappan Vairavan, Bellevue College Sharon Moran, Hillsborough Community College
Harold « Buz » Lamson, ITT Technical Institute Keith Hoell, Briarcliffe College et Queens College,
Colin Archibald, Valencia Community College CUNY
Catherine Bradfield, DeVry University en ligne Mark Hufnagel, district scolaire du comté de Lee
Robert Nelson, Blinn College Rachelle Hall, Glendale Community College
Kalpana Viswanathan, Bellevue College Scott Elliott, Christie Digital Systems, Inc.
Bob Becker, Vatterott College Gralan Gilliam, Kaplan
Carol Torkko, Bellevue College Steve Strom, Butler Community College
Bharat Kandel, Missouri Tech John Crowley, Bucks County Community College
Linda Cohen, Forsyth Technical Community College Margaret Leary, Northern Virginia Community College
Candice Lambert, Metro Technology Centers Sue Miner, Lehigh Carbon Community College
Susan Mahon, Collin College Gary Rollinson, Cabrillo College
Mark Aruda, Hillsborough Community College Al Kelly, University of Advancing Technology
Claude Russo, Brevard Community College Katherine James, Seneca College

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

2 Introduction à la programmation orientée objet 32

3 Présentation générale du développement logiciel 65

4 Présentation des applications Web 85

5 Présentation des applications de bureau 120

6 Présentation des bases de données 142

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

Leçon 1 : Introduction à la Présentation de l'héritage 48


Présentation des classes abstraites et sealed 50
programmation 1 Héritage à partir d'une classe Object 51
Cast entre des types 52
Matrice des différents objectifs 1
Présentation du polymorphisme 53
Termes clés 1 Présentation des mots clés override et new 55
Présentation de la programmation informatique 2 Présentation des interfaces 56
Présentation des algorithmes 2
Résumé des compétences 58
Présentation de C# 4
Évaluation des connaissances 59
Présentation des structures de décision 11
Instruction if 11 Évaluation des compétences 64
Instruction if-else 13 Évaluation de la maîtrise des concepts 64
Instruction switch 15
Présentation des structures de répétition 17
Présentation de la boucle While 17
Présentation de la boucle Do-While 19
Leçon 3 : Présentation générale du
Présentation de la boucle For 20 développement logiciel 65
Présentation de la boucle Foreach 21
Présentation de la récursivité 22 Matrice des différents objectifs 65
Présentation de la gestion des exceptions 23 Termes clés 65
Gestion des exceptions 24 Présentation de la gestion du cycle de vie des
Utilisation de Try-Catch-Finally 25 applications 66
Résumé des compétences 26 Présentation de l'analyse des spécifications 66
Évaluation des connaissances 27 Présentation du processus de conception 67
Présentation du développement logiciel 67
Évaluation des compétences 30
Présentation des tests de logiciels 68
Évaluation de la maîtrise des concepts 31 Présentation de la gestion des mises en production 68
Présentation des tests 68
Leçon 2 : Introduction à la Présentation des méthodes de test 69
programmation orientée Présentation des niveaux de test 69
objet 32 Présentation des structures de données 70
Présentation des tableaux 70
Matrice des différents objectifs 32 Présentation des files d'attente 72
Présentation des piles 73
Termes clés 32
Listes liées 74
Présentation des objets 33
Présentation des algorithmes de tri 76
Réflexion orientée objet 33
Présentation de BubbleSort 76
Présentation des classes 33
Présentation de QuickSort 79
Présentation des valeurs et des références 44
Résumé des compétences 81
Présentation des structs 44
Présentation de l'allocation de mémoire 45 Évaluation des connaissances 81
Présentation de l'encapsulation 47 Évaluation des compétences 83
Présentation des modificateurs d'accès 48 Évaluation de la maîtrise des concepts 84

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

Compétences/Concepts Objectif de l'examen MTA Numéro de l'objectif de


l'examen MTA
Présentation de la programmation Comprendre le stockage 1.1
informatique informatique et les types
de données.
Présentation des structures Comprendre les structures 1.2
de décision de décision en informatique.
Présentation des structures Identifier la méthode appropriée 1.3
de répétition pour gérer les répétitions.
Présentation de la gestion Comprendre la gestion 1.4
des exceptions des erreurs.

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.

■ Présentation de la programmation informatique


Un programme informatique est un ensemble d'instructions précises pour effectuer
une tâche. Dans cette section, vous apprendrez comment écrire des algorithmes et des
L'ESSENTIEL programmes informatiques pour résoudre un problème donné. En plus d'écrire votre
premier programme informatique à l'aide du langage de programmation C#, vous
découvrirez également la structure de base des programmes informatiques et comment
compiler, exécuter, fournir des données et générer des résultats à partir d'un programme.

Présentation des algorithmes


Un algorithme est une suite finie et ordonnée d’opérations permettant de résoudre un
problème.
Le terme algorithme fait référence à une méthode pour résoudre les problèmes. Les
algorithmes peuvent être décrits en français, mais ces descriptions sont souvent mal
interprétées en raison de la complexité et de l'ambiguïté d'un langage naturel. Par conséquent,
les algorithmes sont souvent rédigés dans des formats simples et plus précis, comme
des organigrammes, des arbres de décision et des tables de décision, qui représentent un
algorithme sous la forme d'un diagramme, d'une table ou d'un graphique. Ces techniques sont
souvent utilisées avant d'écrire des programmes afin d'avoir une meilleure compréhension de
la solution.
Ces outils de développement d'algorithmes pourraient vous aider à exprimer une solution
d'une manière facile à utiliser, mais ils ne peuvent pas être compris directement par
un ordinateur. Pour qu'un ordinateur comprenne votre algorithme, vous devez écrire
un programme informatique d'une manière plus formelle en utilisant un langage de
programmation tel que C#. Vous allez découvrir cela plus en détail dans la section suivante.
En attendant, cette section de la leçon se concentre sur deux techniques pour présenter vos
algorithmes (à savoir, des organigrammes et des tables de décision) qui sont plus précises qu'un
langage naturel, mais moins formelles et plus faciles à utiliser qu'un langage informatique.
PRÉSENTATION DES ORGANIGRAMMES
Un organigramme est une représentation graphique d'un algorithme. Un organigramme est
généralement créé à l'aide de symboles standard. Certains symboles d'organigramme courants

Tableau 1-1 Symbole


Descrip on
d'organigramme
Symboles courants d'un
organigramme
Début ou fin d'un algorithme

Processus ou calcul

Opéraon d'entrée ou de sore

Opéraon de prise de décision

Spécifie le flux de contrôle


Introduction à la programmation | 3

sont indiqués dans le tableau 1-1.

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.

PRÉSENTATION DES TABLES DE DÉCISION


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
de décision pour calculer une remise. Cette table génère un pourcentage de remise selon la
quantité de produit achetée. Les lignes en gras de la table de décision la divisent en quatre
quadrants. Le premier quadrant (en haut à gauche) spécifie les conditions (« quantité  10 » etc.).
Le deuxième quadrant (en haut à droite) spécifie les règles. Les règles sont les combinaisons
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
d'action correspondant à chaque règle.
4 | leçon 1

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

Dans ce cours, vous utiliserez un environnement de développement intégré (IDE) pour


développer votre code. Vous pouvez utiliser Visual Studio ou l'édition Visual Studio Express
gratuite pour écrire votre code. Ces outils vous fournissent un environnement hautement
productif pour développer et tester vos programmes.

ÉCRIRE UN PROGRAMME C#

PRÉPAREZ-VOUS. Pour écrire un programme C#, procédez comme suit :


1. Démarrez Visual Studio. Sélectionnez Fichier >Nouveau projet. Sélectionnez
les modèles Application console Visual C#.
2. Tapez IntroducingCS dans la zone Nom. Vérifiez que la case a cocher Créer
le répertoire pour la solution est activée, puis entrez le nom leçon01 dans la zone
Nom de la solution. Cliquez sur OK pour créer le projet.
3. Lorsque le projet est créé, vous remarquerez que Visual Studio a déjà créé un fichier
nommé Program.cs et écrit un modèle pour vous.
4. Modifiez le modèle afin qu'il ressemble au code suivant :
using System;
namespace leçon01
{
  class Program
REMARQUE
*   {
C# est un langage     static void Main(string[] args)
de programmation qui     {
respecte la casse. Ainsi,       Console.WriteLine(“hello, world!”);
si vous tapez « Classe »     }
au lieu de « classe » (par   }
exemple), cela entraîne }
une erreur 5. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
de syntaxe.
6. Vous verrez le résultat du programme dans une fenêtre de commande, comme illustré
dans la figure 1-2.

Figure 1-2
Résultat du programme dans
une fenêtre de commande.

Vous pouvez également exécuter le programme en ouvrant une fenêtre de commande


AUTRE MÉTHODE
(cmd.exe) et en naviguant ensuite vers le dossier de sortie du projet, qui par défaut est le
sous-dossier bin\debug sous l'emplacement du projet. Démarrez le programme en tapant
le nom du programme dans la fenêtre de commande et en appuyant sur Entrée.

7. Appuyez sur une touche pour fermer la fenêtre de commande.


PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
6 | leçon 1

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.

Si vous n'utilisez pas d'environnement de développement intégré (IDE) comme Visual


Studio, vous pouvez toujours compiler votre programme manuellement en utilisant les outils
de ligne de commande. Visual Studio, bien entendu, permet de tester plus facilement et plus
rapidement vos programmes.

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.

PRÉSENTATION DE LA STRUCTURE D'UN PROGRAMME C#

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.

PRÉSENTATION DES VARIABLES

Les variables fournissent un stockage temporaire pendant l'exécution d'un programme.

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.

PRÉSENTATION DES CONSTANTES

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.

PRÉSENTATION DES TYPES DE DONNÉES

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.

PRÉSENTATION DES TABLEAUX

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 = *= /= %= += -= <<= >>= &= ^= |=

L'opérateur d'incrémentation unaire (++) ajoute 1 à la valeur d'un identificateur. De même,


l'opérateur de décrémentation (−−) soustrait 1 de la valeur d'un identificateur. Les opérateurs
unaires d'incrémentation et de décrémentation peuvent être utilisés soit comme préfixes soit
comme suffixes. Par exemple :
Introduction à la programmation | 11

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.

■  Présentation des structures de décision

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

L'instruction if exécute une séquence d'instructions donnée uniquement si l'expression


booléenne correspondante est évaluée comme True.
12 | leçon 1

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

PRÉPAREZ-VOUS. Pour utiliser l'instruction if, procédez comme suit :


1. Ajoutez un nouveau projet Application console (nommé if_Statement) à la solution
Leçon01.
2. Ajoutez le code suivant à la méthode Main de la classe Program.cs :
int number1 = 10;
int number2 = 20;
if (number2 > number1)
{
Console.WriteLine(“number2 is greater than number1”);
}
3. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
4. Vous verrez le résultat du programme dans une fenêtre de commande.
5. Appuyez sur une touche pour fermer la fenêtre de commande.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Ce code est fonctionnellement équivalent à l'organigramme de la figure 1-4.

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

Ici, l'instruction de sortie sera exécutée uniquement si l'expression booléenne entre


parenthèses a la valeur True. Si l'expression a la valeur False, le contrôle passe à l'instruction
suivante après l'instruction if.
Introduction à la programmation | 13

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

L'instruction if-else autorise 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.

Procédez comme suit pour créer un exemple de programme qui utilise l'instruction if-else.

UTILISER L'INSTRUCTION IF-ELSE

PRÉPAREZ-VOUS. Pour utiliser l'instruction if-else, procédez comme suit :


1. Ajoutez un nouveau projet Application console (nommé ifelse_Statement) à la solu-
tion Leçon01.
14 | leçon 1

2. Ajoutez le code suivant à la méthode Main de la classe Program.cs :


TestIfElse(10);
3. Ensuite, ajoutez la méthode suivante à la classe Program.cs :
public static void TestIfElse(int n)
{
  if (n < 10)
  {
   Console.WriteLine(“n is less than 10”);
  }
  else if (n < 20)
  {
   Console.WriteLine(“n is less than 20”);
  }
  else if (n < 30)
  {
   Console.WriteLine(“n is less than 30”);
  }
  else
  {
   Console.WriteLine(“n is greater than or equal to 30”);
  }
}
4. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
5. Vous verrez le résultat du programme dans une fenêtre de commande.
6. Appuyez sur une touche pour fermer la fenêtre de commande.
7. Modifiez le code de la méthode Main pour appeler la méthode TestIfElse avec des
valeurs différentes. Notez qu'une branche différente de l'instruction if-else est
exécutée à la suite de vos modifications.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Ici, le code dans la méthode TestIfElse combine plusieurs instructions if-else pour tester plu-
sieurs conditions. Par exemple, si la valeur de n est de 25, alors les deux premières conditions
(n < 10 et n < 20) correspondent à la valeur False, mais la troisième condition
(n < 30) a la valeur True. Par conséquent, la méthode affichera le résultat suivant :
n est inférieur à 30
Ce programme C# est équivalent à l'organigramme de la figure 1-5.
Introduction à la programmation | 15

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.

UTILISER L'INSTRUCTION SWITCH

PRÉPAREZ-VOUS. Pour utiliser l'instruction switch, procédez comme suit :


1. Ajoutez un nouveau projet Application console (nommé switch_Statement)
à la solution Leçon01.
2. Ajoutez le code suivant à la méthode Main de la classe Program.cs :
TestSwitch(10, 20, ’+’);
16 | leçon 1

3. Ajoutez la méthode suivante à la classe Program.cs :


public static void TestSwitch(int op1, int op2, char opr)
{
   int result;
   switch (opr)
   {
    scénario ’+’:
     result = op1 + op2;
     break;
    scénario ’−’:
     result = op1 − op2;
     break;
    scénario ’*’:
     result = op1 * op2;
     break;
    scénario ’/ ’:
REMARQUE
*      result = op1 / op2;
Les méthodes Console.      break;
Write et Console.     default:
WriteLine peuvent
     Console.WriteLine(“Unknown Operator”);
utiliser des chaînes
de format telles que      return;
« Results: {0} » pour    }
mettre en forme le    Console.WriteLine(“Result: {0}”, result);
résultat. Ici, la chaîne
   return;
{0} représente le
premier argument }
fourni après la chaîne 4. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
de format. Dans la 5. Vous verrez le résultat du programme dans une fenêtre de commande.
méthode TestSwitch, la
6. Appuyez sur une touche pour fermer la fenêtre de commande.
chaîne de format « {0} »
est remplacée par la 7. Modifiez le code de la méthode Main pour appeler la méthode TestSwitch avec
valeur de l'argument des valeurs différentes. Notez qu'une branche différente de l'instruction switch est
suivant : result. exécutée à la suite de vos modifications.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Ici, la méthode TestSwitch accepte deux opérandes (op1 et op2) et un opérateur (opr)
et évalue l'expression qui en résulte. La valeur de l'expression switch est comparée aux
instructions case dans le bloc switch. S'il existe une correspondance, les instructions qui
suivent l'instruction case correspondante sont exécutées. Si aucune des instructions case ne
correspond, le contrôle est alors transféré à la branche default facultative.
Notez qu'il y a une instruction break après chaque cas. L'instruction break termine
l'instruction switch et transfère le contrôle à l'instruction suivante à l'extérieur du bloc switch.
Une pause permet de s'assurer qu'une seule branche est exécutée et permet d'éviter des
erreurs de programmation. En fait, si vous spécifiez du code après l'instruction case, vous
devez inclure une pause (ou une autre instruction de transfert du contrôle, telle que le renvoi)
pour vous assurer que le contrôle ne passe pas d'une étiquette case à une autre.
Introduction à la programmation | 17

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.

■ Présentation des structures de répétition

C# a quatre structures de contrôle différentes qui permettent aux programmes d'exécuter


L'ESSENTIEL des tâches répétitives : la boucle while, la boucle do-while, la boucle for et la boucle
foreach.

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

La boucle while répète un bloc d'instructions jusqu'à ce qu'une expression booléenne


soit évaluée comme False.
18 | leçon 1

La forme générale de la boucle while est la suivante :


REMARQUE
* while (boolean test)
Avec la boucle while, le
test booléen doit être   statement
placé à l'intérieur des Ici, un test booléen est effectué au début de la boucle. Si le test a la valeur True, le corps de la
parenthèses. Si plusieurs boucle est exécuté et l'essai est effectué à nouveau. Si le test renvoie la valeur False, la boucle
instructions doivent être se termine et le contrôle est transféré à l'instruction suivante après la boucle.
exécutées dans le cadre
de la boucle while, elles Comme le test booléen est effectué avant l'exécution de la boucle, il est possible que le corps
doivent être placées d'une boucle while ne soit jamais exécuté. Cela se produit si le test renvoie la valeur False la
ensemble à l'intérieur première fois.
des accolades. Procédez comme suit pour créer un programme qui utilise la boucle while.

UTILISER LA BOUCLE WHILE

PRÉPAREZ-VOUS. Pour utiliser la boucle while, procédez comme suit :


1. Ajoutez un nouveau projet Application console (nommé while_Statement)
à la solution Leçon01.
2. Ajoutez le code suivant à la méthode Main de la classe Program.cs :
WhileTest();
3. Ajoutez la méthode suivante à la classe Program.cs :
private static void WhileTest()
{
  int i = 1;
  while (i <= 5)
  {
   Console.WriteLine(“The value of i = {0}”, i);
   i++;
  }
}
4. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
5. Vous verrez le résultat du programme dans une fenêtre de commande.
6. Appuyez sur une touche pour fermer la fenêtre de commande.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Dans cet exercice, la valeur 1 est attribuée à la variable i. Ensuite, la condition de boucle while
est évaluée. Comme la condition est vraie (1 < = 5), le code du bloc d'instructions while est
exécuté. La valeur de i est écrite dans la fenêtre de commande, elle est ensuite augmentée
de 1 pour passer à 2. Le contrôle repasse ensuite à l'instruction while et la condition est à
nouveau évaluée. Parce que la condition est toujours vraie (2 < = 5), le bloc d'instructions est
exécuté une fois de plus. La boucle continue jusqu'à ce que la valeur de i passe à 6 et que la
condition de la boucle while devienne fausse (6 < = 5). La méthode ci-dessus, lorsqu'elle est
exécutée, génère le résultat suivant :
La valeur de i = 1
La valeur de i = 2
La valeur de i = 3
La valeur de i = 4
La valeur de i = 5
L'équivalent de l'organigramme de cette boucle while est illustré dans la figure 1-6.
Introduction à la programmation | 19

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.

Présentation de la boucle Do-While

La boucle do-while répète un bloc d'instructions jusqu'à ce qu'une expression booléenne


soit évaluée comme False. La boucle do-while teste la condition dans la partie inférieure
REMARQUE
* de la boucle.
Avec la boucle do-while,
le test booléen doit être
placé à l'intérieur des La boucle do-while est similaire à la boucle while mais, contrairement à la boucle while, le
parenthèses. Si plusieurs corps de la boucle do-while doit être exécuté au moins une fois.
instructions doivent être La forme générale de la boucle do-while est la suivante :
exécutées dans le cadre
de la boucle do-while, do
elles doivent être placées    statement
ensemble à l'intérieur des while (boolean test);
accolades.
Procédez comme suit pour créer un programme qui utilise la boucle do-while.
20 | leçon 1

UTILISER LA BOUCLE DO-WHILE

PRÉPAREZ-VOUS. Pour utiliser la boucle do-while, procédez comme suit :


1. Ajoutez un nouveau projet Application console (nommé dowhile_Statement)
à la solution Leçon01.
2. Ajoutez le code suivant à la méthode Main de la classe Program.cs :
DoWhileTest();
3. Ajoutez la méthode suivante à la classe Program.cs :
private static void DoWhileTest()
{
   int i = 1;
   do
   {
    Console.WriteLine(“The value of i = {0}”, i);
    i++;
   }
   while (i <= 5);
}
4. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
5. Vous verrez le résultat du programme dans une fenêtre de commande.
6. Appuyez sur une touche pour fermer la fenêtre de commande.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Dans cet exercice, une fois que la valeur 1 est affectée à la variable i, le contrôle entre
directement dans la boucle. À ce stade, le code du bloc d'instructions do-while est exécuté. Plus
précisément, la valeur de i est écrite dans la fenêtre de commande et elle est augmentée de 1
afin d'atteindre 2. Ensuite, la condition de la boucle do-while est évaluée. Comme la condition
est toujours vraie (2 < = 5), le contrôle repasse à l'instruction do-while et le bloc d'instructions
est exécuté à nouveau. La boucle continue jusqu'à ce que la valeur de i passe à 6 et que la
condition de la boucle do-while devienne fausse (6 < = 5). La méthode ci-dessus, lorsqu'elle est
exécutée, génère le même résultat que la méthode WhileTest.
Le choix entre une boucle while et une boucle do-while varie si vous voulez que la boucle
s'exécute au moins une fois. Si vous souhaitez que la boucle s'exécute zéro ou plusieurs
fois, choisissez la boucle while. En revanche, si vous voulez que la boucle s'exécute une ou
plusieurs fois, choisissez la boucle do-while.
REMARQUE
*
Avec la boucle for, les Présentation de la boucle For
trois expressions de
contrôle doivent être La boucle for combine les trois éléments d'itération (l'expression d'initialisation,
placées à l'intérieur des l'expression de condition de terminaison et l'expression de comptage) dans un code plus
parenthèses. Si plusieurs lisible.
instructions doivent
être exécutées dans le La boucle for est similaire à la boucle while. Elle permet d'exécuter une instruction ou un
cadre de la boucle, elles bloc d'instructions à plusieurs reprises jusqu'à ce qu'une expression soit évaluée comme False.
doivent être placées La forme générale de la boucle est comme suit :
ensemble à l'intérieur
des accolades. for (init-expr; cond-expr; count-expr)
  statement
Introduction à la programmation | 21

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.

UTILISER LA BOUCLE FOR

PRÉPAREZ-VOUS. Pour utiliser la boucle for, procédez comme suit :


1. Ajoutez un nouveau projet Application console (nommé for_Statement) à la solu-
tion Leçon01.
2. Ajoutez le code suivant à la méthode Main de la classe Program.cs :
ForTest();
3. Ajoutez la méthode suivante à la classe Program.cs :
private static void ForTest()
{
   for(int i = 1; i<= 5; i++)
   {
    Console.WriteLine(“The value of i = {0}”, i);
   }
}
4. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
5. Vous verrez le résultat du programme dans une fenêtre de commande.
6. Appuyez sur une touche pour fermer la fenêtre de commande.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
La méthode ForTest ci-dessus, lorsqu'elle est exécutée, génère le même résultat que la
méthode WhileTest. Ici, la variable i est créée dans le cadre de la boucle for et la valeur 1 lui
est affectée. La boucle continue tant que la valeur de i est inférieure ou égale à 5. Après le
corps de la boucle, count-expr est évalué et le contrôle revient à cond-expr.
Toutes les expressions de contrôle d'une boucle for sont facultatives. Par exemple, vous
pouvez omettre toutes les expressions pour créer une boucle infinie comme ceci :
for (; ;)
{
   //do nothing
}

Présentation de la boucle Foreach

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.

UTILISER LA BOUCLE FOREACH

PRÉPAREZ-VOUS. Pour utiliser la boucle foreach, procédez comme suit :


1. Ajoutez un nouveau projet Application console (nommé foreach_Statement)
à la solution Leçon01.
2. Ajoutez le code suivant à la méthode Main de la classe Program.cs :
ForEachTest() ;
3. Ajoutez la méthode suivante à la classe Program.cs :
private static void ForEachTest()
{
   int[] numbers = { 1, 2, 3, 4, 5 };
   foreach (int i in numbers)
   {
    Console.WriteLine(“The value of i = {0}”, i);
   }
}
4. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
5. Vous verrez le résultat du programme dans une fenêtre de commande.
6. Appuyez sur une touche pour fermer la fenêtre de commande.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Dans cet exercice, la boucle parcourt séquentiellement chaque élément de la collection, les
numérote et les affiche dans la fenêtre de commande. Cette méthode génère le même résultat
que la méthode ForTest.

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

exemple, vous pouvez décomposer 3! comme ceci : 3! = 3 * 2! —> 3 * 2 * 1! —> 3 * 2 * 1 *


0! —> 3 * 2 * 1 * 1 —> 6.
Procédez comme suit pour créer un programme qui présente une solution récursive d'un
problème de factorielle.

UTILISER LA MÉTHODE RÉCURSIVE

PRÉPAREZ-VOUS. Pour utiliser la méthode récursive, procédez comme suit :


1. Ajoutez un nouveau projet Application console (nommé RecursiveFactorial)
à la solution Leçon01.
2. Ajoutez le code suivant à la méthode Main de la classe Program.cs :
Factorial(5);
3. Ajoutez la méthode suivante à la classe Program.cs :
public static int Factorial(int n)
{
   if (n == 0)
   {
    return 1; //base case
   }
   else
   {
    return n * Factorial(n - 1); //recursive case
   }
}
4. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
5. Vous verrez le résultat du programme dans une fenêtre de commande.
6. Appuyez sur une touche pour fermer la fenêtre de commande.
7. Modifiez la méthode Main pour transmettre une valeur différente à la méthode
factorielle et notez les résultats.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Comme nous l'avons vu dans l'exercice ci-dessus, une solution récursive comprend deux par-
ties distinctes :
• Scénario de référence : il s'agit de la partie qui spécifie la condition de terminaison et qui
n'appelle pas à nouveau la méthode. Le scénario de référence de la méthode factorielle
est n == 0. Si vous n'avez pas de scénario de référence dans votre algorithme récursif,
PRÊT POUR LA vous créez une récurrence infinie. Une récurrence infinie va saturer la mémoire de votre
CERTIFICATION ordinateur et va lever une exception System.StackOverflowException.
Pouvez-vous identifier les
• Scénario récursif : il s'agit de la partie qui déplace l'algorithme vers le scénario de
méthodes appropriées
pour gérer des répétitions ?
référence. Le scénario récursif dans la méthode factorielle est l'autre partie, lorsque vous
1.3 appelez la méthode à nouveau, mais avec une valeur plus petite qui désigne le scénario
de référence.

■ Présentation de la gestion des exceptions

.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.

Gestion des exceptions


Pour gérer les 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.

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.

GÉRER LES EXCEPTIONS

PRÉPAREZ-VOUS. Pour gérer les exceptions, procédez comme suit :


1. Ajoutez un nouveau projet Application console (nommé HandlingExceptions)
à la solution Leçon01.
2. Ajoutez le code suivant à la méthode Main de la classe Program.cs :
ExceptionTest();
3. Ajoutez la méthode suivante à la classe Program.cs :
private static void ExceptionTest()
{
   StreamReader sr = null;
   try
   {
    sr = File.OpenText(@”c:\data.txt”);
    Console.WriteLine(sr.ReadToEnd());
   }
   catch (FileNotFoundException fnfe)
   {
    Console.WriteLine(fnfe.Message);
   }
   catch(Exception ex)
   {
    Console.WriteLine(ex.Message);
   }
}
Introduction à la programmation | 25

4. Créez un fichier texte ("data.txt") en utilisant le bloc-notes ou Visual Studio sur le


REMARQUE
* lecteur C:. Il est acceptable de créer le fichier à un emplacement différent, mais si
La classe StreamReader vous le faites, n'oubliez pas de modifier l'emplacement du fichier dans le programme.
appartient à l'espace Entrez du texte dans le fichier.
de noms System.IO. 5. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
Lorsque vous exécutez
6. Vous pourrez voir le contenu du fichier texte affiché dans une fenêtre de commande.
ce code, vous avez
besoin d'ajouter une 7. Appuyez sur une touche pour fermer la fenêtre de commande.
directive d'utilisation 8. Supprimez le fichier data.txt et réexécutez le programme. Cette fois, vous obtiendrez une
pour l'espace de noms exception FileNotFoundException, et un message approprié s'affichera dans la fenêtre Sortie.
System.IO.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.

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

PRÉPAREZ-VOUS. Pour utiliser l'instruction try-catch-finally, procédez comme suit :


1. Ajoutez un nouveau projet Application console (nommé trycatchfinally) à la solu-
tion Leçon01.
2. Ajoutez le code suivant à la méthode Main de la classe Program.cs :
TryCatchFinallyTest();
26 | leçon 1

3. Ajoutez la méthode suivante à la classe Program.cs :


private static void TryCatchFinallyTest()
{
   StreamReader sr = null;
   try
   {
    sr = File.OpenText(“data.txt”);
    Console.WriteLine(sr.ReadToEnd());
   }
   catch (FileNotFoundException fnfe)
   {
    Console.WriteLine(fnfe.Message);
   }
   catch (Exception ex)
   {
    Console.WriteLine(ex.Message);
   }
   finally
   {
    if (sr != null)
    {
     sr.Close();
    }
   }
}
4. Créez un fichier texte ("data.txt") en utilisant le bloc-notes ou Visual Studio sur
le lecteur C:. Il est acceptable de créer le fichier à un emplacement différent, mais si
vous le faites, n'oubliez pas de modifier l'emplacement du fichier dans le programme.
Entrez du texte dans le fichier.
5. Sélectionnez Déboguer > Exécuter sans débogage ou appuyez sur Ctrl+F5.
6. Vous pourrez voir le contenu du fichier texte affiché dans une fenêtre de commande.
7. Appuyez sur une touche pour fermer la fenêtre de commande.
PRÊT POUR LA
CERTIFICATION 8. Supprimez le fichier data.txt et réexécutez le programme. Cette fois, vous obtiendrez une
Comprenez-vous exception FileNotFoundException, et un message approprié s'affichera dans la fenêtre Sortie.
comment gérer les erreurs Dans cet exercice, le programme s'assure que l'objet StreamReader est fermé et que toutes
dans vos programmes ? les ressources sont libérées lorsque l'opération est terminée. Le code dans le bloc finally est
1.4
toujours exécuté, qu'une exception soit levée ou non.
RÉSUMÉ DES COMPÉTENCES

Dans cette leçon, vous avez appris ce qui suit :


• Un algorithme est une suite finie et ordonnée d’opérations permettant de résoudre
un problème. Vous trouverez peut-être utile d'exprimer un algorithme sous forme
d'organigramme ou de table de décision, avant de développer un programme
informatique formel.
• Le langage de programmation C# fait partie du .NET Framework et bénéficie du
soutien du runtime et des bibliothèques de classes fournies par le .NET Framework.
• Main est une méthode spéciale, car elle sert également de point d'entrée à un
programme. Lorsque le runtime exécute un programme, il commence toujours par
la méthode Main.
• 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 la valeur qu'elle peut contenir et le type d'opérations qui peut y être effectué.
Introduction à la programmation | 27

• 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.

■ Évaluation des connaissances


Compléter l’espace vide
Complétez les phrases suivantes en écrivant le ou les mots corrects dans l'espace fourni.
1. L'instruction sélectionne, en vue de son exécution, une liste d'instructions
ayant une étiquette associée qui correspond à la valeur d'une expression.
2. La boucle teste la condition dans la partie inférieure de la boucle plutôt que
dans la partie supérieure.
3. Le seul opérateur qui prend trois arguments est l'opérateur .
4. La boucle est la manière la plus compacte d'itérer via les éléments d'une
collection.
5. Sur un ordinateur 32 bits, une variable de type de données int prend octets de
mémoire.
6. Pour accéder au premier élément d'un tableau, vous devez utiliser un index .
7. La est une technique de programmation qui contient une fonction qui s'appelle
elle-même afin de calculer un résultat.
8. Des sont des champs de données ou des variables locales dont il n'est pas
possible de modifier la valeur.
9. Lorsqu'un algorithme implique un grand nombre de conditions, un/une
contient un format compact et lisible pour le présenter.
10. Un/une est une représentation graphique d'un algorithme.
28 | leçon 1

Questions à choix multiples

Entourez la lettre correspondant à la bonne réponse.


1. Écrivez l'extrait de code suivant :
int n = 20;
int d = n++ + 5;
Quelle sera la valeur de d après l'exécution de cet extrait de code ?
a. 25
b. 26
c. 27
d. 28
2. Écrivez l'extrait de code suivant :
private static void WhileTest()
{
  int i = 1;
  while (i < 5)
  {
   Console.WriteLine(“The value of i = {0}”, i);
   i++;
  }
}
Combien de fois la boucle while sera-t-elle exécutée dans cet extrait de code ?
a. 0
b. 1
c. 4
d. 5
3. Écrivez l'extrait de code suivant :
int number1 = 10;
int number2 = 20;
if (number2 > number1)
Console.WriteLine(“number1”);
Console.WriteLine(“number2”);
Quel sera le résultat affiché après l'exécution de cet extrait de code ?
a. number1
b. number2
c. number1
number2
d. number2
number1
4. Dans une instruction switch, si aucune des instructions case ne correspond
à l'expression switch, à quelle instruction est transféré le contrôle ?
a. break
b. continue
c. default
d. return
5. Vous devez écrire du code pour fermer la connexion à la base de données et vous devez
vous assurer que ce code est toujours exécuté (qu'une exception soit levée ou non). Où
devez-vous écrire ce code ?
a. Dans un bloc try
b. Dans un bloc catch
Introduction à la programmation | 29

c. Dans un bloc finally


d. Dans la méthode Main
6. Vous devez stocker des valeurs allant de 0 à 255. Vous devez également vous assurer que
votre programme réduit l'utilisation de la mémoire. Quel type de données
devez-vous utiliser pour stocker ces valeurs ?
a. byte
b. char
c. short
d. int
7. Si vous n'avez pas de scénario de référence dans votre algorithme récursif, vous créez
une récurrence infinie. Une récurrence infinie entraîne la levée d'une exception par
le programme. Quelle exception sera levée par votre programme dans ce cas ?
a. OutOfMemoryException
b. StackOverflowException
c. DivideByZeroException
d. InvalidOperationException
8. Vous apprenez à développer des algorithmes répétitifs dans C#. Vous écrivez
la méthode suivante :
private static void ForTest()
{
  for(int i = 1; i < 5;)
  {
   Console.WriteLine(“The value of i = {0}”, i);
  }
}
Combien de répétitions la boucle for va-t-elle exécuter dans ce code ?
a. 0
b. 4
c. 5
d. Répétitions infinies
9. Parmi les fonctionnalités C# suivantes, laquelle devez-vous utiliser pour organiser
du code et créer des types globalement uniques ?
a. Assembly
b. Espace de noms
c. Classe
d. Type de données
10. Vous écrivez l'extrait de code suivant :
int[] numbers = {1, 2, 3, 4};
int val = numbers[1];
Vous créez également une variable de type RectangleHandler comme ceci :
RectangleHandler handler;
Quelle est la valeur de la variable val après l'exécution de cet extrait de code ?
a. 1
b. 2
c. 3
d. 4
30 | leçon 1

■ Évaluation des compétences


Scénario 1-1 : Conversion d'une table de décision en programme C#
Vous développez une application de facturation qui calcule le pourcentage de remise
en fonction de la quantité de produits achetés. La logique pour calculer les remises se trouve
dans la table de décision suivante. Si vous devez écrire une méthode C# qui utilise la même
logique pour calculer la remise, comment allez-vous écrire ce programme ?

Quantité < 10 O N N N
Quantité < 50 O O N N
Quantité < 100 O O O N
Remise  5 %  10 %  15 %  20 %

Scénario 1-2 : Conversion d'un organigramme en programme C#


Vous développez une bibliothèque de fonctions mathématiques. Vous commencez par
développer l'organigramme suivant décrivant l'algorithme permettant de calculer la factorielle
d'un nombre. Vous devez écrire un programme C# équivalent pour cet organigramme.
Comment allez-vous écrire ce programme ?

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 ?

Scénario 1-4 : Création d'un algorithme récursif


Vous développez une bibliothèque de fonctions utilitaires pour votre application. Vous devez
écrire une méthode qui prend un entier et compte le nombre de chiffres significatifs présents.
Vous devez créer un programme récursif pour résoudre ce problème. Comment allez-vous
écrire ce programme ?
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

Compétences/Concepts Objectif de l'examen MTA Numéro de l'objectif


de l'examen MTA
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
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

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. 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
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.
32
Introduction à la programmation orientée objet | 33

■ Présentation des objets

La programmation orientée objet est une technique de programmation qui utilise


des objets. Les objets sont des structures de données autonomes qui se composent
L'ESSENTIEL de propriétés, de méthodes et d'événements. Les propriétés spécifient les données
représentées par un objet, les méthodes spécifient le comportement d'un objet et les
événements assurent la communication entre les objets.

Réflexion orientée objet

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.

CRÉER UNE CLASSE

PRÉPAREZ-VOUS. Avant de commencer la procédure, assurez-vous de lancer Microsoft


Visual Studio et d'ouvrir un nouveau projet d'application console nommé Lesson02.
Exécutez ensuite les tâches suivantes :
1. Ajoutez une nouvelle classe Visual C# nommée Rectangle au projet.
2. Remplacez le code de la classe Rectangle par le code suivant :
class Rectangle
{
  private double length;
34 | Leçon 2

  private double width;


  public Rectangle(double l, double w)
  {
    length = l;
    width = w;
  }
  public double GetArea()
  {
    return length * width;
  }
}
3. Sélectionnez Générer > Lesson02 pour générer le projet. Vérifiez qu'il n'y a pas d'erreurs.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
REMARQUE
* Vous venez de créer une nouvelle classe C# nommée Rectangle. Une nouvelle classe est
Chaque classe est une définie à l'aide du mot clé class. Ici, la classe Rectangle comprend deux champs, length et
définition d'un nouveau width. Ces champs sont définis à l'aide du modificateur d'accès private. Un modificateur
type de données. d'accès spécifie la région du code qui aura accès à un champ. Par exemple, le modificateur
Par conséquent, une d'accès public ne limite pas l'accès, mais le modificateur d'accès private limite l'accès au
définition de classe est sein de la classe dans laquelle le champ est défini.
parfois aussi appelée Cette classe définit également une méthode nommée GetArea. Mais qu'est-ce, exactement,
« type ». une méthode ?
PRÉSENTATION DES MÉTHODES

Une méthode est un bloc de code contenant une série d'instructions.

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 t­oujours 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.

CRÉER DES PROPRIÉTÉS

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

C# a introduit les propriétés implémentées automatiquement à compter de la version 3


afin de simplifier la déclaration de propriété lorsqu'aucune logique supplémentaire n'est
spécifiée dans les accesseurs get et set. Par exemple, sans les contrôles de validation, les
propriétés Length et Width sont définies comme suit :
private double length;
private double width;
public double Length
{
   get
   {
    return length;
   }
   set
   {
    length = value;
   }
   }
  public double Width
  {
     get
     {
      return width;
     }
     set
     {
      width = value;
     }
  }
À titre de comparaison, avec les propriétés C# implémentées automatiquement, la syntaxe
simplifiée pour la déclaration de propriété devient la suivante :
public double Length { get; set; }
public double Width { get; set; }
Dans ce cas, les champs de stockage des propriétés sont définis en coulisses et ne sont pas
directement accessibles par le code.
Les propriétés implémentées automatiquement utilisées avec les constructeurs par défaut
peuvent également simplifier la création et l'initialisation des objets. Par exemple, il est
maintenant possible de créer et d'initialiser un objet comme suit :
static void Main(string[] args)
{
  Rectangle rect = new Rectangle
    { Length = 10.0, Width = 20.0 };
  Console.WriteLine(
    “Area of Rectangle: {0}”, rect.GetArea());
}
UTILISATION DU MOT CLÉ THIS

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

PRÉSENTATION DES DÉLÉGUÉS

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

désactivés). Dans ce type de communication d'événement, les éditeurs d'événements n'ont


pas besoin de savoir quels objets s'abonnent aux événements qui sont déclenchés.
Les événements ne sont pas limités uniquement à la programmation de l'interface graphique
utilisateur. En fait, les événements jouent un rôle important dans les bibliothèques de
­classes .NET Framework en tant que moyen pour les objets de signaler tout changement de
leur état. Vous utiliserez des événements dans pratiquement tous les programmes.
Lorsque vous définissez des événements, vous avez généralement besoin de deux
­éléments d'information :
• un délégué qui connecte l'événement à sa ou ses méthodes de gestionnaire ;
• une classe qui contient les données d'événement. Cette classe est généralement
dérivée de la classe EventArgs.
Pour définir un événement, vous pouvez utiliser un délégué personnalisé. Toutefois, dans
la plupart des cas, si votre événement ne contient aucune donnée spécifique à l'événement,
l'utilisation du délégué prédéfini EventHandler est suffisante. Le délégué EventHandler est
défini comme suit :
public delegate void EventHandler(Object sender, EventArgs e);
Ici, le paramètre sender est une référence à l'objet qui déclenche l'événement, et le
paramètre e est une référence à un événement d'objet de données qui ne contient aucune
donnée d'événement.
La classe EventArgs est utilisée par les événements qui ne passent aucune information liée
à un événement à un gestionnaire d'événements lorsqu'un événement est déclenché. Si le
gestionnaire d'événements requiert des informations liées à un événement, l'application doit
dériver une classe de la classe EventArgs pour contenir les données liées à l'événement.
PUBLIER DES ÉVÉNEMENTS ET S'ABONNER À DES ÉVÉNEMENTS

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

     r.Changed += new EventHandler(r_Changed);


     r.Length = 10;
  }
  static void r_Changed(object sender, EventArgs e)
  {
     Rectangle r = (Rectangle)sender;
REMARQUE
*      Console.WriteLine(
Le code dans la
méthode r_Changed        “Value Changed: Length = {0}”,
utilise un opérateur de        r.Length);
cast pour convertir un   }
type de données Objet
}
en type de données
Rectangle. Le cast est 3. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de console s'affiche
expliqué plus loin dans pour indiquer que la valeur de la propriété Length est modifiée.
cette leçon, dans la 4. ENREGISTREZ votre projet.
section intitulée « Cast
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
entre des types ».
Dans l'exemple que vous venez de terminer, la classe Rectangle définit un événement
Changed qui est appelé lorsque la propriété Length de l'objet Rectangle est modifiée.
Le délégué de l'événement Changed est de type EventHandler. Dans la classe Rectangle,
l'événement Changed est appelé lorsque l'accesseur set de la propriété Length est appelé.
Vous vous abonnez à l'événement Changed dans la méthode Main en attachant la méthode r_
Changed en tant que gestionnaire d'événements pour l'événement en utilisant le code suivant :
r.Changed += new EventHandler(r_Changed);
La signature de la méthode r_Changed répond aux exigences du délégué EventHandler.
La méthode r_Changed est appelée dès que vous définissez la valeur de la propriété
Length dans la méthode Main.
Le code ci-dessus utilise l'opérateur += plutôt que l'opérateur d'assignation simple (=) pour
attacher le gestionnaire d'événements. En utilisant l'opérateur +=, vous vous assurez que ce
gestionnaire d'événements sera ajouté à la liste des gestionnaires d'événements déjà a­ ssociés
à l'événement. Cette technique vous permet d'avoir plusieurs gestionnaires d'événements
pouvant répondre à un événement. Si vous utilisez l'opérateur d'assignation (=) pour affecter
le nouveau gestionnaire d'événements, cela remplace tout gestionnaire d'événements
existant associé à l'événement. Par conséquent, le gestionnaire d'événements nouvellement
associé est le seul qui est déclenché lorsque l'événement est appelé.

PRÉSENTATION DES ESPACES DE NOMS

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

Les membres statiques appartiennent à une classe proprement dite, et non à des


objets individuels.
Les membres de classe abordés jusqu'à présent dans cette section (notamment, les champs
de données, les méthodes et les propriétés) fonctionnent tous sur les objets individuels.
Ces membres sont appelés en tant que membres d'instance, car ils ne peuvent être utilisés
qu'après la création d'une instance de classe. En revanche, le mot clé static est utilisé pour
déclarer des membres qui n'appartiennent pas à des objets individuels, mais à une classe
proprement dite. Ces membres de classe sont appelés « membres statiques ». La méthode
familière Main qui sert de point d'entrée pour votre programme constitue un exemple
classique de membre statique.
CRÉER 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

2. Remplacez le code de la classe Program par le code suivant :


class Program
{
  static void Main(string[] args)
  {
     Rectangle rect = new Rectangle
      { Length = 10.0, Width = 20.0 };
     Console.WriteLine(“Shape Name: {0}, Area: {1}”,
      Rectangle.ShapeName,
      rect.GetArea());
  }
}
3. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de console s'ouvre
pour afficher le nom et l'aire de la forme.
4. ENREGISTREZ votre projet.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Lorsqu'une instance d'une classe est créée, une copie distincte est créée pour chaque champ
d'instance, mais une seule copie d'un champ statique est partagée par toutes les instances.
PRÊT POUR LA
CERTIFICATION Un membre statique ne peut pas être référencé via un objet d'instance. Au lieu de cela,
Comprenez-vous les un membre statique est référencé via le nom de la classe (comme Rectangle.ShapeName
notions fondamentales dans l'exercice ci-dessus). Notez qu'il n'est pas possible d'utiliser la référence de mot clé
sur les classes ? this avec une méthode ou une propriété statique, car le mot clé this peut uniquement être
2.1 utilisé pour accéder aux objets d'instance.

■ Présentation des valeurs et des références

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

Examinez maintenant la figure 2-2, qui présente un type référence, et plus précisément le


type de données string. Lorsque vous créez une variable de type string, un emplacement
de mémoire qui sera identifié par ce nom est créé. Toutefois, cet emplacement de mémoire
ne contient pas le contenu de la chaîne. Au lieu de cela, cette variable stocke l'adresse
mémoire (une référence) de l'emplacement où la chaîne est en fait stockée.

Figure 2-2
Mode Code Mode Mémoire
Visualisation d'un type
référence en mémoire nom

string name; null adresse données

nom

name = "Northwind"; m100 m100 "Northwind"

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.

COPIER LES TYPES VALEUR ET RÉFÉRENCE

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

L'encapsulation est un mécanisme de masquage des informations qui rend le code


L'ESSENTIEL facile à tenir à jour et à comprendre.

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. De plus, lorsque vous masquez des informations, vous masquez la complexité qui
lui est associée. Par conséquent, grâce à l'encapsulation, vous pouvez écrire du code plus
facile à comprendre et à tenir à jour.
Lors des exercices précédents, vous avez vu l'encapsulation à l'œuvre lorsque vous avez
déclaré les membres de données comme privés (private) et appliqué l'initialisation des
champs de données via un constructeur. Comme les membres de données sont masqués
aux utilisateurs de la classe, le développeur de la classe Rectangle peut changer les noms
des champs de données sans avoir à modifier le code appelant.
Les propriétés offrent un excellent moyen d'encapsuler des champs de données avec
n'importe quelle logique d'accompagnement. De plus, les modificateurs d'accès tels que
private et public vous permettent de contrôler le niveau d'accès pour un membre de classe
ou pour la classe elle-même.
Dans cette section, vous allez découvrir plus en détail les modificateurs d'accès et leur
fonctionnement.
48 | Leçon 2

Présentation des modificateurs d'accès

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

Modificateur d'accès Description


public L'accès n'est pas limité.
private L'accès est limité à la classe conteneur.
protected L 'accès est limité à la classe conteneur et à toute classe qui en est directement ou
indirectement dérivée. (Vous en apprendrez plus sur les classes dérivées plus loin dans
cette leçon, dans la section intitulée « Présentation de l'héritage ».)
internal L'accès est limité au code du même assembly.
protected internal  ne combinaison du modificateur protected et du modificateur internal : autrement dit,
U
l'accès est restreint à tout code du même assembly et uniquement aux classes dérivées
d'un autre assembly.

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

L'héritage est une fonctionnalité de la programmation orientée objet permettant de


développer une classe donnée, puis de réutiliser ce code encore et encore pour servir
de base pour les nouvelles classes. L'héritage vous permet de créer des classes qui
L'ESSENTIEL
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. Une classe dérivée hérite
de toutes les fonctionnalités de la classe de base, et peut également définir des
fonctionnalités supplémentaires qui la rendent différente de la classe de base.
Introduction à la programmation orientée objet | 49

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.

CRÉER DES CLASSES DÉRIVÉES

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; }
}

2. Modifiez la classe Rectangle comme indiqué ci-dessous :


class Rectangle: Polygon
{
  public Rectangle(double length, double width)
  {
     Length = length;
     Width = width;
  }
  public double GetArea()
  {
     return Width * Length;
  }
}

3. Modifiez maintenant le code de la méthode Main comme indiqué ci-dessous :


static void Main(string[] args)
{
  Rectangle rect = new Rectangle(10, 20);
  Console.WriteLine(
   “Width={0}, Length={1}, Area = {2}”,
   rect.Width, rect.Length, rect.GetArea());
}

4. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de console s'ouvre


pour afficher la largeur, la longueur et la surface du rectangle.
5. ENREGISTREZ votre projet.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Pour définir une classe dérivée, vous mettez un signe deux-points après le nom de la
classe dérivée, suivi du nom de la classe de base. Ici, la classe Polygon est la classe de
base pour la classe Rectangle.
50 | Leçon 2

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.

CRÉER DES CLASSES ABSTRAITES


UTILISEZ le projet que vous avez enregistré dans l'exercice précédent pour effectuer les étapes
ci-dessous.
1. Modifiez la classe Polygon comme indiqué ci-dessous :
abstract class Polygon
{
  public double Length { get; protected set; }
  public double Width { get; protected set; }
  abstract public double GetArea();
}
2. Modifiez la classe Rectangle comme indiqué ci-dessous :
class Rectangle: Polygon
{
  public Rectangle(double length, double width)
  {
     Length = length;
     Width = width;
  }
  public override double GetArea()
  {
     return Width * Length;
  }
}
3. Notez qu'il n'est pas nécessaire d'apporter des modifications à la méthode Main.
4. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de console s'ouvre
pour afficher la largeur, la longueur et la surface du rectangle.
5. ENREGISTREZ votre projet.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Introduction à la programmation orientée objet | 51

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.

Héritage à partir d'une classe Object

La classe Object est la classe de base ultime de toutes les classes du .NET
Framework.

Toutes les classes du .NET Framework héritent directement ou indirectement de la classe


Object. Par exemple, lorsque vous avez déclaré la classe suivante précédemment dans
cette leçon :
class Polygon
{
  public double Length { get; protected set; }
  public double Width { get; protected set; }
}
c'était fonctionnellement équivalent à la déclaration suivante :
class Polygon: Object
{
  public double Length { get; protected set; }
  public double Width { get; protected set; }
}
52 | Leçon 2

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);
  }
}

Cast entre des types


En C#, le module d'exécution vous permet d'effectuer un cast d'un objet en l'un de
ses types de base.
Les classes dérivées ont une relation de type « is-a » avec leur classe de base.
Par exemple, nous pouvons dire que le rectangle (Rectangle) est un polygone (Polygon).
Ainsi, un objet de la classe Rectangle a effectivement deux types de données dans ce cas :
l'objet est un rectangle (Rectangle), et l'objet est aussi un polygone (Polygon).
En C#, le module d'exécution vous permet d'effectuer un cast d'un objet en sa classe ou en
l'une de ses classes de base. Par exemple, vous pouvez déclarer :
Polygon p = new Rectangle(10, 20);
Ici, un nouvel objet Rectangle est créé et un cast en son type de base Polygon est effectué.
C# n'a pas besoin d'une syntaxe spéciale pour effectuer cette opération, car un cast en type
de base est considéré comme une conversion sécurisée.
Introduction à la programmation orientée objet | 53

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

Le polymorphisme est la capacité des classes dérivées à partager des fonctionnalités


L'ESSENTIEL communes à des classes de base tout en définissant leur propre comportement unique.

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”);
  }
}

2. Modifiez la classe Rectangle comme indiqué ci-dessous :


class Rectangle: Polygon
{
  public override void Draw()
  {
    Console.WriteLine(“Drawing: Rectangle”);
  }
}
3. Ajoutez une nouvelle classe appelée Triangle, comme indiqué ci-dessous :
class Triangle: Polygon
{
  public override void Draw()
  {
     Console.WriteLine(“Drawing: Triangle”);
  }
}

4. Modifiez la méthode Main comme suit :


static void Main(string[] args)
{
  List<Polygon> polygons = new List<Polygon>();
  polygons.Add(new Polygon());
  polygons.Add(new Rectangle());
  polygons.Add(new Triangle());
Introduction à la programmation orientée objet | 55

  foreach (Polygon p in polygons)


  {
    p.Draw();
  }
}
5. Sélectionnez Déboguer > Exécuter sans débogage. Une fenêtre de console s'ouvre
pour afficher le message de dessin correspondant à chaque polygone.
6. ENREGISTREZ votre projet.
PAUSE. Laissez le projet ouvert pour l'utiliser dans l'exercice suivant.
Dans cet exercice, les définitions de la classe Polygon et Rectangle sont simplifiées pour
insister sur la notion de polymorphisme. La classe de base fournit une seule méthode
Draw. La chose importante à noter ici est le mot clé virtual. Ce mot clé permet aux classes
dérivées de substituer la méthode.
Les classes Rectangle et Triangle remplacent toutes les deux la méthode Draw de la classe
de base par leur propre définition à l'aide du mot clé override. Lorsqu'elle est exécutée, la
méthode Main génère le résultat suivant :
Drawing: Polygon
Drawing: Rectangle
Drawing: Triangle
Le type de données List<Polygon> est capable de stocker une collection d'objets de type
Polygon ou les types qui dérivent de Polygon. La boucle foreach itère une collection
d'objets Polygon. Le type sous-jacent du premier objet est Polygon, mais le deuxième
et le troisième objets de la collection sont en fait les objets Rectangle et Triangle qui se
trouvent être castés en polygones. Le module d'exécution examine le type sous-jacent
réel et appelle la méthode substituée par la classe dérivée. C'est la raison pour laquelle
la version de la classe dérivée de la méthode Draw est appelée à la fois pour les objets
Rectangle et pour les objets Triangle.

Présentation des mots clés override et new


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.

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

Pour mieux comprendre ces concepts, remplacez la méthode Triangle de l'exercice


REMARQUE
* précédent par ce qui suit :
Si la méthode de la
classe dérivée n'est pas class Triangle: Polygon
précédée du mot clé {
new ou du mot clé   public new void Draw()
override, le compilateur
émet un avertissement   {
et la méthode se     Console.WriteLine(“Drawing: Triangle”);
comporte comme si   }
le mot clé new était }
présent.
Remplacez ensuite le code de la classe Main par ceci :
Triangle t = new Triangle();
t.Draw();
Polygon p = t;
p.Draw();
Le programme produit alors la sortie suivante :
Drawing: Triangle
PRÊT POUR LA Drawing: Polygon
CERTIFICATION Ici, quand la méthode Draw est appelée directement sur l'objet de la classe dérivée, la
Comprenez-vous le
nouvelle version de la méthode est utilisée. Cependant, si la méthode est exécutée lorsque
polymorphisme ?
la classe dérivée est castée en une classe de base, la version de classe de base masquée de
2.3
la méthode Draw est exécutée.

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.

■ Présentation des interfaces

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

L'interface IComparable a une seule méthode (CompareTo) qui accepte un objet


et retourne un entier. La valeur de retour de cette méthode indique le résultat de la
comparaison du paramètre donné avec l'objet en cours. La documentation de la méthode
CompareTo stipule ce qui suit :
• Si l'instance est égale au paramètre, CompareTo retourne 0.
• Si la valeur du paramètre est inférieure à l'instance ou si le paramètre est null, une
valeur positive est renvoyée.
• Si la valeur du paramètre est supérieure à l'instance, une valeur négative est renvoyée.
• Si le paramètre n'est pas d'un type compatible, une exception ArgumentException est
levée.

Comment IComparable décide comment comparer deux objets Rectangle ou deux


objets Employee ? Elle ne le décide pas. Les classes qui sont intéressées par de telles
comparaisons doivent implémenter l'interface IComparable en fournissant un corps de
méthode pour la méthode CompareTo. Chaque classe qui implémente IComparable est libre
de fournir sa propre logique de comparaison personnalisée dans la méthode CompareTo.

UTILISER L'INTERFACE ICOMPARABLE

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.

RÉSUMÉ DES COMPÉTENCES

Dans cette leçon, vous avez appris ce qui suit :


• La programmation orientée objet est une technique de programmation qui utilise
des objets. Les objets sont des structures de données autonomes qui se composent
de propriétés, de méthodes et d'événements. Les propriétés spécifient les données
représentées par un objet, les méthodes spécifient le comportement d'un objet et les
événements assurent la communication entre les objets.
• Une classe est le modèle à partir duquel les objets individuels sont créés.
• Les constructeurs sont utilisés pour initialiser les membres de données d'un objet.
Introduction à la programmation orientée objet | 59

• 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.

■ Évaluation des connaissances

Compléter l’espace vide


Complétez les phrases suivantes en écrivant le ou les mots corrects dans l'espace fourni.
1. Un(e) __________ constitue un modèle d'un objet.
2. Une classe qui ne fournit pas une implémentation complète doit être déclarée avec le
mot clé __________.
3. Les classes qui doivent prendre en charge la comparaison doivent implémenter
l'interface IComparable, puis fournir un corps pour la méthode __________.
4. Vous pouvez utiliser l'opérateur __________ pour vérifier s'il est possible d'effectuer
un cast d'un type en un autre type.
60 | Leçon 2

5. Les trois principales caractéristiques d'un langage de programmation orienté objet


sont _________, __________ et __________.
6. Vous pouvez utiliser des __________ pour regrouper des classes associées afin de
réduire les conflits de noms.
7. Le mot clé __________ fait référence à l'instance actuelle d'une classe.
8. Un(e) ___ est un type qui référence une méthode.
9. Un(e) ___ est un type valeur, tandis qu'un(e) ___ est un type référence.
10. Vous pouvez utiliser le mot clé __________ pour déclarer un membre qui appartient
à la classe proprement dite et non à un objet spécifique.

Questions à choix multiples


Entourez la lettre correspondant à la bonne réponse.
1. Vous voulez restreindre l'accès à une méthode de la classe conteneur ou à une classe qui en est
dérivée. Quel modificateur d'accès devez-vous utiliser pour cette méthode ?
a. public
b. private
c. protected
d. internal

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

d. class Square: Polygon


{
   public static void Draw()
   {
    // additional code . . .
  }
}
8. Vous créez une classe appelée Rectangle. Vous écrivez le code suivant :
class Rectangle: IComparable
{
  public double Length { get; set; }
  public double Width { get; set; }
  public double GetArea()
  {
      return Length * Width;
  }
   public int CompareTo(object obj)
   {
    // to be completed
  }
}
Vous devez compléter la définition de la méthode CompareTo pour permettre de
comparer les objets Rectangle. Parmi les codes suivants, lequel devez-vous écrire ?
a. public int CompareTo(object obj)
{
  Rectangle target = (Rectangle)obj;
  double diff = this.GetArea() − target.GetArea();
  if (diff == 0)
    return 0;
  else if (diff > 0)
    return 1;
  else return −1;
}
b. public int CompareTo(object obj)
{
  Rectangle target = (Rectangle)obj;
  double diff = this.GetArea() − target.GetArea();
  if (diff == 0)
     return 1;
  else if (diff > 0)
     return −1;
  else return 0;
}
Introduction à la programmation orientée objet | 63

c. public int CompareTo(object obj)


{
  Rectangle target = (Rectangle)obj;
  if (this == target)
    return 0;
   else if (this > target)
    return 1;
  else return −1;
}
d. public int CompareTo(object obj)
{
  Rectangle target = (Rectangle)obj;
  if (this == target)
    return 1;
   else if (this > target)
    return −1;
  else return 0;
}
9. Vous écrivez du code pour une nouvelle méthode appelée Process :
void Process(object o)
{
}
Le code reçoit un paramètre de type object. Vous devez convertir ce type object en
type Rectangle. Il arrive parfois que la valeur o transmise à la méthode ne soit pas
une valeur Rectangle valide. Vous devez vous assurer que le code ne génère pas
d'erreur System.InvalidCastException pendant les conversions. Parmi les lignes de
code suivantes, laquelle devez-vous utiliser dans la méthode Process pour atteindre
cet objectif ?
a. Rectangle r = (Rectangle) o;
b. Rectangle r = o as Rectangle;
c. Rectangle r = o is Rectangle;
d. Rectangle r = (o != null) ? o as rectangle: (Rectangle) o;
10. Vous écrivez du code pour gérer des événements dans votre programme. Vous
définissez un délégué appelé RectangleHandler comme ceci :
public delegate void RectangleHandler(Rectangle rect);
Vous créez également une variable de type RectangleHandler comme suit :
RectangleHandler handler;
Plus tard dans le programme, vous devez ajouter une méthode appelée DisplayArea
à la liste d'invocation de méthode de la variable handler. La signature de la méthode
DisplayArea correspond à celle de la méthode RectangleHandler. Le code que vous
écrivez ne doit jamais affecter le code de gestion d'événements existant. En tenant
compte de cette restriction, lequel des codes suivants devez-vous écrire ?
a. handler = new RectangleHandler(DisplayArea);
b. handler = DisplayArea;
c. handler += DisplayArea;
d. handler −= DisplayArea;
64 | Leçon 2

■ Évaluation des compétences


Scénario 2-1 : Création de propriétés
Vous devez créer une classe appelée Product qui représente un produit. Cette classe a une
seule propriété appelée Name. Les utilisateurs de la classe Product doivent pouvoir obtenir
et définir la valeur de la propriété Name. Toutefois, à chaque tentative de définition de
la valeur Name sur une chaîne vide ou une valeur nulle, une exception doit être levée.
De plus, les utilisateurs de la classe Product ne doivent pas pouvoir accéder à d'autres
membres de données de la classe Product. Comment allez-vous créer une telle classe ?

Scénario 2-2 : Création d'un struct


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.
Vous allez créer des milliers de ces structures de données dans votre programme, et
vous avez besoin d'une façon légère et efficace pour stocker ces données en mémoire.
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
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 ?

Scénario 2-2 : Création et gestion d'événements


Imaginons que vous écrivez du code pour créer et gérer des événements dans votre
programme. La classe SampleClass doit implémenter l'interface suivante :
public delegate void SampleDelegate();
public interface ISampleEvents
{
  event SampleDelegate SampleEvent;
  void Invoke();
}
Vous devez écrire du code pour la classe SampleClass et pour une méthode de test qui crée
une instance de la classe SampleClass et appelle l'événement. Quel code devez-vous écrire ?
Présentation générale LEÇON 3
du développement
logiciel
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

Compétences/Concepts Objectif de l'examen MTA Numéro de l'objectif de


l'examen MTA
Présentation de la gestion du Comprendre la gestion du 3.1
cycle de vie des applications cycle de vie des applications.
Présentation des tests Comprendre la gestion du cycle 3.1
de vie des applications.
Présentation des structures
de données Comprendre les algorithmes 3.3
et les structures de données.
Présentation des algorithmes Comprendre les algorithmes 3.3
de tri et les structures de données.

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.

■ Présentation de la gestion du cycle de vie des applications

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 processus de conception génère des spécifications techniques détaillées qui seront


­utilisées pour développer le système. Le résultat du processus de conception est
un ­ensemble de modèles et de spécifications techniques qui servent à orienter les
­développeurs et d'autres membres de l'équipe au cours de l'activité de développement
logiciel. Le résultat du processus de conception est davantage abstrait que concret. À ce
stade, il n'existe aucun véritable système avec lequel vous pouvez interagir.
Parmi les participants les plus importants à ce stade du processus ALM on trouve un
architecte et un concepteur de l'expérience utilisateur :
• Architecte : un architecte conçoit le plan de conception technique du système. Ce
plan inclut notamment l'identification des composants et des services, de leur compor-
tement, ainsi que de la façon dont ils interagissent entre eux et avec l'environnement
extérieur.
• Concepteur de l'expérience utilisateur : un concepteur de l'expérience ­utilisateur
crée l'expérience de l'utilisateur du système. Cela inclut la conception des élé-
ments d'interface utilisateur (UI), la conception de la navigation entre les différents
­formulaires, les écrans ou les pages, et ainsi de suite.
Présentation du développement logiciel
Les activités de développement logiciel incluent l'implémentation de la conception
avec la création du code logiciel, des bases de données et des autres contenus associés.

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

Présentation des tests de logiciels

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.

Présentation de la gestion des mises en production


L'activité de gestion des mises en production permet de gérer le déploiement, la
livraison et la prise en charge des versions logicielles.

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.

■ Présentation des tests

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.

Présentation des méthodes de test

Les méthodes de test de logiciels sont généralement divisées en deux catégories :


tests de boîte blanche et de boîte noire.

Traditionnellement, il existe deux approches générales des tests de logiciels :


• Tests de boîte noire
• Tests de boîte blanche
Les tests de boîte noire traitent le logiciel comme une « boîte noire » et, à ce titre,
se ­concentrent uniquement sur les entrées et les sorties. Avec cette approche, les
­connaissances du fonctionnement interne du système ne sont pas utilisées pendant le test.
En revanche, avec les tests de boîte blanche, les testeurs s'appuient sur leur connaissance
du fonctionnement interne du système lors du test. Par exemple, dans les tests de boîte
blanche, les testeurs ont accès au code source.
Ces deux techniques de test se complètent mutuellement. Les tests de boîte noire sont
généralement utilisés pour vérifier qu'une application logicielle respecte toutes ses
spécifications. En revanche, les tests de boîte blanche permettent de vérifier qu'il existe
des cas de test appropriés pour chaque méthode ou fonction.

Présentation des niveaux de test

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.

■ Présentation des structures de données

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.

Les structures de données constituent le fondement de la plupart des programmes informa-


tiques, et elles permettent aux développeurs d'implémenter des fonctionnalités complex-
es. La plupart des structures de programmation fournissent un support intégré pour une
variété de structures de données et des méthodes associées pour les manipuler. Dans cette
section, vous apprendrez plusieurs types distincts de structures de données afin de vous
familiariser avec les techniques générales pour les manipuler.

Présentation des tableaux


Un tableau est une collection d'éléments stockés dans un emplacement mémoire con-
tigu et référencés à l'aide d'un ou de plusieurs indices.
Présentation générale du développement logiciel | 71

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

numbers = new int [4]; addr 0 0 0 0

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.

Présentation des files d'attente


Une file d'attente est une collection d'éléments dans laquelle le premier élément
ajouté à la collection est le premier élément supprimé.

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.

Présentation des piles


Une pile est une collection d'éléments dans laquelle le dernier élément ajouté à la
collection est le premier élément supprimé.

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.

■ Présentation des algorithmes de tri

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

À la fin de second passage, BubbleSort a effectué une permutation supplémentaire, donc


il ne peut pas encore garantir que la liste est complètement triée. BubbleSort fait donc un
troisième passage dans la liste, comme illustré dans le tableau 3-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

      numbers, left, pivotIndex − 1);


    // sort the right partition
    QuickSort(
      numbers, pivotIndex + 1, right);
PRÊT POUR LA   }
CERTIFICATION   return numbers;
Comprenez-vous les
algorithmes de tri }
courants ? En raison de son approche du partitionnement, l'algorithme QuickSort est beaucoup plus
3.3
rapide que l'algorithme BubbleSort.

RÉSUMÉ DES COMPÉTENCES

Dans cette leçon, vous avez appris ce qui suit :


• L a gestion du cycle de vie des applications désigne l'ensemble des différentes
activités qui gravitent autour d'un nouveau logiciel, depuis sa création jusqu'à son
arrivée à maturité, voire parfois son retrait du marché.
• Tester un logiciel consiste à vérifier que le logiciel respecte les exigences fixées. Les
tests ont lieu une fois que la plupart des travaux de développement ont été effectués.
• 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 manière dont elles 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.
• Un tableau est une collection d'éléments de même type de données qui sont stockés
dans un emplacement de mémoire contigu et référencés à l'aide d'un ou de plusieurs
indices.
• Une file d'attente est une collection d'éléments dans laquelle le premier élément
ajouté à la collection est le premier élément supprimé.
• Une pile est une collection d'éléments dans laquelle le dernier élément ajouté à la
collection est le premier élément supprimé.
• 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.
• L'algorithme BubbleSort utilise plusieurs opérations de comparaison et de
permutation pour classer les éléments d'une liste dans l'ordre approprié.
• L'algorithme QuickSort utilise des opérations de partitionnement et de
comparaison pour classer les éléments d'une liste dans l'ordre approprié.

■ Évaluation des connaissances


Compléter l’espace vide
Complétez les phrases suivantes en écrivant le ou les mots corrects dans l'espace fourni.
1. Dans un test ______, les testeurs utilisent leur connaissance du fonctionnement
interne du système pour l'évaluer.
2. En général, après chaque nouveau correctif logiciel, les testeurs effectuent de
nombreux ______ pour s'assurer que toutes les fonctionnalités qui s'exécutaient
correctement au préalable continuent à fonctionner normalement.
3. L'algorithme BubbleSort utilise plusieurs opérations de ______ et de ______ pour
classer les éléments d'une liste dans l'ordre approprié.
82 | leçon 3

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.

Questions à choix multiples


Entourez la lettre correspondant à la bonne réponse.
1. Le produit que vous développez n'est pas encore terminé, mais vous voulez le
soumettre à un plus grand nombre de clients à des fins de test et pour recevoir des
commentaires. Sous lequel des niveaux de test suivants se classe cette activité ?
a. Test d'intégration
b. Test du système
c. Test d'acceptation
d. Test de régression
2. Les testeurs d'une application logicielle ont accès à son code source et planifient
d'écrire des cas de test pour vérifier que les méthodes renvoient les valeurs
appropriées. Sous lequel des niveaux de test suivants se classe cette activité ?
a. Test d'intégration
b. Test unitaire
c. Test alpha
d. Test bêta
3. Parmi les structures de données suivantes, laquelle permet d'accéder directement à
l'ensemble de ses éléments ?
a. Tableau
b. Pile
c. File d'attente
d. Liste liée
4. Dans le cycle de vie d'une application, laquelle des activités suivantes permet à un
architecte de créer un plan de conception technique d'un système ?
a. Analyse des spécifications
b. Conception
c. Développement
d. Maintenance
5. Dans votre application, vous utilisez une file d'attente comme structure de données
pour manipuler les informations. Vous devez identifier le prochain élément de
données à traiter, mais vous ne voulez toutefois pas le traiter dans l'immédiat.
Laquelle des opérations de file d'attente suivantes allez-vous utiliser ?
a. Enqueue
b. Dequeue
c. Peek
d. Contains
Introduction à la programmation orientée objet | 83

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 des compétences


Scénario 3-1 : Utilisation de tableaux
Vous écrivez un programme qui utilise un tableau bidimensionnel. Le tableau comporte
quatre lignes et cinq colonnes. Vous devez imprimer le plus grand élément de chaque
ligne du tableau. Comment allez-vous écrire ce programme ?
84 | leçon 3

Scénario 3-2 : Utilisation des files d'attente


Vous écrivez un programme qui utilise deux files d'attente. Les données figurant dans
chaque file d'attente sont déjà classées par ordre croissant. Vous devez traiter le contenu
des deux files d'attente de manière à ce que la sortie affichée à l'écran soit triée. Comment
allez-vous écrire ce programme ?

■ É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 ?

Scénario 3-4 : Utilisation des listes liées


Vous écrivez un programme qui stocke une liste de noms de produit dans une liste liée.
Lorsque l'utilisateur entre un nom de produit, le programme doit vérifier si la liste liée
contient le produit spécifié. Comment allez-vous écrire ce programme ?
Présentation des LEÇON 4
applications Web
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

Compétences/Concepts Objectif de l'examen MTA Numéro de l'objectif


de l'examen MTA
Présentation du développement Comprendre le développement 4.1
de pages Web de pages Web.
Présentation du développement Comprendre le développement 4.2
d’applications ASP.NET d'applications Web
Microsoft ASP.NET.
Présentation de l'hébergement Comprendre l’hébergement 4.3
Web IIS Web.
Présentation du développement Comprendre les services Web. 4.4
de services Web

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.

■ Présentation du développement de pages 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

Le World Wide Web (également appelé WWW ou « le Web ») est un système de documents


hypertexte interconnectés et d'autres ressources (telles que des images et des vidéos) qui
sont accessibles via Internet. Plusieurs technologies fonctionnent ensemble pour rendre
le WWW possible. Dans cette section, nous présenterons deux de ces technologies :
• HTTP (Hypertext Transfer Protocol)
• HTML (Hypertext Markup Language)
HTTP est le protocole de communication sous-jacent utilisé par le World Wide Web.
HTTP fournit le langage commun que les serveurs Web et les navigateurs Web utilisent
pour communiquer.
HTTP utilise une URL (Uniform Resource Locator) pour identifier de manière unique
chaque ressource sur Internet et la traiter. Une URL est essentiellement une adresse Web
et se présente comme suit : http://www.microsoft.com/en/us/default.aspx. Chaque URL
commence par un protocole. Dans cet exemple, le protocole est HTTP. Vous pouvez
également remarquer le protocole HTTPS (HTTP sécurisé) utilisé pour les applications
sécurisées dans lesquelles les données doivent être chiffrées avant d'être transmises sur
le réseau. Après le protocole, la partie suivante d'une URL est l'adresse du serveur Web
(ici, www.microsoft.com), suivie de l'emplacement de la ressource dans le serveur Web
(/en/us/), et enfin, la ressource demandée elle-même (default.aspx). L'ensemble des
documents, images, vidéos et autres ressources sur le Web sont identifiés par une URL.
Lorsque le navigateur envoie une requête HTTP d'une page Web à un serveur Web (la page
Web et le serveur sont tous les deux identifiés par une URL), le serveur prépare une
réponse HTTP pour le navigateur. Cette réponse indique le contenu et la disposition de la
page Web.

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.

Présentation du langage HTML

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

HTML se compose d'un ensemble de balises (aussi appelées « éléments HTML ») qui


REMARQUE
* définissent la structure et le contenu d'une page. Par exemple, la balise <html> spécifie
HTML est basé sur du le début d'un document HTML. Les balises HTML sont toujours placées entre crochets
texte quand il s'agit
d'écrire le code. HTML pointus et sont toujours utilisées par paires. Plus particulièrement, à chaque balise de
fournit des balises début correspond une balise de fin. Les balises de fin contiennent une barre oblique pour
permettant d'incorporer indiquer qu'il s'agit de balises de fin. Par exemple, la balise de fin correspondant à <html>
des images, des est </html>.
données audio, des Une page HTML se compose de deux parties distinctes : l'en-tête et le corps. L'en-tête est
données vidéo et
beaucoup d'autres types délimité par les balises <head> et </head>. Il sert à fournir un titre de document et des liens
de contenu multimédia vers des éléments externes qui peuvent être utilisés dans la page, tels que des fichiers CSS
et interactif sur une et JavaScript. Le corps est délimité par les balises <body> et </body>. Il sert à fournir la
page Web. structure complète et le contenu de la page qui s'affichera dans un navigateur Web.
Voici un exemple de balise HTML qui affiche une image :
REMARQUE
* <img height="400px" width="400px"
Dans cet exemple, alt="Mimas photographié par la sonde Cassini" src=
notez que le document
"http://upload.wikimedia.org/wikipedia/commons/b/bc/Mimas_Cassini.jpg"/>
HTML ne contient pas
l'image elle-même. Notez que la balise <img> spécifie des attributs supplémentaires. Par exemple,
Au lieu de cela, la l'attribut src spécifie l'emplacement du fichier image, et les attributs height et width
balise <img> spécifie spécifient les dimensions à utiliser lors du rendu de l'image dans un navigateur.
l'URL de l'image, que
le navigateur télécharge Prenons maintenant un autre exemple de balise HTML :
séparément et restitue
en tant que partie de <a href="http://en.wikipedia.org/wiki/Mimas_(moon)">
la page. Lune de Saturne</a>
Ici, <a> est la balise d'ancrage, qui sert à créer des liens hypertexte sur une page Web.
L'attribut href associé à cette balise spécifie l'URL cible, et le texte contenu dans la balise
d'ancrage est ce qui s'affiche en tant que lien.

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.

L'exercice suivant illustre les étapes de création d'un document HTML.

UTILISER HTML

PRÉPAREZ-VOUS. Pour créer un document HTML, procédez comme suit :


1. Ouvrez Visual Studio. Créez un nouveau projet basé sur le modèle Application
Web ASP.NET vide. Nommez le projet WorkingWithHTML, puis nommez la solution
Lesson04.
2. Sélectionnez Projet > Ajouter un nouvel élément, puis sélectionnez le modèle Page
HTML. Nommez le fichier default.htm.
3. Remplacez le code par défaut du fichier HTML par le code suivant :
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Lune de'Saturne</title>
</head>
88 | Leçon 4

<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

Présentation des feuilles de style en cascade

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.

UTILISER DES FICHIERS CSS

PRÉPAREZ-VOUS. Pour écrire un fichier CSS et le lier à un fichier HTML, procédez


comme suit :
1. Ajoutez un nouveau projet basé sur le modèle Application Web ASP.NET vide à la solution
Lesson04. Nommez le projet UnderstandingCSS.
2. Sélectionnez Projet > Ajouter un nouvel élément. Sélectionnez le modèle Feuille de
style. Nommez le fichier styles.css. Remplacez le code par défaut du fichier par le code
suivant :
body
{
  font-family: Verdana;
  font-size: 9pt;
}
div
{
  color:Red;
}
Présentation des applications Web | 91

.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

PRÉPAREZ-VOUS. Pour commencer à travailler avec JavaScript, exécutez les tâches


suivantes :
1. Ajoutez un nouveau projet basé sur le modèle Application Web ASP.NET vide à la
solution Lesson04. Nommez le projet UnderstandingJavaScript.
2. 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>
  <title>Présentation de JavaScript</title>
  <script type="text/javascript"
    language="javascript">
    username = prompt("Entrez votre nom");
    message = "Bonjour, " + username +
     ". Votre nom a ";
    nameLen = username.length;
    if (nameLen > 5)
      message = message + "plus de ";
    else if (nameLen < 5)
      message = message + "moins de ";
    else
      message = message + "exactement ";
    message = message + "5 caractères.";
    alert(message);
  </script>
</head>
<body>
</body>
</html>
94 | Leçon 4

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.

La programmation côté client fait référence aux programmes qui s'exécutent


intégralement sur l'ordinateur local d'un utilisateur. Parmi les exemples de programmes
côté client figurent l'application Windows Forms et le code JavaScript qui s'exécute dans
un navigateur Web. Les programmes côté client n'utilisent pas de ressources serveur.
D'autre part, la programmation côté serveur fait référence aux programmes qui
s'exécutent intégralement sur un serveur et utilisent ses ressources de calcul. Ici, les seules
ressources du client qui sont utilisées sont celles impliquées dans la récupération effective
des résultats de traitement à partir du serveur. Les applications Web et les services Web
Présentation des applications Web | 95

sont des exemples de programmation côté serveur. Ce type de programmation utilise une


technologie côté serveur telle qu'ASP.NET, PHP ou Ruby on Rails.
Récemment, les applications hybrides qui utilisent à la fois la programmation côté client
et la programmation côté serveur sont devenues de plus en plus populaires. Par exemple,
PRÊT POUR LA vous pouvez concevoir des applications clientes intelligentes qui s'exécutent localement
CERTIFICATION sur les ordinateurs clients mais qui utilisent des services Web pour accomplir certaines
Comprenez-vous tâches. En fait, les applications Ajax utilisent une combinaison de programmation
comment utiliser HTML, côté serveur et de code côté client pour créer des applications Web interactives et
JavaScript et CSS pour hautement réactives.
le développement de
pages Web ? ASP.NET vous permet de créer des applications qui s'exécutent intégralement sur le
4.1
serveur ou des applications Ajax hybrides qui fournissent des interfaces rapides et
réactives tout en stockant la plupart de leurs données sur le Web.

■ Présentation du développement d'applications ASP.NET

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#.

L'infrastructure ASP.NET se compose de deux parties :


• un ensemble de classes et d'interfaces qui permet la communication entre le navigateur
Web et le serveur Web. Ces classes sont organisées dans l'espace de noms System.
Web ;
• un processus d'exécution, aussi appelé processus de travail ASP.NET (aspnet_wp.exe),
qui gère la demande Web de ressources ASP.NET.
À un niveau supérieur, une application Web ASP.NET s'exécute par le biais d'une série
de requêtes HTTP et de messages de réponse entre le navigateur client et le serveur Web.
Ce processus se produit comme suit :
1. L'utilisateur demande une ressource d'un serveur Web en tapant une URL dans
le navigateur Web. Le navigateur envoie une requête HTTP au serveur Web de
destination.
2. Le serveur Web analyse la requête HTTP et recherche un processus capable de
l'exécuter.
3. Le résultat de la requête HTTP est retourné au navigateur client sous la forme d'une
réponse HTTP.
4. Le navigateur lit la réponse HTTP et le restitue sous la forme d'une page Web
à l'utilisateur.
Ce processus est représenté à la figure 4-6.

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.

La classe Page fournit plusieurs méthodes et propriétés importantes qui contrôlent


la façon dont une demande de page est traitée. Pour obtenir la liste complète des
*
REMARQUE
méthodes et des propriétés, visitez le site http://msdn.microsoft.com/en-us/library/
system.web.ui.page.aspx.

Présentation du modèle d'événement et du cycle de vie d'une page ASP.NET


Pendant son exécution, une page ASP.NET passe par plusieurs phases de traitement
différentes. Chacune de ces phases passe elle-même par des étapes de traitement
spécifiques, telles que l'initialisation, le chargement, l'exécution de code du
gestionnaire d'événements et le rendu.

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

Phase Signification Événements associés


Demande de page Lorsqu'une demande de page est reçue, le cycle de vie de la
page commence. À ce stade, ASP.NET décide si la page peut être
facilement traitée à partir du cache ou si elle doit être analysée
et compilée.
Début L a phase de début consiste à déterminer si la demande est une  PreInit
publication (postback) ou une nouvelle demande. Plusieurs
propriétés de page, telles que Request, Response, IsPostBack et
UICulture, sont définies au cours de cette phase.
Initialisation L ors de la phase d'initialisation, tous les contrôles de la page  Init
sont initialisés et rendus disponibles. Un gestionnaire
d'événements pour l'événement Init est le meilleur emplacement
pour le code que vous souhaiter exécuter avant de poursuivre le
traitement de la page.
Chargement S i la demande concerne une publication (postback), la phase de  Load
chargement (load) permet de restaurer les propriétés du contrôle
avec les informations de l'état d'affichage et de l'état du contrôle.
Une méthode qui gère l'événement Load est le meilleur
emplacement pour stocker le code d'initialisation de tout
contrôle spécifique à cette page.
Gestion des Si la demande est une publication (postback), les gestionnaires
événements de d'événements de contrôle sont appelés au cours de cette phase.
publication (postback) Alors, les valeurs d'entrée sont validées et la propriété IsValid de
la classe de Page est définie.
Prérendu  ette phase indique que la page est sur le point d'afficher son  PreRender
C
contenu. Un gestionnaire d'événements pour l'événement
PreRender est la dernière occasion de modifier la sortie de la
page avant qu'elle soit envoyée au client.
Rendu Lors de cette phase, la page appelle la méthode Render pour Render
chaque contrôle et remplit la réponse qui sera envoyée au
navigateur Web.
Unload L ors de la phase de déchargement (unload), la réponse est  Unload
envoyée au client et il est procédé au nettoyage de la page.
Dans le cadre de ce nettoyage, les propriétés de page telles
que Request et Response sont ignorées.

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

COMPRENDRE LE CYCLE DE VIE D'UNE PAGE ASP.NET

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")

Présentation de la gestion d'état


La gestion d'état constitue un aspect essentiel des applications Web en raison de la
nature déconnectée du protocole HTTP. Il existe des techniques de gestion d'état
à la fois côté client et côté serveur.

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

PRÉSENTATION DE LA GESTION D'ÉTAT CÔTÉ CLIENT


La gestion d'état côté client utilise le code HTML et les fonctionnalités du navigateur
Web pour stocker les informations d'état sur l'ordinateur client. Les techniques suivantes
sont utilisées pour stocker des informations d'état côté client :
• Chaînes de requête : ici, l'état est tenu à jour en mettant les données sous la forme
d'un ensemble de paires clé-valeur dans la partie chaîne de requête d'une URL
de page. Par exemple, l'URL suivante incorpore une paire clé (« q ») et valeur
(« television ») de chaîne de requête : http://www.bing.com/search?q=television. Pour
récupérer la valeur de la clé dans une page ASP.NET, utilisez l'expression Request.
QueryString[“q”]. QueryString est une propriété de l'objet Request et obtient la
collection de toutes les variables de chaîne de requête.
• Cookies : les cookies sont de petits paquets d'informations stockés localement par un
navigateur Web sur l'ordinateur de l'utilisateur. Les cookies sont couramment utilisés
pour stocker les préférences et le contenu des paniers des utilisateurs et pour offrir
aux utilisateurs une expérience de navigation personnalisée lors des visites suivantes
d'une page Web. La classe HttpCookie représente un cookie dans votre code. Le code
suivant montre comment définir un cookie sur un ordinateur client :
  HttpCookie cookie =
    new HttpCookie("Name", "Bob");
  cookie.Expires = DateTime.Now.AddMinutes(10);
  Response.Cookies.Add(cookie);
De même, le bloc de code suivant montre comment lire un cookie :
  if (Request.Cookies["Name"] != null)
  {
    name = Request.Cookies["Name"].Value;
  }
• Champs masqués : les champs masqués contiennent des informations qui ne sont
pas affichées sur une page Web, mais qui font néanmoins partie du code HTML
de la page. Les champs masqués peuvent être créés à l'aide de l'élément HTML
<input type=“hidden”>. Le contrôle serveur HTML ASP.NET HtmlInputHidden est
également mappé à cet élément HTML.
• ViewState : ViewState est le mécanisme utilisé par ASP.NET pour tenir à jour l'état
des contrôles au travers des publications (postbacks) de la page. Pour faciliter cette
opération, quand ASP.NET exécute une page, il recueille les valeurs de tous les
contrôles autres que ceux de la publication (postback) et qui sont modifiés dans le
code, puis les met en forme en une seule chaîne codée. Cette chaîne est stockée dans
un champ masqué d'un contrôle appelé __VIEWSTATE. Par défaut, ViewState est
activé dans une application ASP.NET. Vous pouvez désactiver ViewState au niveau
d'un contrôle en affectant la valeur false à la propriété EnableViewState du contrôle :
  <asp:GridView ID="GridView1"
    runat="server" EnableViewState="false" />
De plus, vous pouvez désactiver ViewState au niveau de la page en affectant la valeur
false à l'attribut EnableViewState de la directive Page.
  <%@ Page EnableViewState="false" %>
Enfin, vous pouvez désactiver ViewState au niveau de l'application en ajoutant la
ligne suivante au fichier web.config :
  <pages enableViewState="false" />
Présentation des applications Web | 101

PRÉSENTATION DE LA GESTION D'ÉTAT CÔTÉ SERVEUR


La gestion d'état côté serveur utilise les ressources serveur pour stocker les informations
d'état. L'utilisation de techniques côté serveur élimine la possibilité qu'un utilisateur tente
de pirater le code côté client ou de lire les données de session. Toutefois, le stockage et le
traitement des informations de session sur un serveur accroissent la charge du serveur et
nécessitent des ressources serveur supplémentaires pour traiter les pages Web.
ASP.NET prend en charge la gestion d'état côté serveur à deux niveaux :
• État de session : une application ASP.NET crée une session unique pour chaque
utilisateur qui envoie une requête à l'application. ASP.NET identifie clairement
chacune de ces sessions, en envoyant un ID de session (SessionId) unique à l'URL
de requête. Cette valeur SessionId est transmise sous la forme d'un cookie ou est
incorporée dans l'URL, en fonction de la configuration de l'application. La capacité
d'identifier de manière unique et de mettre en relation des requêtes peut être utilisée
pour stocker des données spécifiques à la session, également appelées « état de
session de l'application Web ». Un exemple classique d'état de session est le stockage
du contenu des paniers des utilisateurs lorsqu'ils parcourent un magasin sur le Web.

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.

• État de l'application : l'état de l'application permet de stocker les données utilisées


dans l'ensemble d'une application. Il est possible d'accéder facilement à l'état de
l'application via la propriété Application de la classe Page. Cette propriété permet
d'accéder à l'objet HttpApplicationState qui stocke l'état de l'application sous la forme
d'une collection de paires clé-valeur.
L'exercice suivant montre comment utiliser l'état de session. Cet exercice implique deux
formulaires Web. Le formulaire WebForm1.aspx obtient un nom d'utilisateur et le stocke
dans l'état de session. Il transfère ensuite l'utilisateur vers le formulaire WebForm2.aspx,
qui récupère le nom d'utilisateur à partir de la session.

UTILISER L'ÉTAT DE SESSION

PRÉPAREZ-VOUS. Pour utiliser l'état de session, procédez comme suit :


1. Ajoutez un nouveau projet basé sur le modèle Application Web ASP.NET vide à la
solution Lesson04. Nommez le projet UsingSessionState.
2. Sélectionnez Projet > Ajouter un nouvel élément. Sélectionnez le modèle Formulaire
Web. Nommez le fichier WebForm1.aspx.
3. Remplacez les balises HTML du fichier WebForm1.aspx par ce qui suit :
<%@ Page Language="C#" AutoEventWireup="true"
   CodeBehind="WebForm1.aspx.cs"
   Inherits="UsingSessionState.WebForm1" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
</head>
102 | Leçon 4

<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");
    }

    protected void Button1_Click


      (object sender, EventArgs e)
    {
      Session.Add("Name", TextBox1.Text);
      Response.Redirect("WebForm2.aspx");
    }
  }
}
5. Ajoutez un nouveau formulaire Web (WebForm2.aspx) au projet. Remplacez les balises
de la page par ce qui suit :
<%@ Page Language="C#" AutoEventWireup="true"
  CodeBehind="WebForm2.aspx.cs"
  Inherits="UsingSessionState.WebForm2" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
Présentation des applications Web | 103

</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

■ Présentation de l'hébergement Web IIS

L'hébergement Web implique de configurer un serveur Web avec les paramètres et


L'ESSENTIEL les fichiers de code appropriés afin que les utilisateurs distants puissent accéder à une
application Web.

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

Présentation des services Internet Information Services


Les services Internet Information Services (IIS) sont un serveur Web destiné
à l'hébergement d'applications Web sur le système d'exploitation Windows.
Un serveur IIS utilise les concepts de sites, applications et répertoires virtuels.

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

Création de répertoires virtuels et de sites Web


Un site Web est un conteneur d'applications et de répertoires virtuels. Un répertoire
virtuel est un alias qui est mappé à un répertoire physique du serveur Web.

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.

CRÉER UN RÉPERTOIRE VIRTUEL

PRÉPAREZ-VOUS. Pour créer un répertoire virtuel à l'aide du Gestionnaire des services


Internet, procédez comme suit :
1. Ouvrez le Gestionnaire des services Internet. Pour ouvrir le Gestionnaire des services
Internet dans Windows 7, tapez IIS dans le menu Démarrer, puis cliquez sur le
raccourci Gestionnaire des services Internet (IIS). Pour accéder au Gestionnaire des
services Internet dans Windows XP, accédez à Démarrer > Exécuter, tapez « inetmgr »,
puis cliquez sur le bouton OK.
2. Développez les nœuds du volet gauche (voir la figure 4-10), puis sélectionnez le nœud
Site Web par défaut.
3. Cliquez avec le bouton droit sur le nœud Site Web par défaut, puis sélectionnez
l'option Ajouter un répertoire virtuel dans le menu contextuel. Dans Windows XP,
la commande est Nouveau > Répertoire virtuel. À ce stade, un Assistant Création de
répertoire virtuel s'affiche sur votre écran.
4. Dans la boîte de dialogue Ajouter un répertoire virtuel, fournissez un alias et un
chemin d'accès physique, comme illustré à la figure 4-11, puis cliquez sur OK.

Figure 4-11
Boîte de dialogue Ajouter
un répertoire virtuel

Déploiement d'applications Web


Le déploiement de sites Web simples s'effectue en copiant les fichiers à l'emplacement
approprié. Pour installer un site Web complexe, vous devrez peut-être utiliser
Windows Installer.

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

■ Présentation du développement de services Web

Un service Web est un composant logiciel accessible sur un réseau à l'aide de


L'ESSENTIEL
protocoles réseau standard tels que HTTP. Les services Web sont décrits à l'aide
du langage WSDL (Web Services Description Language).

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

Lorsque vous regardez l'exemple, vous remarquerez certains éléments évidents de ce


paquet SOAP :
• Le paquet se compose d'une enveloppe qui contient un corps ; chaque élément est
identifié par une balise XML spécifique.
• Le corps se compose du nom de la méthode à appeler. Dans ce paquet SOAP, le nom
de la méthode est ToLower et il prend un seul paramètre pour le nom inputString et
une valeur donnée.
Voici le paquet de réponse en provenance du serveur :
<?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>
  <ToLowerResponse
    xmlns="http://northwindtraders.com">
   <ToLowerResult>sample string</ToLowerResult>
  </ToLowerResponse>
 </soap:Body>
</soap:Envelope>
Dans le paquet de réponse, l'élément XML ToLowerResponse est le résultat de
l'invocation de méthode sur le serveur.

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

CRÉER UN SERVICE WEB

PRÉPAREZ-VOUS. Pour créer un service Web, exécutez les actions suivantes :


1. Ajoutez un nouveau projet basé sur le modèle Application Web ASP.NET vide à la
solution Lesson04. Nommez le projet TextWebService, comme illustré à la figure 4-12.

Figure 4-12
Sélectionner le modèle
Application Web
ASP.NET vide

2. Sélectionnez Projet > Ajouter un nouvel élément dans le menu contextuel.


Sélectionnez le modèle Service Web, comme illustré à la figure 4-13. Nommez le
service Web TextWebService.asmx.

Figure 4-13
Sélectionner le modèle
Service Web

3. Modifiez le code par défaut de la classe TextWebService dans le fichier


TextWebService.asmx.cs comme indiqué ci-dessous :
[WebService(Namespace = "http://northwindtraders.com/")]
[WebServiceBinding(ConformsTo
  = WsiProfiles.BasicProfile1_1)]
public class TextWebService:
 System.Web.Services.WebService
110 | Leçon 4

{
  [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.

TESTER UN SERVICE WEB

PRÉPAREZ-VOUS. Pour tester un service Web, exécutez les tâches suivantes :


1. Ouvrez le projet TextWebService que vous avez créé dans l'exercice précédent.
Sélectionnez Déboguer > Démarrer le débogage. Un navigateur affichant la page de
test du service Web est lancé, comme illustré à la figure 4-14.

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.

Utilisation des services Web


Dans cette section, vous allez apprendre à accéder aux services Web à partir d'une
application cliente.

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.

ACCÉDER À UN SERVICE WEB À PARTIR D'UNE APPLICATION CLIENTE

PRÉPAREZ-VOUS. Pour accéder à un service Web à partir d'une application cliente,


procédez comme suit :
1. Ajoutez à la solution Lesson04 un nouveau projet basé sur le modèle Application Web
ASP.NET vide. Nommez ce projet TextWebServiceClient.
2. Cliquez avec le bouton droit sur le nom du projet dans la fenêtre de l'Explorateur
de solutions, puis sélectionnez l'option Ajouter une référence Web dans le menu
contextuel. Dans la boîte de dialogue Ajouter une référence Web, entrez l'URL
du service créé dans l'exercice précédent, puis appuyez sur Entrée. (Vous pouvez
également copier l'URL à partir de la barre d'adresses du navigateur.) Cette action
charge la liste des opérations disponibles sur le service Web, comme illustré à la
figure 4-17.

Figure 4-17
Boîte de dialogue Ajouter
une référence Web

3. Dans la boîte de dialogue Ajouter une référence Web, remplacez le nom de la


référence Web par textWebService, puis cliquez sur le bouton Ajouter une référence.
Cela ajoute une référence Web au projet, comme illustré à la figure 4-18.
Présentation des applications Web | 113

Figure 4-18
Nœud Web References
du projet

4. Remplacez le code du fichier Default.aspx par ce qui suit :


<%@ Page Title="Home Page" Language="C#"
  AutoEventWireup="true"
  CodeBehind="Default.aspx.cs"
  Inherits="TextWebServiceClient._Default" %>
<html>
  <head><title>TextWebService Client
  </title></head>
 <body>
  <form runat="server">
    <h2>Test Form For TextWebService</h2>
     <p>
      <asp:TextBox ID="TextBox1"
       runat="server"
       Text="enter text" />
      <br />
      <asp:Button ID="Button1"
       runat="server"
       Text="Appeler les méthodes de service"
       onclick="Button1_Click" />
     </p>
     <p>
      <strong>Results:</strong><br />
      ToLower method:
      <asp:Label ID="toLowerLabel"
       runat="server"
       Text="Label" ForeColor="Green" />
      <br />
114 | Leçon 4

      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

RÉSUMÉ DES COMPÉTENCES

Dans cette leçon, vous avez appris ce qui suit :


• Une page Web est un document transmis sur le World Wide Web (WWW) et qui
peut être affiché par un navigateur Web.
• HTML (Hypertext Markup Language) est le langage utilisé par les navigateurs et les
serveurs Web pour décrire une page Web.
• Les feuilles de style en cascade (CSS, Cascading Style Sheets) vous permettent de
stocker des informations de style et de mise en forme séparément du code HTML.
Cette séparation facilite la mise à jour d'un site Web. Visual Studio inclut des outils
permettant de créer vos feuilles de style et d'en afficher un aperçu.
• JavaScript est un langage de script côté client qui s'exécute à l'intérieur d'un
navigateur Web pour créer des pages Web beaucoup plus interactives que ce qui
est possible en HTML seul.
• Les techniques de gestion d'état côté client telles que des chaînes de requête, des
cookies, des champs masqués et ViewState utilisent HTML et les fonctionnalités
des navigateurs Web pour stocker les informations d'état sur les ordinateurs clients.
• Les techniques de gestion d'état côté serveur telles que l'état de session et l'état de
l'application utilisent les ressources serveur pour la gestion d'état.
• Les services Internet Information Services (IIS) sont un serveur Web destiné
à l'hébergement d'applications Web sur le système d'exploitation Windows.
Un serveur IIS utilise les concepts de sites, applications et répertoires virtuels.
• Les services Web permettent d'invoquer des objets distants à l'aide de technologies
standard telles que XML et HTTP.
• 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.
• WSDL fournit une norme par laquelle un service Web peut indiquer à son client
quel genre de messages il acceptera et quels résultats seront retournés.

■ Évaluation des connaissances


Compléter l’espace vide
Complétez les phrases suivantes en écrivant le ou les mots corrects dans l'espace fourni.
1. Dans la balise d'ancrage HTML (<a>), l'attribut _________ spécifie l'URL cible.
2. Vous pouvez placer le code CSS dans un fichier distinct et le lier à une page Web via
l'élément HTML _________.
3. Le code JavaScript d'une page Web s'exécute _________.
116 | Leçon 4

4. Vous pouvez utiliser un élément _________ pour afficher un message spécifique


à l'attention des utilisateurs quand leur navigateur n'exécute pas JavaScript.
5. Vous pouvez désactiver ViewState au niveau de la page en affectant à l'attribut
_________ de la directive Page la valeur false dans la page ASP.NET.
6. L'état _________ permet de stocker les données utilisées globalement dans une
application, par opposition à l'état _________, qui stocke les données d'une session
utilisateur.
7. Une application Web est accessible à l'aide d'un nom de _________ en lieu et place
d'un nom de dossier physique.
8. Vous devez marquer les classes avec l'attribut _________ pour les exposer en tant
que service Web.
9. De toutes les méthodes d'une classe de service Web, uniquement celles marquées
avec les attributs _________ sont exposées comme méthodes de service Web.
10. SOAP s'appuie sur _________ pour son format de message et utilise _________ pour
la transmission des messages.

Questions à choix multiples


Entourez la lettre correspondant à la bonne réponse.
1. Vous écrivez le code suivant pour votre page Web :
<html>
  <head>
    <title>Sample Page</title>
    <style type="text/css">
    div
    {
      font-family: Verdana;
      font-size: 9pt;
    }
    </style>
  </head>
  <body>
    <div style=
      "font-weight: bold; font-size: 12pt;">
    Sample Text</div>
  </body>

</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

■ Évaluation des compétences


Scénario 4-1 : utilisation de JavaScript et HTML
Vous développez une page Web qui fournit une interface utilisateur réactive. Vous décidez
d'afficher une image sur la page. Lorsque l'utilisateur déplace la souris sur l'image, une
nouvelle image remplace l'image d'origine. Ensuite, lorsque la souris se déplace hors
de la zone de l'image, l'image d'origine s'affiche à nouveau. Vous espérez obtenir un tel
résultat à l'aide de code HTML et JavaScript côté client. Comment créer une page Web
qui fonctionne conformément à la description ?

Scénario 4-2 : utilisation de chaînes de requête


Vous développez une partie d'un site Web qui permet aux utilisateurs d'entrer leur nom et
leur adresse électronique pour s'abonner à un bulletin d'informations électronique. Votre
solution se compose de deux pages Web. La première page recueille le nom de l'utilisateur
et son adresse électronique, puis transfère le contrôle vers une deuxième page. Celle-
ci accepte le nom et l'adresse en tant que paramètres de chaîne de requête et affiche un
message de confirmation à l'utilisateur. Vous devez écrire le code pour ces deux pages.
Quel code allez-vous écrire pour satisfaire à cette exigence ?
Présentation des applications Web | 119

■ Évaluation de la maîtrise des concepts


Scénario 4-3 : appel d'un service Web de façon asynchrone
La classe proxy générée par Visual Studio pour un service Web inclut les méthodes
permettant d'appeler le service Web de manière synchrone aussi bien qu'asynchrone.
Par défaut, l'application utilise la méthode synchrone. Si vous préférez l'appel asynchrone,
vous devez appeler la version asynchrone de la méthode. Les versions asynchrones
n'attendent pas que le service Web retourne une réponse et utilisent un mécanisme de
rappel pour obtenir une réponse quand elle est prête. L'appel asynchrone d'un service
Web peut aider les applications clientes à être plus réactives. Vous voulez appeler de
façon asynchrone la méthode ToLower du service TextWebService précédemment créé.
Quel code devez-vous écrire pour appeler un service Web de façon asynchrone ?

Scénario 4-4 : utilisation de l'état de session


Vous développez une partie d'un site Web qui permet aux utilisateurs d'entrer leur nom et
leur adresse électronique pour s'abonner à un bulletin d'informations électronique. Votre
solution se compose de deux pages Web. La première page recueille le nom d'utilisateur
et l'adresse de messagerie, les ajoute à l'état de session et transfère le contrôle vers une
deuxième page. Celle-ci récupère le nom et l'adresse à partir de l'état de session et affiche
un message de confirmation. Vous devez écrire le code pour ces deux pages. Quel code
allez-vous écrire pour satisfaire à cette exigence ?
120 | Leçon 5
Présentation des
5 LEÇON
applications de
bureau
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

Compétences/Concepts Objectif de l'examen MTA Numéro de l'objectif


de l'examen MTA
Présentation des objets Comprendre les applications 5.1
Windows Forms.
Présentation des valeurs et Comprendre les applications 5.2
des références console.
Présentation de l'encapsulation Comprendre les services  5.3
Windows.

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.

■ Présentation des applications Windows Forms

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

Conception d'un Windows Form

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

Un formulaire et ses composants répondent généralement à des actions utilisateurs telles


que des frappes ou des mouvements de souris. Il s'agit d'actions appelées événements.
Une grande partie du code que vous écrivez en tant que développeur Windows Forms est
consacrée à la capture de ces événements et à leur gestion via la création d'une réponse
appropriée. Par exemple, dans l'exercice suivant, vous allez créer un Windows Form qui
affiche la valeur de la date sélectionnée par l'utilisateur.

CRÉER UN WINDOWS FORM


PRÉPAREZ-VOUS. Lancez Microsoft Visual Studio. Effectuez ensuite les actions suivantes :
1. Créez un projet basé sur le modèle d'application Windows Forms, comme illustré dans
la figure 5-2. Nommez le projet WindowsFormsDesign.
122 | Leçon 5

Figure 5-2
Boîte de dialogue Nouveau projet Visual Studio

2. Le projet d'application Windows Forms se charge avec un formulaire par défaut


(Form1.cs) ouvert dans la vue du concepteur. La vue du concepteur vous permet
de travailler visuellement avec le formulaire. Vous pouvez par exemple réorganiser
les contrôles sur la surface du formulaire et définir leurs propriétés. Il est possible
d'accéder aux contrôles disponibles dans la fenêtre de la boîte à outils. Si vous ne
voyez pas la fenêtre de la boîte à outils, sélectionnez Affichage > Boîte à outils pour
l'afficher. Puis, dans la boîte à outils, faites glisser un contrôle DateTimePicker et un
contrôle Label sur la surface du concepteur et organisez les contrôles, comme illustré
dans la figure 5-3.

Figure 5-3
Windows Form avec un
contrôle DateTimePicker
et un contrôle Label

3. Dans la vue du concepteur, sélectionnez le contrôle Label et, à l'aide de la fenêtre


Propriétés, définissez sa propriété Text sur une chaîne vide.
4. Dans la vue du concepteur, vous devez également double-cliquer sur le contrôle
DateTimePicker. Cette action associe le gestionnaire d'événements par défaut
à l'événement ValueChanged du contrôle DateTimePicker et bascule la vue
de concepteur en Code. Ensuite, modifiez le code par défaut du gestionnaire
d'événements comme suit :
private void dateTimePicker1_ValueChanged
     (object sender, EventArgs e)
{
  label1.Text =
   dateTimePicker1.Value.ToLongDateString();
}
Présentation des applications de bureau | 123

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é.

Utilisation de l'héritage visuel

L'héritage visuel vous permet de réutiliser une fonctionnalité et une structure


existantes pour Windows Forms.

L'héritage est l'un des principes fondamentaux de la programmation orientée objet.


Lorsqu'une classe hérite d'une classe de base, elle dérive sa fonctionnalité de base de la
classe de base. Bien sûr, vous pouvez toujours étendre la classe dérivée pour fournir des
fonctionnalités supplémentaires, ce qui peut s'avérer plus utile.
124 | Leçon 5

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.

CRÉER UN WINDOWS FORM À L'AIDE DE L'HÉRITAGE VISUEL


PRÉPAREZ-VOUS. Lancez Microsoft Visual Studio et ouvrez le projet d'application
Windows existant nommé WindowsFormsDesign. Effectuez ensuite les étapes suivantes :
1. Ouvrez Form1.designer.cs et remplacez les modificateurs d'accès private des contrôles
label1 et dateTimePicker1 par des modificateurs d'accès protected, comme illustré :
protected System.Windows.Forms.Label label1;
protected System.Windows.Forms.DateTimePicker
  dateTimePicker1;

2. Sélectionnez Projet > Ajouter Windows Forms pour ajouter un nouveau Windows


Form basé sur le modèle de formulaire hérité. Vous pouvez rapidement rechercher
ce modèle en tapant son nom dans la zone de recherche, comme illustré dans la
figure 5-4. Nommez le formulaire hérité InheritedForm.cs. (Notez que le modèle de
formulaire hérité n'est pas disponible dans les éditions Visual Studio Express. Si vous
utilisez une édition Express, créez simplement un Windows Form classique nommé
InheritedForm.cs et passez à l'étape 4.)

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();
  }
}

5. Dans la vue Concepteur de InheritedForm, définissez la propriété Texte sur Formulaire


hérité.
6. Dans la vue Concepteur, double-cliquez également sur InheritedForm. Cette action
attache un gestionnaire d'événements pour l'événement Load du formulaire et bascule
la vue de Concepteur sur Code. En mode Code, modifiez le code par défaut du
gestionnaire d'événements comme suit :
private void InheritedForm_Load(
  object sender, EventArgs e)
{
  label1.Text =
   dateTimePicker1.Value.ToLongDateString();
}
126 | Leçon 5

7. Ouvrez le fichier Program.cs et modifiez la méthode Main comme indiqué ci-dessous


pour vous assurer que le formulaire InheritedForm est lancé lorsque vous exécutez
l'application :
[STAThread]
static void Main()
{
  Application.EnableVisualStyles();
  Application
   .SetCompatibleTextRenderingDefault(false);
  Application.Run(new InheritedForm());
}

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é.

Présentation des applications d'Interface multidocument (MDI)

Les applications d'interface multidocument (MDI) sont des applications dans


lesquelles plusieurs fenêtres enfants résident sous une fenêtre parent unique.

Les applications MDI permettent à plusieurs fenêtres de partager le menu et la barre


d'outils d'une seule application. Les applications MDI ont souvent un menu nommé
Fenêtre qui permet aux utilisateurs de gérer plusieurs fenêtres enfants, qui offre des
fonctionnalités telles que la commutation entre les fenêtres enfants et qui permet
d'organiser des fenêtres enfants. Par exemple, la figure 5-6 montre Microsoft Excel 2010
en mode MDI.

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.

CRÉER UNE APPLICATION MDI


PRÉPAREZ-VOUS. Lancez Microsoft Visual Studio et créez un nouveau projet d'application
Windows Forms nommé MDIApplication. Effectuez ensuite les étapes suivantes :
1. Sélectionnez la fenêtre Propriétés de Form1 et définissez la propriété Texte sur
MDI Application et la propriété IsMdiContainer sur True.
2. Sélectionnez le contrôle MenuStrip dans la boîte à outils et ajoutez-le au formulaire.
Ajoutez un élément de menu de niveau supérieur &Fenêtre, puis ajoutez &Nouvelle
fenêtre et &Organiser au niveau suivant. Dans le menu Organiser, ajoutez trois
options : &Cascade, &Horizontal et &Vertical, comme illustré dans la figure 5-7.

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.

3. Pour le contrôle MenuStrip, définissez la propriété MdiWindowListItem sur le nom du


menu Fenêtre (windowToolStripMenuItem par défaut).
4. Dans l'Explorateur de Solutions, cliquez avec le bouton droit sur le projet et sélectionnez
Ajouter > Windows Form. Ajoutez un nouveau formulaire Windows sous le nom
ChildForm.
5. Double-cliquez sur le formulaire enfant et ajoutez le code suivant pour gérer l'événement
Load :
private void ChildForm_Load(
  object sender, EventArgs e)
{
  Text = DateTime.Now.ToString();
}

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();
}

7. Sur le formulaire parent, double-cliquez respectivement sur Fenêtre > Organiser,


Fenêtre > Cascade, Fenêtre > Réorganiser, Fenêtre > Horizontal et Fenêtre >
Réorganiser, Fenêtre > Vertical et ajoutez les gestionnaires d'événements suivants
pour leurs événements Click :
private void cascadeToolStripMenuItem_Click(
  object sender, EventArgs e)
{
  LayoutMdi(MdiLayout.Cascade);
}
private void horizontalToolStripMenuItem_Click(
  object sender, EventArgs e)
{
  LayoutMdi(MdiLayout.TileHorizontal);
}
private void verticalToolStripMenuItem_Click(
  object sender, EventArgs e)
{
  LayoutMdi(MdiLayout.TileVertical);
}
Présentation des applications de bureau | 129

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.

■ Présentation des applications consoles

Les applications consoles ne disposent pas d'une interface utilisateur graphique et


L'ESSENTIEL
utilisent une fenêtre console en mode texte permettant d'interagir avec l'utilisateur.
Elles conviennent mieux pour les tâches nécessitant peu ou pas d'interface utilisateur.

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

Utilisation des paramètres de ligne de commande

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.

CRÉER UNE APPLICATION CONSOLE


PRÉPAREZ-VOUS. Lancez Microsoft Visual Studio. Effectuez ensuite les étapes suivantes :
1. Créez un projet basé sur le modèle Application console, comme illustré dans la
figure 5-9. Nommez le projet DisplayFile.

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

■ Présentation des services Windows

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.

Création d'un service Windows

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.

CRÉER UN SERVICE WINDOWS


PRÉPAREZ-VOUS. Lancez Microsoft Visual Studio. Effectuez ensuite les étapes suivantes :
1. Créez un projet basé sur le modèle de service Windows. Nommez le projet FirstService,
comme illustré dans la figure 5-11.

Figure 5-11
Sélection du modèle de
projet de service Windows
Présentation des applications de bureau | 133

2. Sélectionnez la fenêtre Propriétés pour Service1 et définissez les propriétés (Name) et


ServiceName sur « FirstService ».
3. Dans l'Explorateur de solutions, remplacez le nom du fichier Service1.cs par
FirstService.cs. Ouvrez le fichier Program.cs et vérifiez que les références au fichier
Service1 ont été remplacées par FirstService.
4. Sélectionnez la fenêtre Propriétés pour le service et définissez la propriété
CanPauseAndContinue et la propriété CanShutdown sur True.
5. Ouvrez le concepteur pour FirstService et ajoutez-y un composant EventLog à partir
de la boîte à outils. Le composant EventLog vous permet de vous connecter avec les
journaux d'événements.
6. Affichez le code de FirstService et modifiez le constructeur comme indiqué ci-dessous.
Dans ce code, vous devez tout d'abord créer une source d'événements sous le nom
de FirstService. Cette source d'événements est utilisée pour distinguer les messages
générés par une application spécifique de tous les autres messages d'un journal
d'événements. Ensuite, vous devez définir la propriété Source du composant du
journal d'événements sur le nom de la source de l'événement. La propriété Log du
composant du journal d'événements, eventLog1, est utilisée pour spécifier le journal
d'événements utilisé pour enregistrer les messages :
public FirstService()
{
  InitializeComponent();
  if (!EventLog.SourceExists(“FirstService”))
  {
     EventLog.CreateEventSource(
       “FirstService”, “Application”);
  }
  eventLog1.Source = “FirstService”;
  eventLog1.Log = “Application”;
}

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);
}

protected override void OnStop()


{
  eventLog1.WriteEntry(
   “Arrêt du service”,
   EventLogEntryType.Information, 1001);
}
134 | Leçon 5

protected override void OnPause()


{
  eventLog1.WriteEntry(
   “Suspension du service”,
   EventLogEntryType.Information, 1001);
}

protected override void OnContinue()


{
  eventLog1.WriteEntry(
   “Poursuite du service”,
   EventLogEntryType.Information, 1001);
}

protected override void OnShutdown()


{
  eventLog1.WriteEntry(
   “Mise à l'arrêt 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.

A JOUTER UN PROGRAMME D'INSTALLATION À UN SERVICE WINDOWS


PRÉPAREZ-VOUS. Lancez Microsoft Visual Studio. Effectuez ensuite les étapes suivantes :
1. Ouvrez le projet FirstService créé dans l'exercice précédent. Cliquez avec le bouton
droit sur l' aire du concepteur de FirstService.cs et sélectionnez l'option Ajouter le
programme d'installation dans le menu contextuel.
2. Cette action ajoute un nouveau fichier ProjectInstaller.cs au projet. Ouvrez le concepteur
pour ProjectInstaller.cs. Vous devriez voir que deux composants ont été ajoutés au
concepteur, comme illustré dans la figure 5-12.

Figure 5-12
Vue du concepteur pour
ProjectInstaller.cs
Présentation des applications de bureau | 135

3. Accédez aux propriétés de serviceProcessInstaller1component et remplacez la propriété


Account par LocalService.
4. Ensuite, accédez aux propriétés de serviceInstaller1component. Remplacez la propriété
DisplayName par FirstService et la propriété Description par un « Un simple service de
test ». Notez que la valeur de la propriété StartType est définie par défaut sur Manuel.
5. Sélectionnez Générer > Générer la solution (ou appuyez sur F6) pour générer le projet.
Le service Windows est maintenant prêt à être installé.

La propriété StartType de la classe ServiceInstaller indique comment et quand un


service est démarré. La propriété StartType peut avoir l'une des trois valeurs possibles.
La valeur Manual, qui est également la valeur par défaut, indique que vous devez
*
REMARQUE
démarrer le service manuellement. La valeur Automatic indique que le service démarre
automatiquement lorsque Windows est démarré. La valeur Disabled indique que le
service ne peut pas être démarré.

Lorsque vous ajoutez un programme d'installation à un projet de service Windows,


les classes ServiceProcessInstaller et ServiceInstaller sont ajoutées au projet. La classe
REMARQUE
* ServiceProcessInstaller procède aux tâches d'installation qui sont communes à tous
Pour minimiser les les services Windows dans une application. Cela inclut l'affectation du compte de
risques de sécurité, connexion pour le service Windows. La classe ServiceInstaller, quant à elle, effectue les
évitez d'utiliser le tâches d'installation spécifiques à un seul service Windows, telles que la définition de
compte LocalSystem ServiceName et de StartType.
pour exécuter un
La propriété Account de la classe ServiceProcessInstaller spécifie le type de compte
service Windows
sous lequel les services sont exécutés. La propriété Account est du type énumération
à moins que ce service
ServiceAccount et les valeurs possibles sont LocalService, LocalSystem, NetworkService
nécessite des privilèges
et User. La valeur LocalSystem spécifie un compte hautement privilégié, tandis que le
de sécurité plus élevés
compte LocalService agit en tant qu'utilisateur non privilégié.
pour fonctionner.
Un fichier exécutable qui a le code pour les classes du programme d'installation du service
peut être installé en utilisant la ligne de commande de l'outil d'installation (installutil.exe).
L'exercice suivant montre comment installer une application de service Windows dans la
base de données de service Windows.

INSTALLER UN SERVICE WINDOWS


PRÉPAREZ-VOUS. Pour installer un service Windows, procédez comme suit :
1. Exécutez l'invite de commandes Visual Studio en tant qu'administrateur. Pour accéder
à l'invite de commande, allez dans Démarrer > Tous les programmes > Visual Studio >
Visual Studio Tools, puis choisissez invite de commandes Visual Studio. Pour exécuter
un programme en tant qu'administrateur dans Windows, faites un clic droit sur le
raccourci du programme et sélectionnez l'option Exécuter en tant qu'administrateur
dans le menu contextuel.
2. Accédez au répertoire dans le répertoire de sortie du projet FirstService. Il s'agit du
répertoire où se trouve le fichier exécutable.
136 | Leçon 5

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.

UTILISER UN SERVICE WINDOWS


PRÉPAREZ-VOUS. Lancez la fenêtre Gestion de l'ordinateur en faisant un clic droit sur
REMARQUE
* Poste de travail et en sélectionnant Gérer dans le menu contextuel. Effectuez ensuite les
Pour désinstaller un étapes suivantes :
service Windows,
1. Dans la fenêtre Gestion de l'ordinateur, développez les sections Services et
utilisez InstallUtil.exe Applications et sélectionnez Services. La liste de tous les services installés sur
avec l'option -u. l'ordinateur doit s'afficher, comme illustré dans la figure 5-14.

Figure 5-14
La section Services vous
permet de travailler avec
les services installés
Présentation des applications de bureau | 137

2. Sélectionnez le service FirstService et cliquez sur le lien hypertexte Démarrer,


comme illustré dans la figure 5-14. Vous devriez voir une boîte de dialogue indiquant
la progression, comme illustré dans la figure 5-15. Lorsque le service est démarré,
son statut passe à Démarré.

Figure 5-15
Message de contrôle de
service lors du démarrage
d'un service

3. Développez le nœud Observateur d'événements et sélectionnez le journal Application


Windows. Vous devriez voir un message de FirstService disant « Démarrage du
service », comme illustré dans la figure 5-16.

Figure 5-16
Le journal de l'application
Windows

4. Revenez dans la liste des services et essayez de suspendre, de reprendre ou d'arrêter


PRÊT POUR LA
FirstService. Vérifiez le journal d'événements d'applications pour vérifier que les
CERTIFICATION
Comprenez-vous messages appropriés sont affichés.
comment développer Dans les derniers exercices, vous avez vu comment créer et utiliser un service
des services Windows ? Windows. Vous avez également appris à ajouter par programme des messages au journal
5.3
d'événements d'applications Windows.

RÉSUMÉ DES COMPÉTENCES

Dans cette leçon, vous avez appris ce qui suit :


• Un Windows Form est une surface visuelle qui permet d'afficher différents contrôles,
tels que 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 des
applications.
• 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é. 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.
138 | Leçon 5

• L'héritage visuel vous permet de réutiliser une fonctionnalité et une structure


existantes pour Windows Forms.
• Les applications d'interface multidocument (MDI) sont des applications dans lesquelles
plusieurs fenêtres enfants résident sous une fenêtre parent unique.
• Les applications consoles ne disposent pas d'une interface utilisateur graphique et
utilisent une fenêtre console en mode texte permettant d'interagir avec l'utilisateur.
Elles conviennent mieux pour les tâches nécessitant peu ou pas d'interface utilisateur.
• Les services Windows sont parfaits pour créer des applications longues qui s'exécutent
en arrière-plan et ne disposent d'aucune interface utilisateur.
• Vous pouvez créer des services Windows à l'aide du modèle de services Windows de
Visual Studio.
• Avant qu'un service Windows puisse être utilisé, il doit être installé dans le registre
Windows. Pour ce faire, ajoutez le composant d'installation à l'application de service
Windows. Cela vous permettra d'installer le service Windows à l'aide d'un outil
d'installation tel que InstallUtil.exe.

■ Évaluation des connaissances


Compléter l’espace vide
Complétez les phrases suivantes en écrivant le ou les mots corrects dans l'espace fourni.
1. Utilisez la propriété _________ de la classe ServiceInstaller pour spécifier un bref
commentaire expliquant l'objet du service.
2. La propriété ___ de la classe ___ indique le type de compte sous lequel un
service Windows s'exécutera.
3. La propriété _________ de la classe EventLog est utilisée pour spécifier le nom de
l'application devant être utilisé lors de l'écriture dans un journal des événements.
4. _________ vous permet de réutiliser une fonctionnalité et une structure existantes
pour Windows Forms.
5. Les _________ sont des applications dans lesquelles plusieurs fenêtres enfants
résident sous une fenêtre parent unique.
6. Un/une _________ convient parfaitement pour créer des applications longues qui
s'exécutent en arrière-plan et ne disposent d'aucune interface utilisateur.
7. Les _________ ne disposent pas d'une interface utilisateur graphique et utilisent une
fenêtre console en mode texte permettant d'interagir avec l'utilisateur.
8. Les applications _________ fournissent leur propre fonctionnalité de gestion de
fenêtre, alors que les applications _________ s'appuient sur le système d'exploitation
pour la gestion des fenêtres.
9. Un délégué peut être lié à n'importe quelle méthode dont la signature correspond
à celle du ________.
10. Les _________ sont disponibles pour plus d'une méthode, permettant des notifications
un-à-plusieurs lorsqu'un événement est déclenché.
Présentation des applications de bureau | 139

Questions à choix multiples


Entourez la lettre correspondant à la bonne réponse.
1. Vous devez concevoir un service Windows qui ne peut pas être mis en pause. Parmi
les options suivantes, laquelle vous aidera à effectuer cette tâche ?
a. Définir la propriété CanPauseAndContinue du service Windows sur False.
b. Définir la propriété CanPauseAndContinue du service Windows sur True.
c. Définir la propriété CanStart du service Windows sur True, mais définir la
propriété CanShutdown sur False.
d. Ne pas écraser les méthodes OnPause et OnContinue dans le service Windows.
2. Vous avez développé un service Windows. Vous devez installer ce service afin
d'installer sa fonctionnalité. Parmi les options suivantes, laquelle devez-vous choisir
pour effectuer cette tâche ?
a. Utiliser l'explorateur de serveurs Visual Studio.
b. Utiliser le nœud des services dans la fenêtre Gestion de l'ordinateur.
c. Utiliser InstallUtil.exe.
d. Utiliser gacutil.exe.
3. Vous avez développé un service Windows. Ce service doit s'exécuter en tant
qu'utilisateur nonprivileged afin de minimiser tout risque de sécurité possible. Parmi
les comptes suivants, lequel devez-vous utiliser pour exécuter ce service Windows ?
a. LocalSystem
b. NetworkService
c. LocalService
d. Utilisateur (lorsque la propriété UserName est définie sur un membre avec un rôle
d'administrateur)
4. Vous concevez une application de service Windows qui contient un seul
service Windows. Vous aimeriez que ce service soit démarré automatiquement au
redémarrage de l'ordinateur. Parmi les classes suivantes, laquelle devez-vous utiliser
pour spécifier ce paramètre ?
a. ServiceBase
b. ServiceInstaller
c. ServiceProcessInstaller
d. ServiceController
5. Vous devez modifier l'affichage et le comportement d'un Windows Form afin que le
formulaire puisse contenir plusieurs fenêtres enfants. Que devez-vous faire ?
a. Définir la propriété IsMdiContainer du formulaire sur True.
b. Définir la propriété MdiParent pour toutes les fenêtres enfants.
c. Définir la propriété MdiChild du formulaire.
d. Définir la propriété IsMdiChild du formulaire.
6. Vous développez un Windows Form qui répond à des événements de souris. Lorsque
la souris se déplace, vous devez appeler la méthode Form1_HandleMouse. Le code
que vous écrivez ne doit jamais affecter le code de gestion d'événements existant.
Quelle instruction devez-vous utiliser pour joindre le gestionnaire d'événements
à l'événement ?
a.
this.MouseDown = new MouseEventHandler
      (Form1_HandleMouse);
b.
this.MouseMove = new MouseEventHandler
       (Form1_HandleMouse);
140 | Leçon 5

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

■ Évaluation des compétences


Scénario 5-1 : utilisation de l'héritage visuel
Vous devez créer un Windows Form similaire à celui que vous avez créé dans
l'exercice VisualInheritance. Cependant, cette fois, l'exigence est que la couleur d'arrière-
plan de ce formulaire doit correspondre à celle actuellement sélectionnée sur le bureau de
l'utilisateur. Comment allez-vous développer un tel formulaire ?

Scénrario 5-2 : gestion de l'événement MouseDown


Vous développez un jeu qui permet aux utilisateurs d'atteindre une zone cible sur un
Windows Form avec leur souris. Vous devez développer un formulaire expérimental qui
affiche les coordonnées X et Y de l'emplacement sur lequel l'utilisateur clique dans la
barre de titre du formulaire. Que devriez-vous faire ?
Présentation des applications de bureau | 141

■ Évaluation de la maîtrise des concepts


Scénario 5-3 : utilisation d'une entrée de console
Vous développez un programme qui manipule du texte. Vous devez écrire une application
console qui accepte du texte de l'utilisateur et convertit le texte en lettres majuscules.
Quel code devez-vous écrire pour satisfaire cette exigence ?

Scénario 5-4 : utilisation de l’utilitaire Net (net.exe)


L'utilitaire de la ligne de commande net.exe est livré installé avec Windows. Cet utilitaire
vous permet de réaliser plusieurs commandes de mise en réseau dont le contrôle de
services Windows. Vous voulez utiliser net.exe pour travailler avec le service Windows
FirstService créé précédemment. Quelles étapes devez-vous entreprendre afin de
suspendre, d'arrêter et de démarrer un service Windows en utilisant l'utilitaire net.exe ?
6 LEÇON
Présentation des
bases de données
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

Compétences/Concepts Objectif de l'examen MTA Numéro de l'objectif


de l'examen MTA
Présentation des objets Comprendre les systèmes de gestion 6.1
de base de données relationnelle.
Présentation des valeurs et Comprendre les méthodes 6.2
des références d'interrogation des bases de données.
Présentation de l'encapsulation Comprendre les méthodes de 6.3
connexion de base de données.

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.

■ Présentation des concepts de bases de données relationnelles

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

Présentation des bases de données

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.

Présentation des concepts de bases de données relationnelles

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

Présentation de la conception de base de données relationnelle

La conception de base de données relationnelle est le processus consistant


à déterminer la structure de base de données relationnelle appropriée pour répondre
aux besoins de l'entreprise.

Les données d'une organisation constituent l'une de ses principales ressources.


Par conséquent, lorsque vous concevez une base de données, l'un des principes directeurs
est d'assurer l'intégrité des données. L'intégrité signifie que les données contenues dans la
base de données sont exactes et cohérentes à tout moment.
Le processus de conception de base de données comprend les étapes suivantes :
1. Développer une instruction de mission pour la base de données : identifie
l'objectif de la base de données, la façon dont elle sera utilisée et par qui. Cette étape
donne le ton pour le reste du processus de conception.
2. Déterminer les données qui doivent être stockées : identifie l'ensemble des types
de données qui doivent être stockées dans la base de données. En général, ces
informations sont recueillies dans le cadre de la tâche d'analyse des spécifications par
l'intermédiaire de diagrammes entité-relation.
3. Répartir les données en tables et en colonnes : identifie les tables et les
informations que vous souhaitez stocker dans ces tables.
4. Choisir les clés primaires : une clé primaire est une colonne ou un ensemble de
colonnes qui identifie de manière unique chaque ligne de données contenues dans
une table.
5. Identifier les relations : identifie la façon dont les données d'une table sont liées aux
données d'une autre table. Par exemple, pour chaque client d'une table Customers,
vous pouvez avoir plusieurs commandes dans la table Orders. Cette relation est
appelée relation un-à-plusieurs.
6. Appliquer le processus de normalisation : applique les règles de normalisation
des données pour garantir que tous les problèmes qui peuvent affecter l'intégrité des
données sont résolus. Vous en apprendrez plus sur le processus de normalisation
ultérieurement dans cette leçon.
Après avoir établi l'objectif d'une base de données, la série d'étapes suivante (de l'étape 2
à l'étape 5) peut être effectuée dans le cadre de la modélisation entité-relation. La dernière
étape de la normalisation peut ensuite être appliquée à la sortie de cette modélisation.

Présentation des diagrammes d'entité-relation

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.

La modélisation entité-relation est un processus utilisé pour créer le modèle de données


conceptuel d'un système, et les diagrammes d'entité-relation sont les outils de modélisation
graphiques permettant de mettre en œuvre cette modélisation. Les éléments de base
essentiels d'un diagramme d'entité-relation (ERD) sont l'entité, l'attribut et la relation :
• Entité : une entité est une construction d'un objet physique ou un concept. Une
commande, un client, un employé, etc., en sont des exemples. Une entité porte
généralement le nom de ce qu'elle représente.
• Attribut : les attributs sont les propriétés particulières d'une entité. Par exemple,
pour une entité Order, certains attributs utiles peuvent être OrderNumber, OrderDate,
ShipDate et ShipVia. De même, pour une entité Employee, certains attributs utiles
peuvent être EmployeeId, LastName, FirstName, Title et HireDate. Chaque entité
doit avoir un ensemble d'attributs qui l'identifient de manière unique, appelé clé
primaire de l'entité. Par exemple, une valeur OrderNumber est un attribut qui identifie
de manière unique une commande ; elle est donc une clé primaire de l'entité Order.
Présentation des bases de données | 145

• 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.

MAPPAGE DE DIAGRAMMES D'ENTITÉ-RELATION (ERD) À UNE BASE


DE DONNÉES RELATIONNELLE
Pour convertir un diagramme d'entité-relation (ERD) en base de données relationnelle,
vous devez procéder comme suit :
1. Mappez les entités : commencez par créer une table pour chaque entité définie dans
le diagramme. Les attributs deviendront des colonnes. N'oubliez pas de définir le ou
les attributs de clé primaire pour la ou les colonnes de clé primaire de la table.
2. Mappez la relation : mappez ensuite la relation un-à-plusieurs en veillant à ce que
la table sur le côté N de la relation contienne la colonne de clé primaire de la table
sur le côté 1 de la relation. Pour la figure 6-2, cela peut être effectué en ajoutant une
colonne CustomerID dans la table Order qui est mappée à la colonne ID de la table
Customer. Dans le contexte de la table Order, CustomerID est aussi appelée « clé
étrangère ». En ajoutant cette colonne dans la table Order, il est possible de répondre
à des questions telles que « Quelles sont toutes les commandes passées par un client
particulier ? » et « Qui est le client d'une commande spécifique ? »
146 | Leçon 6

Lorsqu'elle est mappée à une base de données relationnelle, le diagramme d'entité-relation


(ERD) présenté à la figure 6-2 génère les tables suivantes :

Customers

ID Name City
1001 Jane Doe Berlin
1002 John Doe Tokyo
1003 Howard Steel Sydney

Orders

OrderID CustomerId OrderDate ShipDate


101 1001 10/1/2010 10/7/2010
102 1002 10/5/2010 10/10/2010
103 1001 10/4/2010 10/10/2010

Présentation de la normalisation de données

Le processus de normalisation de données garantit qu'une conception de base de


données ne comporte aucun problème susceptible d'entraîner une perte d'intégrité
de données.

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

BookId BookName CategoryId CategoryName


1 Cooking Light 1001 Cooking
2 Prophecy 1002 Mystery & Thriller
3 Shift 1003 Business
4 The Confession 1002 Mystery & Thriller

Cependant, cette conception de la table Books présente trois problèmes :


• Anomalie d'insertion : une anomalie d'insertion est une situation dans laquelle vous
ne pouvez pas insérer de nouvelles données dans une base de données en raison d'une
dépendance non liée. Par exemple, si vous voulez que votre base de données dispose
d'un nouvel élément CategoryId et d'un nouvel élément CategoryName pour les
livres d'histoire, la conception actuelle ne le permet pas à moins d'avoir au préalable
un livre d'histoire à placer dans cette catégorie.
Présentation des bases de données | 147

• Anomalie de suppression : une anomalie de suppression est une situation dans


laquelle la suppression d'un élément de donnée entraîne une perte involontaire d'autres
données. Par exemple, si vous supprimez l'élément BookId 3 de la table Books, le
simple fait que vous ayez eu un élément CategoryName Business serait perdu.
• Anomalie de mise à jour : une anomalie de mise à jour est une situation dans
laquelle la mise à jour d'une seule valeur de données requiert la mise à jour de
REMARQUE
* plusieurs lignes. Supposons, par exemple, que vous décidez de remplacer le nom
La normalisation vous de catégorie Mystery & Thriller par simplement Mystery. Avec la conception de
permet d'assurer une table actuelle, vous devrez changer le nom de catégorie pour tous les livres de cette
conception de base de catégorie. Si vous mettez à jour le nom de catégorie sur une ligne, mais pas sur les
données correcte, mais autres, vous risquez également d'avoir, au final, des données incohérentes dans la
elle ne peut pas garantir base de données.
que vous disposez des
Chacun de ces problèmes peut être résolu en suivant le processus de normalisation.
éléments de données Il existe cinq formes normales qui sont utilisées dans le cadre de ce processus. Toutefois,
appropriés avec cette leçon ne traite que les trois premières, car elles constituent l'ensemble de ce qui est
lesquels commencer. nécessaire dans la plupart des cas.

PRÉSENTATION DE LA PREMIÈRE FORME NORMALE


Afin qu'une table se trouve en première forme normale (1FN), aucune des colonnes de la
table ne doit contenir plusieurs valeurs sur la même ligne de données. Par exemple, si une
table Customers stocke les données comme indiqué ci-dessous, cette table n'est pas en
1FN car la colonne PhoneNumber stocke plusieurs valeurs sur chaque ligne.

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 création de colonnes redondantes telles que PhoneNumber1 et PhoneNumber2 pour


*
REMARQUE normaliser la table Customer ne serait pas une solution acceptable, car le première
forme de normalisation n'autorise pas ces colonnes redondantes.

PRÉSENTATION DE LA DEUXIÈME FORME NORMALE


Pour qu'une table soit en deuxième forme normale (2FN), elle doit d'abord satisfaire aux
exigences pour la 1FN. En outre, la 2FN exige que toutes les colonnes ne correspondant
pas à une clé soient fonctionnellement dépendantes de l'intégralité de la clé primaire.
Afin de comprendre la 2FN, vous devez d'abord comprendre la dépendance fonctionnelle.
Prenons l'exemple de la table Customers ci-dessus. Dans la table Customers, la colonne Id
est la clé primaire, car elle identifie de façon unique chaque ligne. Les colonnes
FirstName et LastName sont des colonnes ne correspondant pas à une clé, car elles
ne font pas partie de la clé primaire. FirstName et LastName sont toutes les deux
fonctionnellement dépendantes d'Id car, si vous prenez une valeur d'Id, vous pouvez
toujours trouver une valeur pour les éléments FirstName et LastName correspondants sans
aucune ambiguïté. La table Customers ne contient aucune colonne ne correspondant pas
à une clé qui ne dépende pas fonctionnellement de la clé primaire. Les tables Customers
et CustomerPhones sont donc déjà en 2FN.

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.

À l'inverse, considérons la table suivante :

Orders

OrderId CustomerId OrderDate CustomerName


101 1 10/1/2010 Jane Doe
102 2 10/5/2010 John Doe
103 1 10/4/2010 Jane Doe

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

PRÉSENTATION DE LA TROISIÈME FORME NORMALE


La troisième forme normale (3FN) exige que la 2FN soit satisfaite et qu'il n'existe aucune
dépendance fonctionnelle entre les attributs ne correspondant pas à une clé. En d'autres
termes, chaque attribut ne correspondant pas à une clé doit être dépendant uniquement de
la clé primaire, et de rien d'autre. Prenons, par exemple, la table suivante :

Items

ItemId SupplierId ReorderFax


101 100 (514) 555-2955
102 11 (514) 555-9022
103 525 (313) 555-5735

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

■ Présentation des méthodes d'interrogation des base de données

Les données sont au cœur de nombreuses applications de gestion des informations


professionnelles, et, en tant que développeur, vous allez probablement passer beaucoup
de temps à travailler sur des tâches liées aux données. Dans cette section, vous allez
L'essentiel apprendre comment utiliser le langage SQL (Structured Query Language) et les
procédures stockées SQL Server pour sélectionner, insérer, mettre à jour et supprimer
des données.

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.

SE CONNECTER À LA BASE DE DONNÉES NORTHWIND


PRÉPAREZ-VOUS. Avant d'effectuer ces étapes, n'oubliez pas de lancer Microsoft
Visual Studio.
1. Ouvrez la fenêtre Explorateur de serveurs. Sélectionnez le nœud Connexions de
données, puis cliquez sur le bouton Connexion à la base de données de la barre
d'outils Explorateur de serveurs.
Dans l'édition Visual Studio Express, la fenêtre de l'Explorateur de serveurs s'appelle
*
REMARQUE « Explorateur de bases de données », et elle peut être ouverte en sélectionnant
Affichage > Autres fenêtres > Explorateur de bases de données.
Présentation des bases de données | 151

2. Dans la boîte de dialogue Ajouter une connexion, accédez au fichier de la base de


données Northwind (northwnd.mdf), comme illustré à la figure 6-3.

Figure 6-3
Connexion à la base de
données Northwind

3. Utilisez l'authentification Windows comme mode d'authentification, puis cliquez sur


le bouton Tester la connexion pour vous assurer que vous pouvez vous connecter à la
base de données. Enfin, cliquez sur le bouton OK pour ajouter la connexion à la base
de données.
4. Une fois la connexion établie, la base de données est disponible en tant que connexion
sous le nœud Connexions de données dans l'Explorateur de serveurs. Développez la
base de données pour afficher les tables, les procédures stockées et d'autres objets de
base de données, comme illustré à la figure 6-4.

Figure 6-4
Accès à la base de données
Northwind via l'Explorateur
de serveurs
152 | Leçon 6

5. Cliquez avec le bouton droit sur le nœud NORTHWND.MDF, puis sélectionnez


Propriétés. La fenêtre Propriétés, illustrée à la figure 6-5, doit s'afficher. Dans cette
fenêtre, notez la propriété Chaîne de connexion. Vous utiliserez la valeur de cette
propriété pour vous connecter à la base de données Northwind à partir d'une
application C#.

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

Il existe de nombreuses manières de communiquer avec SQL Server afin d'exécuter


des requêtes de base de données.

Il existe de nombreuses façons d'envoyer des requêtes à un serveur SQL Server. Par exemple,


vous pouvez utiliser n'importe lequel des éléments suivants :
• Environnement de développement intégré (IDE) Visual Studio
• Application C#
• Analyseur de requêtes SQL
• Utilitaire d'invite de commandes osql
Notez que l'Analyseur de requêtes SQL et les utilitaires d'invite de commandes osql sont
des outils installés avec SQL Server.

EXÉCUTER DES REQUÊTES DANS VISUAL STUDIO

PRÉPAREZ-VOUS. Pour utiliser l'IDE Visual Studio et des applications C# pour exécuter


des requêtes SQL, procédez comme suit :
1. Sélectionnez la base de données Northwind dans l'Explorateur de serveurs. Cliquez
avec le bouton droit sur la base de données, puis sélectionnez Nouvelle requête. Cette
action ouvre un concepteur de requêtes et affiche une boîte de dialogue Ajouter une
table. Sélectionnez la table Customers, puis cliquez sur Ajouter. Cliquez sur Fermer
dans la boîte de dialogue Ajouter une table.
2. Dans le volet SQL du concepteur de requêtes (qui est la zone qui affiche le texte de la
requête), modifiez l'instruction SQL comme suit :
SELECT * FROM Customers
3. Dans le menu Visual Studio, sélectionnez l'option Concepteur de requêtes > Exécuter SQL,
ou cliquez sur le bouton Exécuter SQL de la barre d'outils. L'instruction SQL est
envoyée au serveur SQL pour être exécutée, et des résultats semblables à ceux de la
figure 6-6 doivent s'afficher.
Présentation des bases de données | 153

Figure 6-6
Concepteur de requêtes
Visual Studio

Dans Visual Studio, le concepteur de requêtes affiche jusqu'à quatre volets. De haut en


bas, ces volets sont les suivants :
• Volet Schéma : ce volet affiche les tables impliquées dans la requête et les relations
entre ces tables, ainsi que toutes les colonnes qu'elles contiennent.
• Volet Critères : le volet Critères présente les colonnes qui ont été sélectionnées dans
le cadre de la requête, ainsi que des informations de tri et de filtrage supplémentaires.
• Volet SQL : ce volet affiche l'instruction SQL réelle qui va être exécutée.
• Volet Résultats : le volet Résultats affiche les résultats (le cas échéant) après
l'exécution de la requête.
La barre d'outils du concepteur de requêtes comprend des boutons permettant de masquer
ou d'afficher chacun de ces quatre volets. Pour l'exercice suivant, vous avez uniquement
besoin du volet SQL et du volet Résultats.

EXÉCUTER DES REQUÊTES À PARTIR D'APPLICATIONS C#

PRÉPAREZ-VOUS. Pour exécuter des requêtes à partir d'applications C#, procédez comme


suit :
1. Créez un projet d'application Windows nommé QueryCS.
2. Dans le Windows Form, ajoutez un contrôle TextBox, un contrôle Button et un contrôle
DataGridView. Affectez à la propriété MultiLine du contrôle TextBox la valeur True.
Affectez à la propriété Text du contrôle Button la valeur Exécuter SQL.
3. Double-cliquez sur le contrôle Button pour générer le gestionnaire d'événements
pour son événement Click. Modifiez le gestionnaire d'événements comme indiqué
ci-dessous :
private void button1_Click(
  object sender, EventArgs e)
{
  if (textBox1.TextLength > 0)
  {
   SelectData(textBox1.Text);
  }
}
154 | Leçon 6

4. Ajoutez la méthode suivante à la classe. 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 :
private void SelectData(string selectCommandText)
{
  try
  {
    // Modifier la chaîne de connexion
    // pour faire correspondre à votre système.
    string selectConnection =
    @"Data Source=.\SQLEXPRESS;" +
    @"AttachDbFilename=" +
    @"c:\SqlSampleDB\NORTHWND.MDF;" +
    @"Integrated Security=True;" +
    @"Connect Timeout=30;User Instance=True";
    SqlDataAdapter dataAdapter =
      new SqlDataAdapter(
       selectCommandText, selectConnection);
    DataTable table = new DataTable();
    dataAdapter.Fill(table);
    dataGridView1.DataSource = table;
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }
}
5. Ajoutez les directives using suivantes au code :
using System.Data;
  using System.Data.SqlClient;
Sélectionnez Déboguer > Démarrer le débogage pour exécuter le projet. Entrez
une requête SQL valide, puis cliquez sur le contrôle Button. La sortie présentée à la
figure 6-7 doit s'afficher.

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

L'instruction SELECT est utilisée pour récupérer des données à partir d'une ou de


plusieurs tables de base de données.

L'instruction SELECT prend généralement la forme suivante :


SELECT liste_de_champs
FROM liste_de_tables
WHERE clause_where
GROUP BY clause_group_by
HAVING clause_having
ORDER BY clause_order_by
Chacune de ces lignes de code figurant dans l'instruction SELECT est appelée « clause ».
Les clauses SELECT et FROM sont requises, mais les autres sont facultatives.
Par exemple, voici une instruction SQL qui contient uniquement les clauses requises :
SELECT OrderId, CustomerId
FROM Orders
Si vous souhaitez répertorier tous les champs d'une table, vous pouvez également utiliser
le raccourci suivant au lieu de lister explicitement tous les champs :
SELECT *
FROM Orders
En outre, vous pouvez sélectionner des informations provenant de plusieurs tables ;
par exemple :
Select OrderId, Customers.CustomerId, ContactName
From Orders, Customers
Customers.CustomerId est un nom complet, car il spécifie à la fois le nom de la table et
le nom du champ. Cela est nécessaire car la table Orders et la table Customers incluent
toutes les deux ce champ. Vous devez donc indiquer à SQL Server à quelle table
spécifique vous voulez faire référence.
Si vous exécutez cette requête, vous obtiendrez beaucoup plus d'enregistrements que
prévu. Cela se produit car, bien que vous ayez indiqué à SQL Server quelles tables inclure,
vous n'avez donné aucune information sur la façon de lier ces tables. Par conséquent,
SQL Server construit le jeu de résultats pour inclure toutes les lignes de la table Customer
correspondant à chaque ligne de la table Orders. Ce type de jointure, appelée « jointure
croisée », n'est pas très utile dans le cas présent.
Une requête qui ferait correspondre chaque commande au client correspondant serait,
bien sûr, beaucoup plus utile. Le mot clé INNER JOIN peut vous aider à y parvenir,
comme le montre la requête suivante :
SELECT OrderID, Customers.CustomerId, ContactName
FROM Orders INNER JOIN Customers
ON Orders.CustomerId = Customers.CustomerId
156 | Leçon 6

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

Dans l'instruction SQL précédente, Count est une fonction d'agrégation. En d'autres


termes, elle retourne un résultat basé sur un groupe de lignes. T-SQL prend en charge
un certain nombre de fonctions d'agrégation différentes. En voici quelques-unes des plus
courantes :
• Count : retourne le nombre d'enregistrements
• Sum : retourne la valeur totale d'une colonne donnée
• Avg : retourne la valeur moyenne d'une colonne donnée
• Min : retourne la plus petite valeur d'une colonne donnée
• Max : retourne la plus grande valeur d'une colonne donnée

MISE À JOUR DE DONNÉES

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

Utilisation de procédures stockées

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.

CRÉATION ET EXÉCUTION D'UNE PROCÉDURE STOCKÉE


La commande CREATE PROCEDURE peut être utilisée pour créer une procédure stockée.
Vous pouvez utiliser le mot clé CREATE PROCEDURE de T-SQL pour créer une
procédure stockée. Vous pouvez exécuter l'instruction CREATE PROCEDURE à partir de
n'importe quelle interface qui vous permet d'entrer et d'exécuter des instructions T-SQL.
160 | Leçon 6

CRÉER UNE PROCÉDURE STOCKÉE À PARTIR DE VISUAL STUDIO

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.

UTILISATION DE PROCÉDURES STOCKÉES PARAMÉTRABLES

Les procédures stockées paramétrables vous permettent de passer des arguments


runtime au serveur SQL Server.

La possibilité de passer des paramètres augmente considérablement la puissance des


procédures stockées. Les valeurs de paramètres peuvent être fournies aux procédures
stockées au moment de l'exécution.
Supposons que vous voulez connaître le total des ventes pour un client donné de la base
de données Northwind. Dans ce cas, vous devez pouvoir spécifier la valeur CustomerId
au moment de l'exécution.

CRÉER UNE PROCÉDURE STOCKÉE PARAMÉTRABLE

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.

EXÉCUTER DES PROCÉDURES STOCKÉES PARAMÉTRABLES À PARTIR DE C#

PRÉPAREZ-VOUS. Pour exécuter des procédures stockées paramétrables à partir de C#,


procédez comme suit :
1. Créez un projet d'application Windows nommé ParameterizedSP.
2. Placez un contrôle Label sur le formulaire, puis affectez à sa propriété Text la valeur
« Customer Id: ». Placez un contrôle TextBox à côté de ce contrôle, puis nommez
le contrôle CustomerIdTextBox. Ensuite, placez un contrôle Button et affectez à sa
propriété Name la valeur GetTotalSalesButton et à la propriété Text la valeur « Get
Total Sales. » Enfin, placez un contrôle Label sur le formulaire, puis nommez-le
TotalSalesLabel. Organisez les contrôles afin qu'ils ressemblent à la figure 6-10.
162 | Leçon 6

3. Double-cliquez sur le contrôle Button pour générer le gestionnaire d'événements


pour son événement Click. Modifiez le gestionnaire d'événements comme indiqué
ci-dessous :
private void GetTotalSalesButton_Click(
    object sender, EventArgs e)
{
  TotalSalesLabel.Text = String.Format(
    "Total Sales: {0}",
    GetTotalSales(CustomerIdTextBox.Text));
}
4. Ajoutez la méthode suivante à la classe. 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 :
private double GetTotalSales(string customerId)
{
  double totalSales = −1;
  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();
     command.CommandType =
       CommandType.StoredProcedure;
     command.CommandText = "GetCustomerSales";
     command.Parameters.AddWithValue(
       "@CustomerId", customerId);
     command.Parameters.AddWithValue(
       "@TotalSales", null);
     command.Parameters["@TotalSales"].DbType
       = DbType.Currency;
     command.Parameters["@TotalSales"].Direction
       = ParameterDirection.Output;
     connection.Open();
     command.ExecuteNonQuery();
Présentation des bases de données | 163

     totalSales = Double.Parse(


       command.Parameters["@TotalSales"]
       .Value.ToString());
     connection.Close();
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }
  return totalSales;
}
5. Ajoutez les directives using suivantes au code :
using System.Data;
using System.Data.SqlClient;
Sélectionnez Déboguer > Démarrer le débogage pour exécuter le projet. Entrez une
valeur CustomerId valide. La sortie présentée à la figure 6-10 doit s'afficher.

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.

Le code précédent comprend les lignes suivantes :


connection.Open();
command.ExecuteNonQuery();
totalSales = Double.Parse(
  command.Parameters["@TotalSales"]
  .Value.ToString());
connection.Close();
Ici, vous ouvrez tout d'abord la connexion de base de données, vous faites ce que vous
avez à faire avec la connexion, puis vous fermez la connexion. L'objet qui contient des
références à la connexion de base de données utilise beaucoup de ressources système ;
son exécution est donc coûteuse. Par conséquent, il est recommandé de fermer cet objet
dès que vous avez terminé de l'utiliser. Si vous ne fermez pas la connexion, vous créez
une fuite de mémoire dans le programme, ce qui peut entraîner une dégradation de ses
performances.
164 | Leçon 6

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

■ Présentation des méthodes de connexion de base de données

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.

Utilisation de fichiers plats

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.

LIRE À PARTIR D'UN FICHIER TEXTE ET ÉCRIRE DANS UN FICHIER TEXTE

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

  catch (Exception ex)


  {
    Console.WriteLine(ex.Message);
  }
}
3. Ajoutez les directives using suivantes à votre code :
using System.Data.SqlClient;
  using System.IO;
4. Générez et exécutez le programme. Recherchez le fichier nommé CustomerList.txt dans
le dossier Mes Documents, puis vérifiez que les données client ont été écrites. De plus,
comparez la sortie affichée dans la fenêtre de console avec le contenu du fichier.
Le code présenté dans cet exercice ouvre tout d'abord un nouvel objet StreamWriter et
appelle sa méthode WriteLine plusieurs fois pour écrire du texte dans un fichier texte.
Il crée ensuite un objet StreamReader pour lire le texte contenu dans le fichier qui vient
d'être créé à l'aide de la méthode ReadLine. Quand il n'y a plus de données à lire, l'objet
ReadLine retourne une valeur null. Le code utilise cette valeur pour déterminer que la
lecture du fichier texte est terminée.

Utilisation du langage XML

XML (eXtensible Markup Language) est un format texte permettant de représenter


des données structurées.

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.

LIRE À PARTIR D'UN FICHIER XML

PRÉPAREZ-VOUS. Pour lire à partir d'un fichier XML, procédez comme suit :


1. Créez un projet d'application console appelé WorkingWithXmlReader.
2. Ajoutez le code suivant à la méthode Main de la classe Program :
using (XmlReader reader =
 XmlReader.Create("Customers.xml"))
{
  while (reader.Read())
  {
Présentation des bases de données | 169

    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.

Utilisation d'objets DataSet

Un DataSet est une représentation en mémoire de données relationnelles.

Un DataSet est une représentation en mémoire de données relationnelles. Tout comme


une base de données, un DataSet peut avoir des tables, des relations et des contraintes
d'intégrité de données telles que des contraintes uniques ou des contraintes de clé
étrangère. Un DataSet est généralement créé en récupérant des données d'une source de
données telle qu'une base de données. Après avoir créé un DataSet, vous pouvez travailler
avec toutes les données contenues dans le DataSet, même quand le lien vers la source
des données est temporairement indisponible. Quand des modifications sont apportées
aux données, seule la copie en mémoire des données est mise à jour. La connexion à la
source de données est nécessaire uniquement au moment de la mise à jour de la source
de données avec les modifications du DataSet. Le DataSet est très utile pour créer des
applications déconnectées. Les applications déconnectées sont des applications qui
peuvent continuer à fonctionner sans une connexion constante à des ressources réseau
telles que des bases de données.
Toutes les classes liées à un DataSet font partie de l'espace de noms System.Data.
Un objet DataSet est créé à l'aide de la classe DataSet. Le DataSet se compose d'une
collection d'objets DataTable. Un DataTable est comme une table de base de données
relationnelle. Un objet DataTable possède une collection d'objets DataColumn qui
représentent les colonnes de la table. Les lignes du DataTable sont représentées par la
collection DataRow.
Le 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. Le DataAdapter fournit également
des commandes permettant de récupérer des données de la source de données et des
commandes permettant de mettre à jour la source de données avec toutes les modifications
apportées.
Le .NET Framework fournit trois classes DataAdapter pour travailler avec différents types
de sources de données :
• La classe OdbcDataAdapter permet de travailler avec les sources de données ODBC.
La classe OdbcDataAdapter appartient à l'espace de noms System.Data.Odbc.
• La classe OleDbDataAdapter permet de travailler avec des sources de données OLEDB.
La classe OleDbDataAdapter appartient à l'espace de noms System.Data.OleDb.
• La classe SqlDataAdapter permet de travailler avec les bases de données SQL Server.
La classe SQLDataAdapter appartient à l'espace de noms System.Data.SqlClient.

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.

LIRE À PARTIR D'UN OBJET DATASET EN MÉMOIRE

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

DataSet customerOrders = new DataSet();


customerAdapter.Fill(
    customerOrders, "Customers");
ordersAdapter.Fill(
    customerOrders, "Orders");
DataRelation relation =
    customerOrders.Relations.Add("CustomerOrders",
    customerOrders.Tables["Customers"]
        .Columns["CustomerID"],
    customerOrders.Tables["Orders"]
        .Columns["CustomerID"]);
foreach (DataRow customerRow in
    customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(customerRow["CustomerID"]);
    foreach (DataRow orderRow in
        customerRow.GetChildRows(relation))
        Console.WriteLine("\t" +
            orderRow["OrderID"]);
}
  Console.WriteLine(
        "Appuyez sur n'importe quelle touche pour continuer . . .");
  Console.ReadKey();
}
3. Ajoutez la directive using suivante au programme :
using System.Data;
using System.Data.SqlClient;
4. Sélectionnez Projet > Définir comme projet de démarrage pour définir le projet comme
projet de démarrage de la solution.
5. Sélectionnez Débogage > Démarrer le débogage (ou appuyez sur F5) pour exécuter
le programme. Notez que la fenêtre de console répertorie tous les clients de la table
Customers. Chaque CustomerID est suivi de la valeur OrderID correspondant à ce client.
PRÊT POUR LA Le code présenté dans cet exercice crée d'abord un DataSet avec deux objets DataTable :
CERTIFICATION
Customers et Orders. Le DataSet crée également un objet DataRelation qui établit la
Comprenez-vous les
diverses méthodes de relation entre la table Customers et la table Orders sur la colonne CustomerID. Cette
connexion de base de relation vous permet d'appeler la méthode GetChildRow sur une ligne de client pour
données ? récupérer les lignes de commandes correspondant à chaque client.
6.3

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

RÉSUMÉ DES COMPÉTENCES

Dans cette leçon, vous avez appris ce qui suit :


• Une base de données relationnelle organise les informations en tables. Une table
est une liste de lignes et de colonnes.
• La conception de base de données relationnelle est le processus consistant à
déterminer la structure de base de données relationnelle appropriée pour
répondre aux besoins de l'entreprise.
• Les diagrammes d'entité-relation sont utilisés pour modéliser les entités, leurs
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.
• Le processus de normalisation de données garantit qu'une conception de base
de données ne comporte aucun problème susceptible d'entraîner une perte
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.

■ Évaluation des connaissances


Compléter l'espace vide
Complétez les phrases suivantes en écrivant le ou les mots corrects dans l'espace fourni.
1. Pour qu'une table se trouve dans la _______________, aucune des colonnes ne doit
contenir plusieurs valeurs sur la même ligne de données.
2. La _______________ exige que toutes les colonnes ne correspondant pas à une clé
soient fonctionnellement dépendantes de l'intégralité de la clé primaire.
3. La _______________ exige qu'il n'existe aucune dépendance fonctionnelle entre les
attributs ne correspondant pas à une clé.
4. Les éléments de base essentiels d'un diagramme d'entité-relation sont
_______________, _______________ et _______________.
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.
6. L'objet utilisé avec l'instruction using doit implémenter l'interface ______________ .
7. L'instruction _______________ de T-SQL peut être utilisée pour créer une procédure
stockée.
174 | Leçon 6

8. Au cours du processus de _______________, vous appliquez un ensemble de règles


qui garantissent que la conception de votre base de données contribue à l'intégrité des
données et à la facilité de maintenance à l'avenir.
9. Vous trouvez des classes permettant de travailler avec des flux et des magasins de
stockage dans l'espace de noms _______________.
10. Le format _______________ est un format de représentation de données hiérarchique.

Questions à choix multiples


Entourez la lettre correspondant à la bonne réponse.
1. Votre application doit stocker l'image du produit en externe dans un fichier sur disque.
Vous aimeriez minimiser la taille de ce fichier sur disque. Parmi les objets suivants,
lequel devez-vous utiliser pour écrire ce fichier ?
a. FileStream
b. StreamWriter
c. BinaryWriter
d. XmlWriter
2. Votre programme C# doit retourner le nombre total de clients dans une base de
données. Le programme sera utilisé plusieurs fois par jour. Quelle est la manière
la plus rapide de retourner ces informations à partir de votre programme ?
a. Écrivez une requête SQL et utilisez la méthode SqlCommand.ExecuteScalar pour
l'exécuter.
b. Créez une procédure stockée permettant de retourner le nombre total de clients,
puis utilisez la méthode SqlCommand.ExecuteScalar pour l'exécuter.
c. Écrivez une requête SQL et utilisez la méthode SqlDataAdapter.Fill pour l'exécuter.
d. Créez une procédure stockée permettant de retourner le nombre total de clients,
puis utilisez la méthode SqlDataAdapter.Fill pour l'exécuter.
3. Vous devez modifier les enregistrements d'une table Products en signalant certains
produits comme étant en rupture de stock. Vous devez néanmoins faire cela
uniquement lorsque les valeurs UnitsInStock et UnitsOnOrder sont toutes les deux
nulles. Laquelle des instructions SQL suivantes devez-vous utiliser ?
a. INSERT
b. SELECT
c. UPDATE
d. DELETE
4. Vous devez mettre à jour les champs Region pour les clients se trouvant au Japon.
Vous écrivez l'instruction UPDATE SQL suivante :
UPDATE Customers
SET Region = 'EastAsia'
Vous testez la requête sur une base de données de test et découvrez que le nombre
des enregistrements concernés est supérieur à celui que vous aviez estimé. Vous
devez corriger l'instruction SQL. Que devez-vous faire ?
a. Ajouter une clause WHERE à l'instruction UPDATE.
b. Ajouter une clause SET supplémentaire à l'instruction UPDATE.
c. Ajouter une clause GROUP BY à l'instruction UPDATE.
d. Ajouter une clause HAVING à l'instruction UPDATE.
5. Vous développez une application qui doit récupérer une liste de clients à partir
d'une base de données SQL Server. L'application doit parcourir la liste de façon
séquentielle une fois, en traitant les enregistrements de chaque client. Parmi les
classes suivantes, laquelle devez-vous utiliser pour contenir la liste des clients afin
d'optimiser les performances ?
a. DataSet
b. DataTable
c. DataView
d. SqlDataReader
Présentation des bases de données | 175

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

■ Évaluation des compétences


Scénario 6-1 : création d'un diagramme d'entité-relation
Une entreprise a un certain nombre d'employés et chaque employé peut être affecté à un
ou à plusieurs projets. De plus, un ou plusieurs employés peuvent travailler sur chaque
projet. Établissez un diagramme d'entité-relation pour cette situation.

Scénario 6-2 : création d'une procédure stockée


Vous avez régulièrement besoin de générer une liste de clients se trouvant dans un pays
donné. Vous décidez, par conséquent, de créer une procédure stockée qui accepte le nom
du pays en tant que paramètre et qui retourne tous les clients de ce pays. Comment
devez-vous procéder ?

■ Évaluation de la maîtrise des concepts


Scénario 6-3 : normalisation de tables
Vous convertissez un diagramme d'entité-relation en tables. Vous obtenez la conception de
table suivante :

Books

BookId BookName CategoryId CategoryName


1 Cooking Light 1001 Cooking
2 Prophecy 1002 Mystery & Thriller
3 Shift 1003 Business
4 The Confession 1002 Mystery & Thriller

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 ?

Scénario 6-4 : création et gestion d'événements


Vous travaillez sur une application qui nécessite que vous enregistriez des informations
sur les clients de la table Customers de la base de données Northwind dans un
fichier XML. Ce fichier XML sera utilisé pour diverses tâches d'intégration de données.
Vous devez vous assurer que le nœud racine du code XML s'appelle Customers. Le
nœud racine aura alors un nœud Customer pour chaque client dans la table Customers.
Comment devez-vous procéder pour accomplir cette tâche ?
Annexe A
Notions fondamentales sur le
développement de logiciels :
Examen 98-361
Domaine de l'objectif Numéro de la Numéro de la leçon
compétence
Présentation des principes de base de la programmation
Comprendre le stockage informatique et les types de données. 1.1 1. 2
Comprendre les structures de décision en informatique. 1.2 1
Identifier la méthode appropriée pour gérer les répétitions. 1.3 1
Comprendre la gestion des erreurs. 1.4 1
Présentation de la programmation orientée objet
Comprendre les notions fondamentales sur les classes. 2.1 2
Comprendre l'héritage. 2.2 2
Comprendre le polymorphisme. 2.3 2
Comprendre l'encapsulation. 2.4 2
Présentation générale du développement logiciel
Comprendre la gestion du cycle de vie des applications. 3.1 3
Interpréter les spécifications des applications. 3.2
Comprendre les algorithmes et les structures de données. 3.3 3
Présentation des applications Web
Comprendre le développement de pages Web. 4.1 4
Comprendre le développement d'applications Web Microsoft ASP.NET. 4.2 4
Comprendre l'hébergement Web. 4.3 4
Comprendre les services Web. 4.4 4
Présentation des applications de bureau
Comprendre les applications Windows Forms. 5.1 5
Comprendre les applications console. 5.2 5
Comprendre les services Windows. 5.3 5
Présentation des bases de données
Comprendre les méthodes d'interrogation des bases 6.1 6
de données relationnelles.
Comprendre les méthodes d'interrogation des bases de données. 6.2 6
Comprendre les méthodes de connexion de base de données. 6.3 6
177
Index

@@IDENTITY, 163 cycle de vie d'une page, 96–99


+=opérateur, 42 développement d’application, 95–104
<?, 167 directive @Page, 99
gestion de l'état, 99–104
gestionnaires d’événements, 97
A infrastructure, 95
accesseur Get, 36 postback, 96, 97
accesseur Set, 36 processus de demande de page, 96
accesseurs, 36 processus de requête/réponse HTTP, 95
Ajax, 93 attribut WebMethod, 101
algorithme de tri attribut WebService, 101
BubbleSort, 76–78 attribut, 168
QuickSort, 79–81
Algorithme Voir aussi Algorithme de tri B
défini, 2 balise < img >, 87
organigrammes, 2–3 balise <html>, 87
tables de décision, 3–4 Base de données, 143
allocation de mémoire, 45-47 bases de données relationnelles. test de régression Bases de
anomalie de mise à jour, 147 données, relationnelles
anomalie de suppression, 147 Bases de données SQL Server
anomalie d'insertion, 146 connexion à, 150-152
applications C# requêtes, applications C#, exécution à partir de, 153-155
caractère impératif, 150 requêtes, Visual Studio, exécution à partir de, 152-153
constantes, 8 bases de données, relationnelles
écriture, 5 conception, 144
instruction using, 164 concepts, 143
méthodes, 11 défini, 142
opérateurs, 10–11 diagrammes d'entité-relation, 144–146
procédures stockées, exécution à partir de, 161-164 normalisation de données, 146–149
requêtes, exécution à partir de, 153-155 tables, 143
structure, 6–8 bloc finally, 25
structures de contrôle, 17-22 bloc switch, 15
tableaux, 9–10 bloc try, 25
types de données, 8–9 boucle do-while, 19
variables, 8 boucle for, 20
applications de console, 129-131 boucle foreach, 21
applications déconnectées, 170 Boucle while
applications Web, déploiement, 106 défini, 17
Applications Windows Forms pièces, 19
création, 121–123 BubbleSort, 76–78
défini, 120
héritage visuel, 123–126 C
Interface multidocument (MDI), 126-129 Cast
modèle d'événement, 123 défini, 52
Applications, bureau entre des types, 52–53
applications consoles, 129–131 opérateur as, 53
Service Windows, 131–137 opérateur is, 53
Windows Forms, 120–129 chaînes de requête, 100
ASP.NET champs masqués, 100
classe Page, 96 classe DataAdapter, 170
classe Page, événements, exécution, 98–99 classe DataSet, 170, 172

179
180 | Index

classe de base encapsulation, 33, 47–48


héritage, 48–49 enqueue, 73
mot clé New, 55 – 56 espaces de noms, 42–43
mot clé override, 55–56 état de la session, 101–104. Voir aussi Gestion de l'état
Classe dérivée État de l'application, 101. Voir aussi Gestion de l'état
héritage, 48–50 Événements
mot clé New, 55 – 56 classe Page, exécution de, 98 – 99
mot clé override, 55–56 défini, 40, 121
classe EventArgs, 41 publication et abonnement, 41-42
classe HttpCookie, 100 Exceptions
classe sealed, 50, 51 défini, 24
classe ServiceInstaller, 135 gestion, 24 – 25
classe ServiceProcessorInstaller, 135 instruction try-catch-finally, 25-26
Classe expression de terminaison, 19
abstrait, création, 50-51 Extensible Markup Language (XML). Voir XML
création, 33–34
défini, 7, 33 F
dérivé, création, 49 feuilles de style en cascade (CSS, Cascading Style Sheets)
modificateur d'accès, 34 conception, 89
classes abstraites défini, 88
création, 50–51 fichier, lien vers un fichier HTML, 90 – 91
défini, 50 fichiers binaires, 165
clé primaire, 144 fichiers plats
code binaire, 4 défini, 164
CompareTo, 57 fichier texte, lire et écrire, 165-167
Console, 129 Fichiers texte, lecture et écriture, 165-167
Constantes, 8 files d'attente
Constructeurs, 35 défini, 72
Contient, 73, 74 opérateurs, 73
Cookies, 100 performance et utilisation, 73
CREATE PROCEDURE, 159–160 représentation interne, 72
FTP, 106
D
DataSet G
défini, 170 gestion de l'état
objet, lecture, 171-172 chaînes de requête, 100
délégué EventHandler, 41 champs masqués, 100
délégués, 40, 123 cookies, 100
dépendance fonctionnelle, 148 côté client, 100
Dequeue, 73 côté serveur, 101
deuxième formulaire normal, 148 défini, 99
développement de pages Web état de la session, 101–104
Cascading Style Sheets (feuilles de style en cascade), 88–92 état de l'application, 101
HTML, 86–88 ViewState, 100
JavaScript, 92–94 Gestion des versions, 68
programmation, côté client et côté serveur, 94 – 95 gestion du cycle de vie des applications
diagrammes d'entité-relation analyse des spécifications, 66–67
attribut, 144 développement logiciel, 67
base de données, relationnel, mappage vers, 145-146 gestion des versions, 68
défini, 144 processus de conception, 67
entité, 144 test de logiciels, 68–70. Voir aussi Tests
relation, 145 gestionnaires d'événements, 97
directive @Page, 99
directive using, 7 H
Hébergement Web
E applications Web, déploiement, 106
élément < link >, 91 défini, 104
élément < script >, 93 répertoires virtuels, création, 105 – 106
élément, 168
Index | 181

Services Internet (IIS), 104–105 M


sites Web, création, 104 membres statiques
héritage visuel, 123–126 création, 43–44
héritage défini, 43
à partir d'une classe object, 51-52 mot-clé this, 44
cast entre des types, 52–53 mémoire de pile des appels, 47
classe abstraite, 50-51 mémoire du segment, 47
classe de base, 48 méthode main, 7, 8, 11
classe dérivée, 48–50 méthode récursive, 23
classe sealed, 50, 51 Méthodes de connexion de base de données
défini, 48 DataSet, 170–173
opérateur as, 53 fichiers plats, 164-167
opérateur is, 53 XML, 167–170
HTTP (Hypertext Transfer Protocol), 86, 95, 107 méthodes de requête de base de données. Voir Structured Query
Hypertext Markup Language (HTML) Language (SQL)
balises, 87 Méthodes
défini, 86 défini, 11
document, création, 87-88 InitFields, 34-35
en-tête et corps, 87 instructions return, 34, 35
objectif de, 86 – 87 objets, 34–35
signatures, 34
I modificateurs d'accès, 34, 37, 48
IComparable, 56–58 mot clé New, 35, 55–56
initialiseur, 19 mot clé override, 55–56
instance, 33 mot clé static, 43
instruction case, 15 mot clé value, 37
instruction default, 15 mot-clé this, 38–39, 44
instruction DELETE, 150, 159
instruction if, 11 N
instruction if-else, 13 nom de classe qualifié complet, 7
Instruction INSERT, 150, 158–159 normalisation de données
instruction SELECT, 150, 155–157 défini, 146
instruction switch, 15 deuxième formulaire normal, 148
instruction try-catch-finally, 25-26 premier formulaire normal, 147–148
instruction UPDATE, 150, 157–158 troisième formulaire normal, 149
instruction using, 164
instructions de traitement, 167 O
intégrité de base de données, 144 Objets
Interface multidocument (MDI), 126-129 cast entre des types, 52–53
interfaces classes, création, 33-34
défini, 56 constructeurs, 35
icomparable, 56–58 création, 35–36
Internet, contre le Web, 86 DataSet en mémoire, lecture, 171
défini, 33, 35
J délégués, 40
JavaScript espaces de noms, 42–43
Ajax, 93 événements, 40–42
dans des fichiers externes, avantages, 94 membres statiques, 43–44
défini, 92 méthodes, 34–35
utilisation, 93–94 mot clé New, 35
mot-clé this, 38-39
L propriétés implémentées automatiquement, 37–38
langage de haut niveau, 4 propriétés, création, 36–37
Listes liées opérateur as, 53
défini, 74 opérateur is, 53
opérations, 75–76 opérateurs binaires, 10
performance et utilisation, 76 opérateurs ternaires, 10
représentation interne, 74–75 opérateurs unaires, 10
182 | 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

Vous aimerez peut-être aussi