2016-04-15 22 views
0

我正在打造一款運動產品。我有3班我應該在相關類之間有多餘的方法名嗎?

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!" 
} 

一個團隊就是任何運動隊。比賽是兩隊之間的比賽。在比賽中,發生的比賽會附加到比賽中。

我有需要回到家/客隊的名稱,簡稱,和縮寫名稱,給定一個MatchPlay。你更喜歡哪個選項?爲什麼?

選項1 - 呼叫者需要這樣做。例如:

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 
    } 
} 

選項2 - 同樣的方法添加到這兩個類

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() 
} 

記住我希望得到名稱,簡稱,縮寫名稱,給家庭和客場強隊一匹配或播放對象,所以會有很多方法重複與選項2.

回答

0

選項1是首選兩個。 通常情況下,您不會參考Play to Match和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!" 
} 

現在,你將不能夠只用播放,以獲得球隊的名字,但如果你有所有的比賽訪問,你可以做這樣的事情:

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

如果這是不可接受的,如果你只需要從一場比賽中得到球隊名稱,而不知道比賽情況,你可以在比賽中直接參考。即:

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

這將你的代碼比選擇2個,但小於1的選項

這都因爲「得墨忒耳定律」(https://en.wikipedia.org/wiki/Law_of_Demeter),它簡而言之說,你不應該」不知道比賽,如果比賽知道你真的想要什麼,你應該知道Team。

鏈接有一個體面的例子,我建議你閱讀。 :)

相關問題