Aide dans un projet Java

Fermé
Art_1491 Messages postés 5 Date d'inscription lundi 14 décembre 2020 Statut Membre Dernière intervention 15 décembre 2020 - Modifié le 15 déc. 2020 à 00:08
Art_1491 Messages postés 5 Date d'inscription lundi 14 décembre 2020 Statut Membre Dernière intervention 15 décembre 2020 - 15 déc. 2020 à 11:02
Bonsoir à toute la communauté.
Je suis très heureux de me retrouver ici et de partager le peu de connaissances que j'ai en Java,Python et Php.
En parlant de Java, je travaille présentement sur un projet Java et j'aurai besoin d'un petit coup de main. Principalement, il me demande de rémanier (petit soucis, commenter ( facile) et d'améliorer (pas trop clair) le code source d'un programme de carte de navigation. En plus d'ajouter une fonctionnalité permettant de fusionner deux cartes.
Une idée ou une orientation pour m'aider ?
Merci d'avance !

Voici le code sur lequel je travaille :

Ceci est la classe principale :
package fr.icam.bb8;

import java.io.InputStream;
import java.util.Scanner;

public class UnitR {

 long[] systems;
 String[] namings;
 long[][] navmaps;

 void init(){
  systems = new long[359];
  namings = new String[359];
  navmaps = new long[359][359];
 }
 
 int read(String name, int index) throws Exception {
  InputStream input = UnitR.class.getResourceAsStream("/" + (name == null ? "" : name + "-") + "systems.csv");
  Scanner scanner = new Scanner(input);
  int i = index;
  while (scanner.hasNextLine()) {
   String line = scanner.nextLine();
   String[] items = line.split(",");
   systems[i] = Long.valueOf(items[0]).longValue();
   namings[i] = items[1];
   i++;
  }
  scanner.close();
  input.close();
  return i;
 }
 
 int index(long id) {
  for (int i = 0; i < systems.length; i++) {
   if (systems[i] == id) {
    return i;
   }
  }
  return -1;
 }
 
 void load(String name) throws Exception {
  InputStream input = UnitR.class.getResourceAsStream("/" + (name == null ? "" : name + "-") + "navmaps.csv");
  Scanner scanner = new Scanner(input);
  while (scanner.hasNextLine()) {
   String line = scanner.nextLine();
   String[] items = line.split(",");
   long source = Long.valueOf(items[0]).longValue();
   long target = Long.valueOf(items[1]).longValue();
   long effort = Long.valueOf(items[2]).longValue();
   int i = index(source);
   int j = index(target);
   if (i == -1 || j == -1) {
    System.err.println("skiping " + source + " -> " + target + " (" + effort + ")");
   } else {
    navmaps[i][j] = effort;
    navmaps[j][i] = effort;
   }
  }
  scanner.close();
  input.close();
 }
 
 void setup(String name) throws Exception {
  init();
  read(name, 0);
  load(name);  
 }

 int index(String name) {
  for (int i = 0; i < namings.length; i++) {
   String source = namings[i];
   if (source == null) {
    continue;
   } else if (source.equalsIgnoreCase(name)) {
    return i;
   }
  }
  return -1;
 }

 int ask(Scanner scanner, String text) {
  int s = -1;
  do {
   System.out.print(text);
   String source = scanner.nextLine();
   s = index(source);
   if (s == -1) {
    System.out.println("sorry, i don't know " + source + ".");
   }
  } while (s == -1);
  return s;
 }

 void route(Scanner scanner) {
  int s = ask(scanner, "from? ");
  int t = ask(scanner, "to? ");
  String src = namings[s];
  String tgt = namings[t];
  long duration = navmaps[s][t];
  if (duration == 0) {
   System.out.println("there is no direct route from " + src + " to " + tgt + ".");
  } else {
   System.out.println("the direct route from " + src + " to " + tgt + " takes " + duration + "ms.");
  }
 }

 void list(Scanner scanner) {
  System.out.print("filtering on: ");
  String filter = scanner.nextLine();
  for (int i = 0; i < namings.length; i++) {
   if (namings[i] == null) {
    continue;
   } else {
    long id = systems[i];
    String pattern = namings[i].toLowerCase();
    String prefix = filter.toLowerCase();
    if (pattern.startsWith(prefix)) {
     System.out.println("  - " + namings[i] + " (" + id + ")");
     
    }    
   }
  }
 }
 
 void loop(String name) {
  System.out.println("hello! my name is " + name + " and i'm ready.");
  Scanner scanner = new Scanner(System.in);
  boolean exit = false;
  while (exit == false) {
   System.out.print("what are you asking for? ");
   String line  = scanner.nextLine();
   if (line.equalsIgnoreCase("exit")) {
    exit = true;
   } else if (line.equalsIgnoreCase("list")) {
    list(scanner);
   } else if (line.equalsIgnoreCase("route")) {
    route(scanner);
   } else {
    System.out.println("sorry, i don't understand your request.");
   }
  }
  System.out.println("bye!");
  scanner.close();
 }
 
 void process(String name) throws Exception {
  setup(name);
  loop(name);
 }
 
 public static void main(String[] arguments) throws Exception {
  UnitR unit = new UnitR();
  unit.process("bb8");
 }
 
}

N'hésitez pas d'améliorer et de compléter si possibilité , il y a avec d'autres fonctionnalités.
A voir également:

3 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
14 déc. 2020 à 22:53
Bonjour,

Sans voir le code en question... personne ne pourra te venir en aide !!

Quoi qu'il en soit, il semble s'agir d'un exercice... la seule réponse à te donner dans ce cas est donc : Merci de lire ceci : https://www.commentcamarche.net/infos/25899-demander-de-l-aide-pour-vos-exercices-sur-ccm/



0
Art_1491 Messages postés 5 Date d'inscription lundi 14 décembre 2020 Statut Membre Dernière intervention 15 décembre 2020
Modifié le 14 déc. 2020 à 23:35
Merci pour le lien. Je tiens compte des différents conseils dans ce message. Merci encore une fois. Je tiens à préciser que vous trouverez ici bas le code que j'ai moi-même déjà commencé à compléter mais j'ai deux gros soucis : 1) comment ajouter la fonctionnalité : fusionner deux cartes de navigation ? Et 2) comment améliorer certaines fonctionnalités en les rendant le code plus efficace ? J'ai cherché sur internet et sur YouTube mais souvent je tourne en rond.
Voici le code :

