Modélisation de la Lune, catalogues d'étoiles
Rigel – étape 6
1 Introduction
Le but de cette sixième étape, la dernière de la première partie du projet, est double : premièrement, modéliser le mouvement de la Lune dans l'espace, et deuxièmement écrire le code permettant de représenter des catalogues d'étoiles et d'astérismes, et charger leur contenu depuis un fichier.
Notez que cette étape devra être rendue deux fois :
- pour le rendu testé habituel (délai : 3 avril, 17h00),
- pour le rendu intermédiaire (délai : mercredi 8 avril, 17h00).
Le deuxième de ces rendus sera corrigé par lecture de votre code pour les étapes 1 à 6, et il vous faudra donc soigner sa qualité et sa documentation. Il est conseillé de lire notre guide à ce sujet.
Attention: notez bien le fait que le rendu intermédiaire aura lieu un jour inhabituel, puisque le 8 avril est un mercredi et pas un vendredi !
2 Concepts
2.1 Position de la Lune
De tous les objets célestes que nous modéliserons dans ce projet, la Lune est de loin celui dont la position est la plus difficile à calculer. En effet, la trajectoire de la Lune est fortement influencée à la fois par la Terre et par le Soleil.
Comme d'habitude le calcul de la position de la Lune se base sur un certain nombre de constantes valables pour l'époque J2010 et résumées dans la table 1 ci-dessous. Les constantes représentant des angles sont données en degrés, comme dans le livre de référence, et doivent donc être converties en radians avant utilisation.
Nom | Valeur | Signification |
---|---|---|
\(l_0\) | 91.929336° | Longitude moyenne |
\(P_0\) | 130.143076° | Longitude moyenne au périgée |
\(N_0\) | 291.682547° | Longitude du nœud ascendant |
\(i\) | 5.145396° | Inclinaison de l'orbite |
\(e\) | 0.0549 | Excentricité de l'orbite |
Le calcul de la position consiste une fois encore à déterminer successivement la valeur d'un certain nombre de variables pour enfin obtenir la position écliptique de la Lune. Ces variables, résumées dans la table 2 ci-dessous, sont assez nombreuses dans le cas de la Lune en raison du grand nombre de termes de correction, dont le but est de tenir compte de l'influence du Soleil sur la trajectoire lunaire.
Nom | Unité | Signification |
---|---|---|
\(D\) | jour | Jours depuis l'époque J2010 |
\(l\) | radian | Longitude orbitale moyenne |
\(l^\prime\) | radian | Longitude orbitale corrigée |
\(l^{\prime\prime}\) | radian | Longitude orbitale vraie |
\(M_m\) | radian | Anomalie moyenne |
\(M_m^\prime\) | radian | Anomalie corrigée |
\(E_v\) | radian | Évection |
\(A_e\) | radian | Correction de l'équation annuelle |
\(A_3\) | radian | Correction 3 |
\(A_4\) | radian | Correction 4 |
\(E_c\) | radian | Correction de l'équation du centre |
\(V\) | radian | Variation |
\(N\) | radian | Longitude moyenne du nœud ascendant |
\(N^\prime\) | radian | Longitude corrigée du nœud ascendant |
\(\lambda_m\) | radian | Longitude écliptique |
\(\beta_m\) | radian | Latitude écliptique |
En plus de ces variables spécifiques à la Lune, deux variables spécifiques au Soleil sont également utilisées dans les calculs ci-dessous : l'anomalie moyenne du Soleil \(M_{☉}\) et la longitude écliptique (géocentrique) du Soleil \(\lambda_{☉}\). Leur valeur est donnée par le modèle du Soleil décrit à l'étape précédente.
Le calcul de la position de la Lune peut être découpé en deux grandes étapes : dans un premier temps, la longitude orbitale de la Lune est déterminée ; ensuite, sa position écliptique est calculée. Ces deux étapes sont décrites dans les deux sections qui suivent.
2.1.1 Calcul de la longitude orbitale
La première partie du calcul consiste à déterminer la longitude orbitale de la Lune, c-à-d sa longitude dans son plan orbital.
Attention : pour rester fidèle au livre de référence, les constantes angulaires apparaissant dans les équations ci-dessous sont exprimées en degrés. Comme d'habitude, il faut les convertir en radians avant de les utiliser.
On commence par déterminer la longitude orbitale moyenne de la Lune :
\[ l = 13.1763966°\times D + l_0 \]
qui nous permet de calculer l'anomalie moyenne de la Lune :
\[ M_m = l - 0.1114041° \times D - P_0 \]
Ensuite, plusieurs termes de correction doivent être déterminés, qui ont pour but de tenir compte de l'influence du Soleil sur la trajectoire de la Lune :
\begin{align*} E_v &= 1.2739°\times \sin\left(2(l - \lambda_{☉}) - M_m\right)\\ A_e &= 0.1858°\times \sin M_{☉}\\ A_3 &= 0.37°\times \sin M_{☉} \end{align*}En les combinant à l'anomalie moyenne, on peut obtenir l'anomalie corrigée :
\[ M_m^\prime = M_m + E_v - A_e - A_3 \]
qui nous permet de calculer deux autres termes de correction :
\begin{align*} E_c &= 6.2886°\times \sin M_m^\prime\\ A_4 &= 0.214°\times \sin 2M_m^\prime \end{align*}pour obtenir la longitude orbitale corrigée :
\[ l^\prime = l + E_v + E_c - A_e + A_4 \]
On en détermine un dernier terme correcteur, la variation :
\[ V = 0.6583°\times\sin 2(l^\prime - \lambda_{☉}) \]
ce qui nous permet enfin d'obtenir la longitude orbitale vraie de la Lune :
\[ l^{\prime\prime} = l^\prime + V \]
2.1.2 Calcul de la position écliptique
Une fois la longitude orbitale de la Lune déterminée, le calcul de sa position écliptique n'est plus très compliqué. Il faut tout d'abord déterminer la longitude moyenne et la longitude corrigée du nœud ascendant :
\begin{align*} N &= N_0 - 0.0529539°\times D\\ N^\prime &= N - 0.16°\times\sin M_{☉} \end{align*}pour finalement pouvoir calculer la longitude et la latitude écliptique de la Lune :
\begin{align*} \lambda_m &= \arctan\left[\frac{\sin(l^{\prime\prime} - N^\prime)\cos i}{\cos(l^{\prime\prime} - N^\prime)}\right] + N^\prime\\[0.5em] \beta_m &= \arcsin\left[\sin(l^{\prime\prime} - N^\prime)\sin i\right] \end{align*}Référence : Practical Astronomy with your Calculator or Spreadsheet, §65
2.2 Phase de la Lune
La phase de la Lune se détermine facilement au moyen de sa longitude orbitale vraie et de la longitude écliptique du Soleil :
\[ F = \frac{1 - \cos(l^{\prime\prime} - \lambda_{☉})}{2} \]
Pour mémoire, la valeur obtenue est comprise dans l'intervalle [0, 1] et donne la portion du disque lunaire qui est vue comme illuminée depuis la Terre : 0 correspond à la nouvelle Lune, 1 à la pleine Lune.
Référence : Practical Astronomy with your Calculator or Spreadsheet, §67
2.3 Taille angulaire de la Lune
Pour déterminer la taille angulaire de la Lune, on commence par calculer la distance entre la Terre et la Lune. L'unité utilisée ici est particulière, puisqu'il s'agit de la longueur du demi-grand axe de l'orbite :
\[ \rho = \frac{1-e^2}{1 + e\,\cos(M_m^\prime + E_c)} \]
La taille angulaire s'obtient ensuite par simple division :
\[ \theta = \frac{\theta_0}{\rho} \]
où \(\theta_0 = 0.5181°\) est la taille angulaire de la Lune vue depuis la Terre à une distance égale au demi-grand axe de l'orbite. (Cette distance vaut environ 384401 km, mais cela n'a aucune influence sur les calculs ci-dessus.)
Référence : Practical Astronomy with your Calculator or Spreadsheet, §69
2.4 Catalogue d'étoiles
Comme nous l'avons vu à l'étape précédente, de nombreux catalogues d'étoiles ont été établis au cours de l'histoire, et les plus importants d'entre eux sont désormais librement disponibles sous forme numérique.
Pour ce projet, nous utiliserons une version simplifiée du catalogue HYG, qui résulte de la compilation de trois catalogues célèbres : le catalogue Hipparcos, le catalogue de Yale et de catalogue de Gliese.
Ce catalogue peut être téléchargé sur la page Web de l'auteur de la compilation, mais nous vous fournissons plus bas la version à utiliser pour ce projet. Il s'agit d'une version simplifiée et allégée, ne contenant que les étoiles de magnitude inférieure ou égale à 6, qui sont celles visibles à l'œil nu dans les meilleures conditions d'observation.
Le catalogue HYG est fourni sous la forme d'un fichier dit CSV — pour comma-separated values, c-à-d « valeurs séparées par une virgule ». Ce format de fichier est très souvent utilisé en informatique, mais n'est pas défini très précisément.
En général, un fichier CSV est un fichier textuel décrivant le contenu d'un (et un seul) tableau rectangulaire, composé d'un certain nombre de lignes et de colonnes. Chaque ligne du fichier contient les données d'une ligne du tableau, à l'exception de la première, qui est généralement une ligne d'en-tête donnant les noms des colonnes. Dans tous les cas, les différentes colonnes sont séparées les unes des autres au moyen d'une virgule.
Par exemple, un fichier CSV contenant les trois lignes suivantes :
hip,proper,ra,dec,mag 24436,Rigel,5.242298,-8.201640,0.180 27989,Betelgeuse,5.919529,7.407063,0.450
représente la table d'étoiles ci-dessous :
hip | proper | ra | dec | mag |
---|---|---|---|---|
24436 | Rigel | 5.242298 | -8.201640 | 0.180 |
27989 | Betelgeuse | 5.919529 | 7.407063 | 0.450 |
où hip est le numéro Hipparcos, proper le nom propre (en anglais), ra l'ascension droite (en heures), dec la déclinaison (en degrés) et mag la magnitude de chacune des étoiles.
Le catalogue HYG n'est rien d'autre qu'une plus grande version de cette table, constituée à la fois de plus de colonnes — 37 en tout — et de plus de lignes — près de 120000 dans la version complète. La signification des 37 colonnes est données dans la documentation du catalogue, mais pour ce projet nous n'utiliserons que celles données dans la table ci-dessous :
No | Nom | Signification |
---|---|---|
2 | hip | Numéro Hipparcos |
7 | proper | Nom propre |
14 | mag | Magnitude |
17 | ci | Indice de couleur B-V |
24 | rarad | Ascension droite en radians |
25 | decrad | Déclinaison en radians |
28 | bayer | Désignation de Bayer |
30 | con | Nom abrégé de la constellation |
Le numéro donné est le numéro de la colonne, qui va de 1 (!) à 37. Ainsi, le numéro Hipparcos se trouve dans la seconde colonne.
La désignation de Bayer est constituées des 2 ou 3 lettres initiales du nom latin de la lettre grecque correspondante — p.ex. Bet pour β —, éventuellement suivies d'un tiret et d'un chiffre. Le nom abrégé de la constellation est quant à lui formé de trois initiales du nom latin de la constellation — p.ex. Ori pour Orion.
Notez bien que le catalogue HYG inclut l'ascension droite et la déclinaison dans différentes unités : en heures/degrés et en radians. Les valeurs en radians, contenues dans les colonnes 24 (rarad) et 25 (decrad) sont celles qui conviennent le mieux aux conventions utilisées dans le projet, et donc celles que nous utiliserons.
2.5 Catalogue d'astérismes
Les astérismes ne sont généralement pas décrits par les catalogues d'étoiles, d'une part car aucune liste officielle de ces astérismes n'existe, et d'autre part car différentes cultures reconnaissent des astérismes différents.
Il est toutefois possible de trouver des catalogues des astérismes occidentaux, et pour ce projet nous utiliserons une version simplifiée d'un catalogue établi par Dominic Ford à partir du livre The Stars: A New Way To See Them de H. A. Rey. Ce catalogue peut être téléchargé sur la page Web du projet, mais nous vous en fournissons plus bas une version simplifiée et adaptée à nos besoins.
La version simplifiée que nous utiliserons est un fichier textuel très simple, mais qui n'est pas au format CSV. Chaque ligne du fichier, la première comprise, est constituée d'une liste de numéros Hipparcos d'étoiles appartenant à un même astérisme, séparés par une virgule.
Par exemple, la ligne 95 de ce fichier est la suivante :
24436,27366,26727,27989,28614,29426,28716
Elle décrit un astérisme auquel appartiennent à la fois Rigel (en première position) et Bételgeuse (en quatrième position).
3 Mise en œuvre Java
Parmi les classes à réaliser plus bas figurent celles permettant de charger les catalogues d'étoiles et d'astérismes que nous utiliserons pour ce projet. Les fichiers les contenant vous sont fournis sous la forme d'une archive Zip à importer dans votre projet en suivant nos instructions pour IntelliJ ou pour Eclipse.
Dans tous les cas, prenez soin d'importer correctement l'archive, cela est capital ! Le répertoire resources
qu'elle contient doit être un répertoire « frère » du répertoire src
, c-à-d situé au même niveau que lui dans la hiérarchie. De plus, dans IntelliJ vous devez impérativement marquer le répertoire comme Resources Root (voir point 7 de notre guide), et dans Eclipse vous devez impérativement l'ajouter au Build Path (voir points 5 à 7 de notre guide).
Attention : si vous importez de manière incorrecte ce répertoire resources
dans votre projet, il est probable que ce dernier ne fonctionne pas correctement lors des tests manuels qui seront effectués à la fin du semestre. Cela pourrait vous faire perdre un très grand nombre de points, donc prenez garde à ce qui précède et, en cas de doute, demandez de l'aide.
3.1 Type énuméré MoonModel
Le type énuméré MoonModel
du paquetage ….astronomy
, public et immuable, contient un seul élément nommé MOON
et représentant un modèle de la Lune. Ce type énuméré implémente l'interface CelestialObjectModel<Moon>
.
La seule méthode publique de MoonModel
est la méthode at
de l'interface CelestialObjectModel
, qui retourne la Lune à un instant donné. Notez qu'aucune technique n'a été donnée plus haut pour déterminer la magnitude de la Lune, et le modèle utilise toujours 0. Cette valeur, bien entendu incorrecte, n'est pas utilisée dans la suite du projet, et importe donc peu.
3.2 Classe StarCatalogue
La classe StarCatalogue
du paquetage ….astronomy
, publique, finale et immuable, représente un catalogue d'étoiles et d'astérismes. Elle offre un unique constructeur public :
StarCatalogue(List<Star> stars, List<Asterism> asterisms)
, qui construit un catalogue constitué des étoilesstars
et des astérismesasterisms
, ou lèveIllegalArgumentException
si l'un des astérismes contient une étoile qui ne fait pas partie de la liste d'étoiles.
En plus de ce constructeur, la classe StarCatalogue
offre les méthodes publiques suivantes :
List<Star> stars()
, qui retourne la liste des étoiles du catalogue,Set<Asterism> asterisms()
, qui retourne l'ensemble des astérismes du catalogue,List<Integer> asterismIndices(Asterism asterism)
, qui retourne la liste des index — dans le catalogue — des étoiles constituant l'astérisme donné, ou lèveIllegalArgumentException
si l'astérisme donné ne fait pas partie du catalogue.
Attention : asterismIndices
ne doit pas retourner le numéro Hipparcos des étoiles de l'astérisme, mais bien leur index dans la liste d'étoiles du catalogue, telle qu'elle est retournée par la méthode stars
. Par exemple, si Rigel apparaît à l'index 1019 dans cette liste, alors l'astérisme décrit par la ligne 95 du catalogue d'astérisme (voir §2.5) doit avoir 1019 comme premier élément — et pas 24436.
3.2.1 Conseils de programmation
Le moyen le plus simple et le plus efficace de mettre en œuvre StarCatalogue
consiste à lui ajouter un attribut (privé) contenant une table associative dont les clefs sont les astérismes et les valeurs sont les listes d'index correspondantes. De la sorte, asterisms
peut simplement retourner une vue sur les clefs de cette table, et asterismIndices
peut simplement utiliser la méthode get
de cette table pour en extraire la liste des index de l'astérisme donné.
3.3 Classe StarCatalogue.Builder
La classe Builder
, imbriquée statiquement dans la class StarCatalogue
, publique et finale, représente un bâtisseur de catalogue d'étoiles.
Cette classe possède un constructeur par défaut qui initialise le bâtisseur de manière à ce que le catalogue en construction soit initialement vide. Elle offre de plus les méthodes publiques suivantes :
Builder addStar(Star star)
, qui ajoute l'étoile donnée au catalogue en cours de construction, et retourne le bâtisseur,List<Star> stars()
, qui retourne une vue non modifiable — mais pas immuable — sur les étoiles du catalogue en cours de construction,Builder addAsterism(Asterism asterism)
, qui ajoute l'astérisme donné au catalogue en cours de construction, et retourne le bâtisseur,List<Asterism> asterisms()
, qui retourne une vue non modifiable — mais pas immuable — sur les astérismes du catalogue en cours de construction,Builder loadFrom(InputStream inputStream, Loader loader) throws IOException
, qui demande au chargeurloader
(voir §3.4) d'ajouter au catalogue les étoiles et/ou astérismes qu'il obtient depuis le flot d'entréeinputStream
, et retourne le bâtisseur, ou lèveIOException
en cas d'erreur d'entrée/sortie,StarCatalogue build()
, qui retourne le catalogue contenant les étoiles et astérismes ajoutés jusqu'alors au bâtisseur.
Un exemple d'utilisation de la méthode loadFrom
est donné plus bas, à la §3.7, mais il est conseillé de lire encore les deux sections qui suivent avant de le consulter.
3.4 Interface Loader
L'interface Loader
, imbriquée dans la classe StarCatalogue
, publique, représente un chargeur de catalogue d'étoiles et d'astérismes.
La seule méthode publique (et abstraite) de cette interface est :
void load(InputStream inputStream, Builder builder) throws IOException
, qui charge les étoiles et/ou astérismes du flot d'entréeinputStream
et les ajoute au catalogue en cours de construction du bâtisseurbuilder
, ou lèveIOException
en cas d'erreur d'entrée/sortie.
3.5 Type énuméré HygDatabaseLoader
Le type énuméré HygDatabaseLoader
du paquetage ….astronomy
, public et immuable, contient un seul élément nommé INSTANCE
et représentant un chargeur de catalogue HYG. Il implémente l'interface StarCatalogue.Loader
.
La seule méthode publique de ce type énuméré est la méthode load
provenant de l'interface Loader
décrite ci-dessus. Cette méthode ajoute au bâtisseur de catalogue toutes les étoiles obtenues du catalogue HYG en utilisant le contenu des colonnes de la manière suivante, où la valeur par défaut mentionnée est celle à utiliser si la colonne est vide :
- le numéro Hipparcos de l'étoile est obtenu de la colonne hip (0 par défaut),
- le nom de l'étoile est obtenu de la colonne proper si elle n'est pas vide, et sinon par concaténation de la colonne bayer (
?
par défaut [point d'interrogation]), d'une espace et de la colonne con, qui n'est jamais vide, - les coordonnées équatoriales de l'étoile sont obtenues des colonnes rarad et decrad, qui ne sont jamais vides,
- la magnitude de l'étoile est obtenue de la colonne mag (0 par défaut),
- l'indice de couleur B-V est obtenu de la colonne ci (0 par défaut).
3.5.1 Conseils de programmation
Pour lire les lignes du catalogue HYG, dont le contenu est encodé en ASCII, il suffit d'empiler deux lecteurs au-dessus du flot d'entrée fourni à la méthode load
:
- un
InputStreamReader
utilisant le jeu de caractèresUS_ASCII
, pour correctement transformer les octets du flot en caractères, - un
BufferedReader
, pour (en quelque sorte) transformer le flot de caractères en flot de lignes, que l'on peut lire au moyen de la méthodereadLine
.
Pour découper les lignes en leur 37 colonnes, le plus simple est d'utiliser la méthode split
de String
, en lui passant la virgule (,
) comme chaîne de séparation1.
Pour connaître l'index des colonnes dont le contenu doit être extrait, vous pouvez soit définir des constantes en vous référant à la table 3, soit définir un type énuméré privé, imbriqué dans la classe du chargeur, et possédant un membre pour chaque colonne. Cela fait, vous pouvez utiliser la méthode ordinal
de ces membres pour connaître le numéro de la colonne les contenant. Si vous désirez utiliser cette solution, voici les noms de tous les membres des colonnes du catalogue HYG, dans l'ordre :
ID, HIP, HD, HR, GL, BF, PROPER, RA, DEC, DIST, PMRA, PMDEC, RV, MAG, ABSMAG, SPECT, CI, X, Y, Z, VX, VY, VZ, RARAD, DECRAD, PMRARAD, PMDECRAD, BAYER, FLAM, CON, COMP, COMP_PRIMARY, BASE, LUM, VAR, VAR_MIN, VAR_MAX;
Pour transformer les chaînes contenant des nombres en ces nombres, utilisez les méthodes statiques Double.parseDouble
ou Integer.parseInt
. Notez que ces méthodes lèvent une exception si la chaîne qu'on leur passe est invalide, mais vous pouvez faire l'hypothèse que ce ne sera pas le cas.
3.6 Type énuméré AsterismLoader
Le type énuméré AsterismLoader
du paquetage ….astronomy
, public et immuable, contient un seul élément nommé INSTANCE
et représentant un chargeur de catalogue d'astérismes. Il implémente l'interface StarCatalogue.Loader
et sa seule méthode publique est la méthode load
provenant de cette interface.
3.6.1 Conseils de programmation
La plupart des conseils de programmation donnés à la section précédente s'appliquent également ici. En particulier, sachez que le contenu du fichier contenant le catalogue d'astérismes est aussi encodé en ASCII.
3.7 Tests
Comme d'habitude, nous ne vous fournissons plus de tests mais un fichier de vérification de signatures contenu dans une archive Zip à importer dans votre projet.
Il convient toutefois de dire quelques mots sur les tests que vous pouvez effectuer pour valider votre calcul de la position de la Lune, et ceux que vous pouvez effectuer pour les chargeurs de catalogues, ce que font les deux sections qui suivent.
3.7.1 Position de la Lune
Le livre de référence contient comme d'habitude un calcul détaillé de la position de la Lune, à la §65, p. 166.
Attention toutefois : cet exemple contient des erreurs dues au fait que certaines valeurs ont été obtenues au moyen de modèles plus précis que ceux référencés. Au moyen du corrigé, la position écliptique de la Lune que nous obtenons pour cet exemple est :
\begin{align*} \lambda_m &= 214.862515°\\ \beta_m &= 1.716257° \end{align*}où les valeurs ont été arrondies à 6 décimales, comme dans le livre.
3.7.2 Accès aux catalogues
Pour tester les classes de chargement de catalogues (HygDatabaseLoader
et AsterismLoader
), il vous faut savoir comment obtenir un flot d'entrée donnant accès aux catalogues.
Si vous les avez correctement importé dans votre projet, et pensé à ajouter le répertoire resources
à votre projet (Mark Directory as > Resources Root dans IntelliJ, Build Path > Use as Source Folder dans Eclipse), la méthode getResourceAsStream
de la classe Class
devrait faire l'affaire.
L'embryon de classe de test ci-dessous vous montre comment procéder. Notez que le nom utilisé pour accéder au fichier contenant le catalogue HYG est /hygdata_v3.csv
, et la barre oblique (/
) initiale est indispensable ! De même, le fichier contenant le catalogue d'astérismes s'obtient en passant la chaîne /asterisms.txt
à la méthode getResourceAsStream
.
class HygDatabaseLoaderTest { private static final String HYG_CATALOGUE_NAME = "/hygdata_v3.csv"; @Test void hygDatabaseIsCorrectlyInstalled() throws IOException { try (InputStream hygStream = getClass() .getResourceAsStream(HYG_CATALOGUE_NAME)) { assertNotNull(hygStream); } } @Test void hygDatabaseContainsRigel() throws IOException { try (InputStream hygStream = getClass() .getResourceAsStream(HYG_CATALOGUE_NAME)) { StarCatalogue catalogue = new StarCatalogue.Builder() .loadFrom(hygStream, HygDatabaseLoader.INSTANCE) .build(); Star rigel = null; for (Star s : catalogue.stars()) { if (s.name().equalsIgnoreCase("rigel")) rigel = s; } assertNotNull(rigel); } } }
Le premier test vérifie que getResourceAsStream
retourne une valeur non nulle, ce qui devrait être le cas si vous avez correctement importé les catalogues dans votre projet. Si ce test échoue, relisez la procédure décrite au début de la §3 et vérifiez que vous avez bien effectué toutes les étapes.
Le second test charge le catalogue HYG et vérifie qu'il contient bien (au moins) une étoile nommée Rigel.
4 Résumé
Pour cette étape, vous devez :
- écrire les classes, interfaces et types énumérés
MoonModel
,StarCatalogue
,StarCatalogue.Builder
,StarCatalogue.Loader
,HygDatabaseLoader
etAsterismLoader
selon les instructions données plus haut, - tester votre code,
- documenter la totalité des entités publiques que vous avez définies,
- rendre votre code au plus tard le 3 avril 2020 à 17h00, via le système de rendu.
Ce rendu est un rendu testé, auquel 18 points sont attribués, au prorata des tests unitaires passés avec succès. Notez que la documentation de votre code ne sera pas évaluée avant le rendu intermédiaire. Dès lors, si vous êtes en retard, ne vous en préoccupez pas pour l'instant.
N'attendez surtout pas le dernier moment pour effectuer votre rendu, car vous n'êtes pas à l'abri d'imprévus. Souvenez-vous qu'aucun retard, aussi insignifiant soit-il, ne sera toléré !
Notes de bas de page
Il faut noter deux choses au sujet de l'utilisation de la méthode split
pour découper les colonnes du fichiers CSV.
Premièrement, cette technique simple ne fonctionne pas avec tous les fichiers CSV, car le format CSV autorise la présence de virgules à l'intérieur d'une colonne, pour peu que son contenu soit entouré de guillemets. Toutefois, le fichier CSV que nous lisons ici ne possède pas de colonnes de ce type, et nous pouvons donc ignorer cela.
Deuxièmement, la chaîne qui est passée à split
est interprétée comme une expression régulière (regular expression, souvent abrégé regexp), et pas comme une simple chaîne. Dans notre cas, cela ne change rien car la virgule que nous utilisons comme séparateur n'est pas un caractère particulier dans une telle expression. Nous pouvons donc faire l'hypothèse que la chaîne passée à split
est une chaîne normale.
Il est toutefois bon de garder à l'esprit le fait que split
interprète la chaîne comme une expression régulière, car cela peut réserver des surprises. Ainsi, dans l'extrait de programme suivant :
String[] parts = "a.b.c".split(".");
le tableau parts
contient … 0 éléments, et pas les chaînes a
, b
et c
comme on pourrait le croire. Cela est dû au fait que le point (.
) est interprété de manière particulière dans une expression régulière.
Le concept d'expression régulière ne sera pas examiné dans ce cours, mais vous sera présenté plus tard dans votre cursus.