Une remarque pertinente ? Une critique impertinente ? Un lynchage en règle ? Une invitation sous les tropiques ? Ecrivez-moi ! |
||||||||||||||||||||||||||||||||||||||||
Conçu et enseigné tel qu'en lui même, avec pertes, fracas et
humour de qualité supérieure par Christophe Darmangeat dans le M2 PISE du Master MECI (Université Paris 7) |
||||||||||||||||||||||||||||||||||||||||
|
Partie 4
Les bases du langage
Maintenant que vous êtes brillamment venus à bout de vos premiers
exercices en deux (ou peut-être trois) coups de cuiller à pot, nous
pouvons à présent faire
une petite halte afin d'accumuler quelques munitions en vue des combats
futurs. Nous
allons
donc lister une série d'instructions de base de Visual Basic, de celles
qui servent partout, tout le temps, en tout lieu et dans toutes les positions.
Remarque
qui vaut son pesant de lignes de code :
Comme tout langage un tant soit peu récent, VB.Net offre une telle gamme d'instructions que nombre d'entre elles sont redondantes. Rien que pour faire une boucle, par exemple, il y a au moins cinq écritures possibles. Le but de ce cours n'étant pas de remporter des concours d'érudition (surtout en Visual Basic, il y a tout de même des sujets d'étude plus affriolants), nous ferons ici dans l'utilitaire : pour chaque usage, une instruction, rarement deux, et jamais plus. Quant aux autres instructions possibles, nous les ignorerons superbement. Et voilà pour elles.
1. Les variables (déclaration, types et portées)
En VB.Net, à moins d'aller trifouiller l'option adéquate, par défaut, la
déclaration de toutes les variables est obligatoire.
Ce qui nous
conduit tout droit vers deux problèmes : celui du choix du type de la
variable, et celui de sa portée (qu'on a parfois un peu tendance à
oublier quand on débute).
1.1 Les types de variables En ce qui concerne le type, voici le tableau récapitulatif des
possibilités offertes par VB.Net :
Cela dit, nous verrons au fur et à mesure de ce cours qu'il existe en
réalité une pléthore d'autres types, qui sont des déclinaisons du type
objet. En effet, tout objet (donc, tout contrôle) peut être stocké dans
une variable du type de cet objet (donc de ce contrôle). Plus exactement,
Tout objet peut être pointé, et donc manipulé, par une variable du type
adéquat. On y reviendra...
1.2 Portée des variables En ce qui concerne la portée, voilà le topo :
selon la durée de vie souhaitée pour une variable, on procèdera à la
déclaration de cette variable à différents endroits du code.
Il existe en théorie quatre, mais en pratique
trois niveaux de portée pour les variables :
Dim toto As Integer
Sub MaProcedure() ... End Sub Sub MonAutreProcedure() ... End Sub
Respectez les règles d'hygiène !
N'employez pas des variables de longue portée à tort et à travers. Cela gaspille des ressources ! Le principe qui doit vous guider est celui de l'économie de moyens : on ne doit déclarer les variables au niveau Form ou au niveau projet que lorsque c'est nécessaire, et pour tout dire indispensable. En ce qui concerne les tableaux, rien de bien sorcier. Il suffira
d'ajouter dans la déclaration, au nom de la variable, les
traditionnelles parenthèses.
Dim MonTableau(15) As Integer
Attention,
danger !
Pour les indices des tableaux, la numérotation commence à zéro. ça, on a l'habitude. Mais ce qui peut surprendre davantage, c'est que le nombre figurant entre les parenthèses indique la valeur maximale de l'indice, qui ne correspond donc pas au nombre de cases du tableau, mais à ce nombre moins un. Ainsi, dans l'exemple ci-dessus, j'ai déclaré un tableau de 16 cases (numérotées donc de 0 à 15). Suffit de le savoir. Pour ce qui est des tableaux dynamiques, pas de souci particulier.
VB.Net gère très bien des déclarations du genre :
Dim MonTableau() As Integer
...qui sera suivie à un moment ou à un autre dans l'application
par un :
Redim MonTableau(N)
Là aussi, toutefois, attention ! L'instruction Redim, employée sans
plus de précision, écrabouille sauvagement toute valeur qui se trouvait
précédemment dans le tableau, chose qui peut s'avérer fort gênante. Si
l'on veut pratiquer un redimensionnement sans perdre les données déjà
présentes dans le tableau, il suffit de ne pas oublier l'instruction Preserve :
Redim Preserve MonTableau(N)
Et voilà le travail.
1.3 Déclaration, affectation et écritures étranges VB.Net est un langage qui permet un certain nombre d'instructions
très synthétiques, qui condensent en réalité
en une seule ligne plusieurs instructions
distinctes. L'avantage, c'est que cela permet
d'écrire très vite. L'inconvénient, c'est qu'un esprit non averti peut
s'y mélanger d'autant plus facilement les crayons.
Avertissons donc.
Traditionnellement, nous avons l'habitude de dissocier la
déclaration d'une variable de son affectation (je parle ici des
langages civilisés, et pas des trucs de pervers comme le C). Donc,
spontanément, nous dirons :
Dim Toto As Integer
... Toto = 12 Eh bien, VB.Net nous permet d'effectuer ces deux opérations d'un
seul coup d'un seul, en écrivant :
Dim Toto As Integer = 12
Ce qui revient à procéder, dans la même instruction, à la
déclaration et à l'affectation de la variable.
Encore plus fort : ce que nous avons vu au chapitre précédent, à
propos de la propriété Size (mais qui est vrai de toute propriété
correspondant non à un type simple, mais à une structure).
Normalement, pour créer une nouvelle variable structurée Taille et
l'affecter à la propriété Size du contrôle Bouton, nous serions censé
écrire :
Dim Taille As New Size
Taille.Width = 200 Taille.Height = 100 Bouton.Size = Taille Car Width et
Height sont les deux champs de la structure Size. Cela
dit, nous savons donc que nous pouvons affecter la variable Taille au
moment même où nous la déclarons, ce qui donnerait une écriture plus
ramassée :
Dim Taille As New Size(200, 100)
Bouton.Size = Taille Mais là où c'est encore plus fort, c'est que nous pouvons encore
raccourcir l'écriture, en affectant la propriété dans le même élan que
nous déclarons et affectons la variable Taille (qui du coup, n'a plus
besoin d'exister en tant que variable nommée). C'est ce qui donne
l'écriture étrange vue au chapitre précédent :
Bouton.Size = New Size(200, 100)
Et voilà le travail. Cela dit, reculer devant ces écritures pour
s'en tenir au découpage traditionnel ne doit certainement pas être
considéré comme une faute, ni même comme une maladresse.
2. Les opérateurs
Côté opérateurs numériques, on a évidemment les tartes
à la crème :
Mais en plus de la "bande des quatre", on dispose de
quelques opérateurs à peine plus exotiques, dont entre autres :
Les opérateurs booléens, pour leur part, ne brillent
pas non plus par leur originalité (on ne s'en plaindra pas) :
Enfin, l'unique opérateur caractère est le traditionnel
:
Remarque
hygiénique :
Pour des raisons évidentes de clarté du code, je déconseille très vivement l'emploi de l'opérateur d'addition + comme opérateur de concaténation, bien que celui-ci puisse jouer ce rôle (il suffit pour cela qu'il opère deux chaînes de caractères). Là, c'est du cake. La forme universelle du test est la suivante :
If expression_booléenne Then
instructions_si_vrai [Else instructions_si_faux] Endif Évidemment, la partie entre crochets peut être éventuellement
omise. Et l'on rencontrera également la forme plus développée (mais
tout aussi classique) :
If expression_booléenne Then
instructions_si_vrai Elseif expression_booléenne Then instructions_si_vrai Elseif expression_booléenne Then instructions_si_vrai Elseif expression_booléenne Then instructions_si_vrai etc. Endif Et voilà : des tests, il n'y a pour ainsi dire rien de plus à dire. 4. Les boucles Les grands classiques, il n'y a rien de tel. Aussi, après Smoke on
the Water, Stairway to Heaven et Sultans of Swing, la maison vous
propose la boucle conditionnelle :
While expression_booléenne
instructions End While Qui correspond au fameux Tantque... FinTantQue qui a bercé
de sa douce mélopée vos longues soirées
algorithmiques. Quant à la boucle à compteur, nous aurons sans surprise
:
For variable = valeur_initiale to valeur_finale [step pas]
instructions Next variable Nous aurons l'occasion de découvrir plus tard d'autres
instructions de boucles, particulières à VB.Net. Mais pour un bref
moment, ces deux-là suffiront à notre bonheur.
5. Les fonctions prédéfinies
Relevez vos sièges, attachez vos ceintures,
et saisissez à pleines mains votre sac en plastique. Nous entrons dans une zone de
fortes turbulences.
En abordant les fonctions, nous en venons en effet à une considération qui
risque de vous dérouter
au premier abord. Mais plutôt que faire l'impasse sur ce qui
va suivre, meux vaut saisir à pleines mains cette occasion de se familiariser peu
à peu avec les concepts propres à la programmation objet.
Alors, c'est parti pour le grand frisson.
Une particularité
de cette programmation objet, c'est que tout finit par devenir
un objet, même quand au départ, ce n'était pas particulièrement
le cas. Ainsi, mais ce n'est qu'un exemple parmi bien
d'autres, les simples variables
ordinaires sont-elles considérées par VB
comme des instances des classes
(assimilées aux types) qui ont servi à les fabriquer.
Autrement dit, les simples variables sont elles aussi traitées
comme des objets. Une variable de
type String est donc, pour VB, également une instance de la classe
String. Une variable Integer est également une
instance de la classe Integer. Etc.
Or,
String, Integer, et toutes les autres classes formées à
partir des types simples, sont dotées, comme toutes les
autres classes, d'un certain
nombre de méthodes. Et celles-ci ont été conçues
de manière à recouvrir à peu près les (anciennes) fonctions traditionnelles
pour ces variables. De sorte que la plupart des fonctions
qui permettaient de manipuler les variables ordinaires
existent dorénavant également sous forme de méthodes qui s'appliquent
à ces variables (considérées cette fois comme des instances des
différentes classes-types).
Ce "doublon" permet au programmeur peu familier de la
programmation objet de ne pas être trop dépaysé, et de
continuer à utiliser les bonnes vieilles fonctions dont il avait
l'habitude. Mais à côté de l'approche traditionnelle, existe donc
maintenant une approche "tout objet", qui, sans nul doute,
représente l'avenir de cette famille de langages.
Illustrons tout ceci par quelques exemples, car je sens bien que
dans le fond, là, près du radiateur, il y en a qui ont décroché et
qui roupillent dur.
5.1 Fonctions de chaînes
5.1.1 Les couples Fonctions / Méthodes
Resultat = Mid("Super, ça boume !", 11, 4)
ou
Resultat = "Super, ça boume !".Substring(10, 4)
Naturellement, l'exemple ci-dessus marche aussi bien avec des
variables qu'avec des chaînes libellées en clair. Cependan, vous n'aurez pas manqué de remarquer le proverbial sens
de l'humour des gagmen de Redmond, puisque dans un Mid, les caractères sont
comptés à partir de 1, tandis que dans un Substring ils le sont à partir de zéro.
Sacré Bilou, va !
For i = 1 to Len(Phrase)
...ou opter pour une écriture plus « objet » et employer une méthode :
For i = 1 to Phrase.Length
Ayé, vous avez pigé le truc ? Ben ensuite, c'est toujours sur le même principe.
5.1.2 Fonctions sans méthodes équivalentes
Certaines fonctions, toutefois, pour des
raisons parfaitement obscures appartement à M. Petitmou et à lui seul, n'ont pas été dotées
d'équivalent sous forme de méthode. Il s'agit par exemple de
:
5.1.2 Méthodes sans fonctions équivalentes
Inversement, et de manière tout aussi incompréhensible
pour les esprits rationnels, quelques méthodes accomplissent
des tâches qui ne sont assumées par aucune fonction, telles :
5.1.4 Comparer des chaînes de caractère
Il nous reste un dernier problème à traiter
avec les chaînes : celui de leur comparaison. En effet, une
pelote d'épines
classique est de savoir si "bonjour" doit être
considéré comme
la même chaîne que "BonJour" ou que "BONjoUR". VB nous permet donc de définir une option de comparaison,
afin de trancher nous-mêmes dans le lard, et de décider ce qui
nous arrange. Nous pouvons donc, une bonne fois pour toutes, régler
cette valeur dans les propriétés du projet, par la rubrique Option
Compare :
Une autre possibilité consistera à ne pas décider
du type de comparaison à utiliser une fois pour toutes, au niveau du projet,
mais le faire au coup par coup, à chaque fois qu'on devra comparer des chaînes. Pour cela, on
utilisera au choix la fonction StrComp ou la méthode
String.Compare. Dans un cas comme dans l'autre, on passera les
deux chaînes à comparer en paramètres, et on
fixera le troisième argument à False (si l'on souhaite une comparaison « binary ») ou à
True (si l'on souhaite une comparaison « text »).
StrComp et String.Compare renvoient
toutes les deux -1 si la première chaîne est placée avant la seconde dans l'ordre alphabétique, 0 si les deux
chaînes sont égales, et 1 si c'est la seconde chaîne qui précède alphabétiquement la première.
5.2 Fonctions et méthodes numériques
Là, cela va aller nettement plus vite (personne ne
s'en plaindra, et surtout pas moi). Tout d'abord, parce que le
nombre de fonctions disponibles et souvent utilisées et nettement
moins grand. Mentionnons vite fait bien fait :
|