Ça c'est pour la première classe qui hérite d'une autre classe dont j'ajoute le code en bas de celui-ci :

package fr.icam.bb8;

import java.io.InputStream;
import java.util.Scanner;

public class UnitR {

 long[] systems;
 String[] namings;
 long[][] navmaps;

 void init(){
  systems = new long[359];
  namings = new String[359];
  navmaps = new long[359][359];
 }
 
 int read(String name, int index) throws Exception {
  InputStream input = UnitR.class.getResourceAsStream("/" + (name == null ? "" : name + "-") + "systems.csv");
  Scanner scanner = new Scanner(input);
  int i = index;
  while (scanner.hasNextLine()) {
   String line = scanner.nextLine();
   String[] items = line.split(",");
   systems[i] = Long.valueOf(items[0]).longValue();
   namings[i] = items[1];
   i++;
  }
  scanner.close();
  input.close();
  return i;
 }
 
 int index(long id) {
  for (int i = 0; i < systems.length; i++) {
   if (systems[i] == id) {
    return i;
   }
  }
  return -1;
 }
 
 void load(String name) throws Exception {
  InputStream input = UnitR.class.getResourceAsStream("/" + (name == null ? "" : name + "-") + "navmaps.csv");
  Scanner scanner = new Scanner(input);
  while (scanner.hasNextLine()) {
   String line = scanner.nextLine();
   String[] items = line.split(",");
   long source = Long.valueOf(items[0]).longValue();
   long target = Long.valueOf(items[1]).longValue();
   long effort = Long.valueOf(items[2]).longValue();
   int i = index(source);
   int j = index(target);
   if (i == -1 || j == -1) {
    System.err.println("skiping " + source + " -> " + target + " (" + effort + ")");
   } else {
    navmaps[i][j] = effort;
    navmaps[j][i] = effort;
   }
  }
  scanner.close();
  input.close();
 }
 
 void setup(String name) throws Exception {
  init();
  read(name, 0);
  load(name);  
 }

 int index(String name) {
  for (int i = 0; i < namings.length; i++) {
   String source = namings[i];
   if (source == null) {
    continue;
   } else if (source.equalsIgnoreCase(name)) {
    return i;
   }
  }
  return -1;
 }

 int ask(Scanner scanner, String text) {
  int s = -1;
  do {
   System.out.print(text);
   String source = scanner.nextLine();
   s = index(source);
   if (s == -1) {
    System.out.println("sorry, i don't know " + source + ".");
   }
  } while (s == -1);
  return s;
 }

 void route(Scanner scanner) {
  int s = ask(scanner, "from? ");
  int t = ask(scanner, "to? ");
  String src = namings[s];
  String tgt = namings[t];
  long duration = navmaps[s][t];
  if (duration == 0) {
   System.out.println("there is no direct route from " + src + " to " + tgt + ".");
  } else {
   System.out.println("the direct route from " + src + " to " + tgt + " takes " + duration + "ms.");
  }
 }

 void list(Scanner scanner) {
  System.out.print("filtering on: ");
  String filter = scanner.nextLine();
  for (int i = 0; i < namings.length; i++) {
   if (namings[i] == null) {
    continue;
   } else {
    long id = systems[i];
    String pattern = namings[i].toLowerCase();
    String prefix = filter.toLowerCase();
    if (pattern.startsWith(prefix)) {
     System.out.println("  - " + namings[i] + " (" + id + ")");
     
    }    
   }
  }
 }
 
