2010-09-03 5 views
0

J'ai une fonction grossière et je veux la nettoyer. Tout ce qu'il contient est des cartes, une boucle for, et si les déclarations.Groovy - Fonctions de nettoyage

Fondamentalement, j'ai une carte que je voudrais saisir seulement certaines informations de mais l'une des clés dont j'ai besoin change d'un nombre dans chaque carte. Je pensais que peut-être une simple déclaration de commutateur ou quelque chose devrait le réparer, mais je suis souvent confondu avec la simplification de telles choses.

Voici ce que la fonction ressemble:

public void separateBooksFromList() { 

book1 = [:]      //map for book1 
book2 = [:]      //map for book2 
book3 = [:]      //map for book3 
book4 = [:]      //map for book4 
book5 = [:]      //map for book5 
book6 = [:]      //map for book6 
book7 = [:]      //map for book7 
book8 = [:]      //map for book8 
book9 = [:]      //map for book9 
book10 = [:]     //map for book10 

lastModified = new Date(dataFile.lastModified())   //last time the file was scanned 
readDate = new Date()         //current date the text file was read 

for(int i = 0; i < bookList.size(); i++) { 


    if(i==0) { 
     book1['lastScan'] = lastModified 
     book1['readDate'] = readDate 
     book1['bookNumber'] = bookList['Book Number 0'][i]  // <- only part of the map that changes 
     book1['bookTitle'] = bookList['Book Title'][i] 

    } 

    if(i==1) { 
     book2['lastScan'] = lastModified 
     book2['readDate'] = readDate 
     book2['bookNumber'] = bookList['Book Number 1'][i]  // <- only part of the map that changes 
     book2['bookTitle'] = bookList['Book Title'][i] 
    } 

    if(i==2) { 
     book3['lastScan'] = lastModified 
     book3['readDate'] = readDate 
     book3['bookNumber'] = bookList['Book Number 2'][i]  // <- only part of the map that changes 
     book3['bookTitle'] = bookList['Book Title'][i] 
    } 

    if(i==3) { 
     book4['lastScan'] = lastModified 
     book4['readDate'] = readDate 
     book4['bookNumber'] = bookList['Book Number 3'][i]  // <- only part of the map that changes 
     book4['bookTitle'] = bookList['Book Title'][i]  
    } 

    if(i==4) { 
     book5['lastScan'] = lastModified 
     book5['readDate'] = readDate 
     book5['bookNumber'] = bookList['Book Number 4'][i]  // <- only part of the map that changes 
     book5['bookTitle'] = bookList['Book Title'][i]  
    } 

    if(i==5) { 
     book6['lastScan'] = lastModified 
     book6['readDate'] = readDate 
     book6['bookNumber'] = bookList['Book Number 5'][i]  // <- only part of the map that changes 
     book6['bookTitle'] = bookList['Book Title'][i] 
    } 

    if(i==6) { 
     book7['lastScan'] = lastModified 
     book7['readDate'] = readDate 
     book7['bookNumber'] = bookList['Book Number 6'][i]  // <- only part of the map that changes 
     book7['bookTitle'] = bookList['Book Title'][i] 
    } 

    if(i==7) { 
     book8['lastScan'] = lastModified 
     book8['readDate'] = readDate 
     book8['bookNumber'] = bookList['Book Number 7'][i]  // <- only part of the map that changes 
     book8['bookTitle'] = bookList['Book Title'][i] 
    } 

    if(i==8) { 
     book9['lastScan'] = lastModified 
     book9['readDate'] = readDate 
     book9['bookNumber'] = bookList['Book Number 8'][i]  // <- only part of the map that changes 
     book9['bookTitle'] = bookList['Book Title'][i] 
    } 

    if(i==9) { 
     book10['lastScan'] = lastModified 
     book10['readDate'] = readDate 
     book10['bookNumber'] = bookList['Book Number 9'][i]  // <- only part of the map that changes 
     book10['bookTitle'] = bookList['Book Title'][i] 
    } 

    } 

} 

Comme vous pouvez le voir, il est tout à fait une fonction laid. Est-ce que je peux faire une simple déclaration de changement ou quelque chose pour réduire le code et le rendre plus professionnel?

Répondre

2

Il y a plusieurs choses que vous pouvez faire ici. Vous pouvez utiliser une liste de livres plutôt que book1, book2, etc ... Cela vous évitera de vous répéter autant.

C'est presque le même mais avec ce changement. Il va créer une liste de taille 10 (en supposant 10 livres) avec une entrée de carte comme ce que vous aviez avant.

public void separateBooksFromList() { 
    lastModified = new Date(dataFile.lastModified())   //last time the file was scanned 
    readDate = new Date()         //current date the text file was read 

    // Use a list of Maps instead of separate variables 
    int numberOfBooks = bookList.size() 
    def books = [] 
    numberOfBooks.times { 
     books[it] = [ 
      lastScan: lastModified, 
      readDate: readDate, 
      bookNumber: booklist["Book Number $it"][it], 
      bookTitle: booklist["BookTitle"][it] 
     ] 
    } 
} 
+0

Wow c'est plutôt cool. J'ai dû regarder 'int.times' pour voir ce qu'il a fait. Merci de me montrer ce Chris. C'est très utile et a l'air très propre. Donc, si je voulais que les grails génèrent une page à partir de la liste des livres, je pourrais juste la parcourir et ajouter les valeurs en fonction des clés correctes? Merci encore – StartingGroovy

+0

.times est une fonction amusante, mais vous devez utiliser eachWithIndex à la place. Mieux encore, la méthode de collecte vous permet de construire une liste au fur et à mesure, mais ne fonctionnera pas dans cette situation puisque vous utilisez les index dans la liste finale. – Blacktiger

+0

Merci pour plus de conseils Blacktiger. J'ai fini par utiliser eachWithIndex pour les imprimer et m'assurer que tout est en ordre de marche. Je vais aussi regarder un peu plus dans la méthode de collecte. C'est malheureux groovy est lent par rapport à Java, j'apprécie comment il réduit tellement de code si. – StartingGroovy