• Aucun résultat trouvé

4.1.1 Pourquoi le choix du Langage de programmation JAVA ?

Le langage de programmation choisi pour développer le code de simulation du pro- cédé est le JAVA, qui est un langage dit « orienté objet ». Il a été développé par SUN microsystems en 1995. Ce type de programmation apparait comme étant très adapté à notre application, avec son système organisé de classes. Le langage JAVA est portable ce qui évitera par la suite des problèmes de compatibilité entre différents systèmes d’exploitation en vue d’une diffusion et il permet de développer aisément le code et l’interface. De plus, JAVA est un langage de programmation non compilé directement interprété par une machine virtuelle ou compilé à la volée. Il est à signaler que par rap- port à d’autres langages compilés comme le C ou le C++, cela peut entrainer une légère perte de performance mais garantit la portabilité précédemment évoquée, nécessaire à la mise en œuvre d’un outil interfacé, interactif et distribuable à terme.

4.1.2 La programmation objet : concepts et termes

La particularité de la programmation orientée objet est de pouvoir créer des briques logicielles, regroupant des variables (comme desint, desdouble ou desstring) et des méthodes, et de les faire interagir entre-elles. C’est ce que l’on appelle des objets. Cette approche permet de regrouper des caractéristiques spécifiques telles des fonctionnalités ou des actions communes associées à ces informations dans un seul bloc.

Par exemple, dans ce code nous utilisons des objets de type «Site» que nous avons créés de toutes pièces : un site contient des informations qui lui sont propres telles que sa position dans la boite, ses voisins, le nombre d’atomes qu’il contient etc. . . Nous décrirons plus en détail les différentes classes plus loin dans ce manuscrit. Pour la suite,

4.1. Introduction à la programmation en JAVA nous respectons les conventions d’écriture qui veulent que les objets soient écrits avec des minuscules et les classes avec une majuscule.

4.1.2.1 Les classes et les objets

Les classes contiennent la définition des objets qui seront créés lors de l’exécution du code. Il s’agit d’entités regroupant des variables et des fonctions qui leur sont propres. Concrètement, une classe n’est pas une brique logicielle créée à l’exécution du code. C’est un plan à partir duquel des objets vont être créés. La Figure 4.2 illustre ce propos.

Figure 4.2 – Vue d’esprit de la programmation orientée objet : les trois objets maison sont créés à partir d’un même plan (classe).

Pour vulgariser les classes et objets, nous pouvons décrire cette image de la façon suivante : une classe «Maison» à partir de laquelle nous voulons construire des maisons dans une résidence existe. À partir du modèle de cette classe « Maison », nous avons créé trois objets «maison » identiques, tous indépendants les uns des autres : maison

(couleurDuToit, cheminée, couleurDeLaPorte). Ces objets sont tous une instance de la classeMaisonavec des attributs qui leur sont propres. Trois personnes différentes vont acheter chacune leur maison. Les maisons vont donc évoluer individuellement dans un environnement différent au cours du temps. Dans cet exemple, Pierre choisit de retirer sa cheminée en changeant le booléen «cheminée = false», Paul a repeint le toit avec l’attribut « couleurDuToit = rouge », et Jacques choisit de repeindre sa porte avec l’attribut «couleurDeLaPorte = bleu ».

4.1.2.2 Les attributs et méthodes

Les attributs sont les données que contient un objet et les méthodes sont les opé- rations que cet objet est capable de réaliser. Ces attributs et méthodes disposent de différents niveaux de visibilité qui permettent de définir les possibilités d’y accéder pour les différents objets du programme. On reconnait trois niveaux de visibilité :

• public : l’attribut ou la méthode est accessible depuis n’importe quelle partie du code. Pour reprendre l’exemple précédent, si public couleurDuToit = orange

Paul et Jacques pourraient repeindre le toit de Pierre.

• private : l’attribut ou la méthode ne peut être modifiée qu’au sein même de l’objet. On dit alors que les données sont encapsulées dans un objet. Pour re- prendre l’exemple précédent, si private couleurDuToit = orange personne ne pourrait repeindre le toit de Pierre, à part Pierre.

• protected : l’attribut ou la méthode n’est accessible que depuis le code de la classe courante ou d’une classe fille.

Les attributs et les méthodes que nous venons de présenter sont dits d’instance. A contrario, il existe des attributs et des méthodes dits de classe. Ceux-ci sont identifiés par le mot clé static : la variable ainsi définie ne peut être modifiée localement dans une instance d’objet. Elle est commune à tous les objets et est identique dans toutes les instances de la classe. Pour reprendre l’exemple précédent, si static couleurDuToit = orange tous les toits sont oranges. Si cette variable venait à être modifiée, les toits de tous les objets maison changeraient aussi.

4.1.2.3 Les constructeurs

Il s’agit de méthodes spéciales, spécifiques à une classe. Ils sont appelés lors de la création d’un objet (on parle alors d’instance d’une classe). Ils sont couramment utilisés pour l’initialisation des attributs (valeurs par défaut), ou pour effectuer des opérations de configuration sur l’objet créé.

