--- tags: code review, wemanity, Java --- # code review [bakkari1u /Recommendation-system](https://github.com/bakkari1u/Recommendation-system) ## Code scan :mag_right: ### Overall project #### README - :arrow_up: il y a un readme c'est bien :smiley_cat: - :arrow_down: le readme n'indique pas comment lancer le programme, ni quelle version de java est utilisée (le readme est technique) #### Project sturture - :arrow_down: le projet est mal structuré, on pourrait avoir un dossier pour le code et un autre pour les assets avec une seule main function qui donnera à l'utilisateur le choix d'exécuter le programme qu'il souhaite ### MUT.java - [LIGNE 8](https://github.com/bakkari1u/Recommendation-system/blob/c4d3ac58319626a5d5446385fab265dfb9ee71df/MUT.java#L8) la fonction est vide et n'est pas utilisée donc elle doit etre supprimée. - [LIGNE 14](https://github.com/bakkari1u/Recommendation-system/blob/c4d3ac58319626a5d5446385fab265dfb9ee71df/MUT.java#L14) la main fonction throws une exception ce qui veut dire qu'elle n'est pas gérée. Le mieux serait de faire un **try/catch** sur la/les statements concernées et gérer l'exception (l'ouverture du fichier à la ligne 22). - [LIGNES 16 & 17](https://github.com/bakkari1u/Recommendation-system/blob/c4d3ac58319626a5d5446385fab265dfb9ee71df/MUT.java#L16-L17) Pourquoi utiliser des types **Vector** à la place d'une **ArrayList** sachant que les vectors sont plus gourmants en ressources ? De plus le nom d'une variable commence toujours par une minuscule. - [LIGNES 32 à 40](https://github.com/bakkari1u/Recommendation-system/blob/c4d3ac58319626a5d5446385fab265dfb9ee71df/MUT.java#L32-L40) nous voulons avoir une liste à valeur unique le type adéquat pour **themes & users** est **SET** et non **Vector**. cela évitera la verification de l'existance de l'object. Pour une meilleur lisibilité et evolutibilité du code il faudrait mettre les index **contenus[1] ou contenus[2]** dans une Enum (idem pour le path des fichiers) ```java // Par exemple public enum LongIndex { ID(0), USER(1), THEME(1); private int value; public int getValue() { return this.value } test(int value) { this.value = i; } } ... users.add(contenus[LongIndex.USER.value]); users.add(contenus[LongIndex.THEME.value]); ... ``` - [LIGNE 42](https://github.com/bakkari1u/Recommendation-system/blob/c4d3ac58319626a5d5446385fab265dfb9ee71df/MUT.java#L42) Il faut penser à fermer **BufferedReader** - [LIGNES 48 à 90](https://github.com/bakkari1u/Recommendation-system/blob/c4d3ac58319626a5d5446385fab265dfb9ee71df/MUT.java#L48-90) Ici encore **try/catch** et **finally** pour toujours fermer ton **FileWriter** meme en cas d'exception. Il faut aussi penser à donner des noms de variable explicites ### Recomm.java - [LIGNES 28 à 56](https://github.com/bakkari1u/Recommendation-system/blob/c4d3ac58319626a5d5446385fab265dfb9ee71df/Recomm.java#L28-L56) Beaucoup mieux sur la gestion des exceptions mais il y a un double **try/catch** ce n'est pas necessaire dans ce cas. On peut juste faire suivre les **catch** comme à la ligne **44**. Enfin il faut penser à fermer **BufferedReader** :wink: ## Notes :writing_hand: Bien dans l'ensemble, bonne connaissance algorithmique doit s'améliorer en java et a besoin d'être initié aux pratiques craft