Pour mon projet de structures de données, le but est de lire dans un fichier fourni contenant plus de 10000 chansons avec l'artiste, le titre et les paroles clairement marqués, et chaque chanson est séparée par une ligne avec un double guillemet. J'ai écrit ce code pour analyser le fichier texte, et il fonctionne, avec une durée d'un peu moins de 3 secondes pour
lire les 422k lignes de texte
créer un objet Song
ajouter ledit morceau à un ArrayList
De quelle autre manière ce code peut-il être optimisé pour la programmation défensive?
le code d'analyse syntaxique je l'ai écrit est:
if (songSource.canRead()) { //checks to see if file is valid to read
readIn= new Scanner(songSource);
while (readIn.hasNextLine()) {
do {
readToken= readIn.nextLine();
if (readToken.startsWith("ARTIST=\"")) {
artist= readToken.split("\"")[1];
}
if (readToken.startsWith("TITLE=\"")) {
title= readToken.split("\"")[1];
}
if (readToken.startsWith("LYRICS=\"")) {
lyrics= readToken.split("\"")[1];
} else {
lyrics+= "\n"+readToken;
}//end individual song if block
} while (!readToken.startsWith("\"")); //end inner while loop
songList.add(new Song(artist, title, lyrics));
}//end while not EOF
} //end if file can be read
Je discutais avec mon introduction au professeur Algorithmes sur le code pour ce projet, et il a déclaré que je devrais essayer d'être plus défensif dans mon code pour permettre incohérences dans les données fournies par d'autres personnes. À l'origine, j'utilisais des blocs if/else entre les champs Artist, Title et Lyrics, et sur sa suggestion je passais à des instructions if séquentielles. Bien que je puisse voir son point de vue, en utilisant cet exemple de code, comment puis-je être plus défensive en ce qui concerne les incohérences de saisie?
C'est une question ouverte pour rendre votre code "meilleur". Envisagez-vous d'en faire un wiki communautaire? – pascal