 void loop(String name) {
  System.out.println("hello! my name is " + name + " and i'm ready.");
  Scanner scanner = new Scanner(System.in);
  boolean exit = false;
  while (exit == false) {
   System.out.print("what are you asking for? ");
   String line  = scanner.nextLine();
   if (line.equalsIgnoreCase("exit")) {
    exit = true;
   } else if (line.equalsIgnoreCase("list")) {
    list(scanner);
   } else if (line.equalsIgnoreCase("route")) {
    route(scanner);
   } else {
    System.out.println("sorry, i don't understand your request.");
   }
  }
  System.out.println("bye!");
  scanner.close();
 }
 
 void process(String name) throws Exception {
  setup(name);
  loop(name);
 }
 
 public static void main(String[] arguments) throws Exception {
  UnitR unit = new UnitR();
  unit.process("bb8");
 }
 
}

N.B : J'ai crée des fichiers cvs dans lequel se trouve les coordonnées et le nom des villes du problème.

La deuxième classe :


package fr.icam.bb8;

public class UnitBB extends UnitR {
	
	void setup(String... names) throws Exception {
		/* TODO */ 
	}
	
	void process(String name, String... names) throws Exception {
		setup(names);
		loop(name);
	}

	public static void main(String[] arguments) throws Exception {
		UnitBB unit = new UnitBB();
		unit.process("BB-8", "r2d2", "bb8");
	}
	
}



Pour les fichiers cvs notés que tout au long du code je lis et fais des recherches sur ses données. Elles contiennent les villes et les distances entre les villes. Je continue à travailler sur la présentation du code pour qu'il soit plus lisible ce qui m'embête vraiment c'est trouvé un moyen optimal pour fusionner les deux cartes.
0
Art_1491 Messages postés 5 Date d'inscription lundi 14 décembre 2020 Statut Membre Dernière intervention 15 décembre 2020
14 déc. 2020 à 23:44
Rébonsoir à toute la communauté !
J'espère que nous allons tous bien. En ce qui concerne mon problème, je continue personnellement à faire des recherches sur comment rémanier , analyser et prévenir les erreurs efficacement sur un code Java.
Et durant mes recherches sur cet axe, je suis tombé sur l'outil jUnit pour tester mon code mais je ne comprend vraiment pas bien comment l'utiliser ici ?
Suis je sur la bonne voie ? Comment utiliser le module jUnit pour cet code ?
La question de la fusion des cartes me dérange toujours. Là j'ai aucune idée.

Merci de bien me lire.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
15 déc. 2020 à 08:02
Bonjour,

jUnit permet de faire des tests unitaires, ce qui requiert d'avoir des méthodes "unitaires" qui font des tâches simples individuellement et qui dépendent de pas ou peu de contexte.
Dans ton code l'utilisation de Scanner est omniprésente mais ce n'est pas facilement testable, il faudrait davantage découper le code en méthodes qui ne dépendent que des paramètres des méthodes pour pouvoir tester efficacement.
De toute façon tout est à revoir dans le code, à commencer par la structure de données (long[359] String[359] et long[359][359]), Java est un langage objet, l'amélioration du programme devrait donc passer par la création de classes spécifiques à ton programme (chacune ayant ses propres tests unitaires).
Donc oui jUnit est un très bon outil, indispensable en milieu professionnel, mais il requiert d'abord de faire du Java propre, et ici il faudrait tout revoir de zéro.
0
Art_1491 Messages postés 5 Date d'inscription lundi 14 décembre 2020 Statut Membre Dernière intervention 15 décembre 2020
15 déc. 2020 à 08:18
Merci pour ta réponse

S'il te plaît, tu veux dire quoi par faire du Java propre ?
Merci de bien m'indiquer une source pour ample compréhension.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Art_1491 Messages postés 5 Date d'inscription lundi 14 décembre 2020 Statut Membre Dernière intervention 15 décembre 2020
15 déc. 2020 à 08:51
Faire du Java "propre" c'est notamment faire de la programmation objet, séparer les instructions "métier" des interactions avec l'utilisateur (pattern MVC par exemple), parce que ici tu codes effectivement avec le langage Java, mais dans l'esprit ce n'est pas comme cela qu'un programme Java devrait être écrit.

https://jmdoudoux.developpez.com/cours/developpons/java/chap-poo.php
https://baptiste-wicht.developpez.com/tutoriels/conception/mvc/
0
Art_1491 Messages postés 5 Date d'inscription lundi 14 décembre 2020 Statut Membre Dernière intervention 15 décembre 2020 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
15 déc. 2020 à 11:02
Merci beaucoup pour les liens ! Je lis et j'applique puis je reviendrai vers toi.
0