4.1.2.4 L’héritage

L’héritage permet à la définition d’une classe B de contenir tous les attributs et méthodes d’une classe A, tout en y ajoutant de nouvelles fonctionnalités. La classe A est alors considérée comme la classe mère et la classe B comme la classe fille. La classe B hérite alors de la classe A.

Pour en revenir à notre exemple précédent, considérons la classeMaisoncomme étant la classe A et la classe Maison_de_campagnecomme la classe B.Maison_de_campagne

4.1. Introduction à la programmation en JAVA d’autres informations telles quetailleDuJardin,garage,basseCour, etc. qui n’existent pas dans la classeMaison.

4.1.2.5 Les énumérations

Il s’agit d’une structure définissant une liste de valeurs possibles, qui permet de créer une liste contenant des types de données personnalisés. Pour en revenir une dernière fois sur l’exemple des maisons, nous pourrions faire unenumlistant les matériaux nécessaires pour construire une maison, qui contiendrait des objets de type « matériaux » (ciment, brique, PVC, vitre, tuyaux, carrelage, etc.).

4.1.2.6 L’opérateur point

Tout au début de notre exemple sur les maisons, nous avons dit que les différents propriétaires des maisons avaient modifié certains de leurs attributs dans leur maison. Ils ont appliqué des modifications sur leur maison et pas sur celle de leurs voisins. En programmation orientée objet, on utilise le signe point ( . ) pour indiquer que l’on fait référence à un élément (attribut ou méthode) d’un objet. Pour reprendre l’exemple cité plus haut, pour modifier la couleur de la porte de la maison de Jacques nous devrons spécifier le « chemin » pour atteindre cette variable depuis un autre objet présent dans le code avec maison_de_Jacques.couleurDeLaPorte=bleu. Cet opérateur point peut être associé à l’idée de pointeur, observée dans d’autres langages de programmation.

Pour commencer une analogie avec le code STEAM développé, voici une utilisation de cet opérateur (Figure 4.3).

Figure 4.3 – Exemple d’utilisation de l’opérateur point pour atteindre un attribut (configuration) d’un objet (site), situé à l’est du site actuel (this).

Dans cet exemple, la commande est envoyée depuis le site où se déroule l’événement responsable de ce changement de configuration (this). Grâce à des méthodes permet- tant de se situer (getNeighbor(AxeWE.East)), il est possible de modifier des attributs appartenant à d’autres objets (ici, laconfigurationdu site voisin situé à droite grâce à la méthodesetConfiguration()).

4.1.2.7 Les packages : organiser les classes

En programmation orientée objet, les informations sont stockées dans les objets. Ceux-ci vont dialoguer entre eux afin de faire avancer la simulation. Les classes sont or- ganisées en packages (ou bibliothèques) formant une arborescence. Un package contient un ensemble de classes, qu’ici nous avons choisi de trier par concept. Cette notion de packaging est orthogonale à celle de l’héritage dans le sens où elle ajoute une barrière pour atteindre une information, plutôt que de la retirer. Ainsi, ce « rangement » va impacter sur la visibilité des informations (attributs et méthodes). Nous rappelons ici les niveaux de visibilité des informations stockées dans les classes.

Tableau 4.1 – Visibilité des informations dans les classes en fonction de leur type.

public protected defaut private

Dans la même classe Oui Oui Oui Oui

Dans une classe du même

package Oui Oui Oui Non

Dans une sous-classe d’un autre

package Oui Oui Non Non

Dans une classe quelconque d’un

autre package Oui Non Non Non

En plus de la visibilité des informations, pour « atteindre » une donnée propre à un objet il est nécessaire d’importer le package contenant la classe à laquelle on veut accéder, dans la classe qui fait l’appel. Afin d’avoir un rangement plus propre et d’évi- ter des erreurs d’appel, la plupart des informations ne sont pas public. Pour cela, l’utilisation les accesseurs get et set est de mise : il s’agit de méthodes public facile- ment reconnaissables et intuitives avec une bonne nomenclature. Pour accéder à une information, il suffira d’appeler l’accesseur getNomDeLattribut(). Pour modifier une information, nous appellerons l’accesseur setNomDeLattribut(). Une telle utilisation est visible dans la Figure 4.3.

Nous avons créé trois packages uniques dans notre code : kmc.kernel (pour les classes associées au « noyau » du programme), kmc.event (pour les classes liées aux événements) et kmc.visio (pour les classes liées à l’interface graphique). Parmi les packages les plus connus, et disponibles gratuitement, nous utilisons java.io (pour la gestion des fichiers d’entrée et de sortie), java.util (pour des classes utilitaires, comme « Random »), java.lang (pour des classes de bases, importées par défaut),

java.Awt (pour les classes graphiques et de gestion d’interfaces) et java.swing (pour d’autres classes graphiques).

4.2. Méthodologie Monte Carlo cinétique et le package kmc.kernel : conception et