2016-04-15 1 views
0

Je construis un produit de sport. J'ai 3 classesDevrais-je avoir des noms de méthode redondants entre les classes liées?

class Team { 
    getName // ex: Los Angeles Lakers 
    getShortName // ex: Lakers 
    getAbbrName // ex: LAL 
} 

class Match { 
    Team getHomeTeam 
    Team getAwayTeam 
    Play[] plays 
} 

class Play { 
    Match getMatch 
    String description // "Kobe Bryant scores a 3 pointer!" 
} 

Une équipe est tout simplement une équipe sportive. Un match est un match de sport entre deux équipes. Pendant un match, des jeux se produisent qui sont attachés à ce match.

J'ai besoin d'obtenir le nom de l'équipe à domicile/à l'extérieur, le nom abrégé et les noms abrégés, à savoir Match ou Play. Quelle option préférez-vous et pourquoi?

Option 1 - les appelants doivent le faire. Ex:

class SomeCaller { 
    foo() { 
    Play play = // somehow get a play; 
    Match match = play->getMatch; 
    Team home = match->getHomeTeam; 
    Team away = match->getAwayTeam; 
    String homeTeamName = home->getName; 
    String homeTeamShortName = home->getShortName; 
    String homeTeamAbbrName = home->getAbbrName; 
    String awayTeamName = away->getName; 
    String awayTeamShortName = away->getShortName; 
    String awayTeamAbbrName = away->getAbbrName; 
    // do something with the team names 
    } 
} 

Option 2 - Ajouter les mêmes méthodes pour les deux classes

class Match { 
    Team getHomeTeam 
    Team getAwayTeam 
    Play[] plays 

    String getHomeTeamName() { 
    Team homeTeam = getHomeTeam(); 
    return homeTeam->getName(); 
    } 

    // same as above... 
    String getHomeTeamShortName() 
    String getHomeTeamAbbrName() 
    String getAwayTeamName() 
    String getAwayTeamShortName() 
    String getAwayTeamAbbrName() 
} 

class Play { 
    Match getMatch 

    String getHomeTeamName() { 
    Match match = getMatch; 
    return match->getHomeTeamName(); 
    } 

    // same as above... 
    String getHomeTeamShortName() 
    String getHomeTeamAbbrName() 
    String getAwayTeamName() 
    String getAwayTeamShortName() 
    String getAwayTeamAbbrName() 
} 

Gardez à l'esprit que je voudrais obtenir le nom, le nom court, abbr nom, pour la maison et à l'écart des équipes donné une Match ou Play objet, donc il va y avoir beaucoup de duplication de méthode avec l'option 2.

Répondre

0

L'option 1 est préférée des deux. Généralement, vous n'avez pas de référence de Play to Match et Match to Play.

class Team { 
    getName // ex: Los Angeles Lakers 
    getShortName // ex: Lakers 
    getAbbrName // ex: LAL 
} 

class Match { 
    Team getHomeTeam 
    Team getAwayTeam 
    Play[] plays 
} 

class Play { 
    String description // "Kobe Bryant scores a 3 pointer!" 
} 

Maintenant, vous ne serez pas en mesure d'obtenir les noms de l'équipe avec seulement un jeu, mais si vous avez accès à tous les matchs que vous pouvez faire quelque chose comme ceci:

foreach(match in matches) 
    foreach(play in match) 
     if(play == desiredPlay) 
      doSomething 

Si cette n'est pas acceptable, au cas où vous auriez besoin d'obtenir des noms d'équipes uniquement à partir d'un jeu, sans connaître les matchs, vous auriez une référence à cela directement dans votre jeu. À savoir:

class Play { 
    Team getHomeTeam 
    Team getAwayTeam 
    String description // "Kobe Bryant scores a 3 pointer!" 
} 

Ce couple votre code plus que l'option 2, mais moins que l'option 1.

Ceci est tout à cause de « Loi de Déméter » (https://en.wikipedia.org/wiki/Law_of_Demeter) qui en un mot dit, vous shouldn » Si vous connaissez le Match, si c'est ce que Match sait que vous voulez vraiment, vous devriez plutôt connaître Team.

Le lien a un exemple décent que je vous suggère de lire. :)