Oop 相关类之间是否应该有冗余的方法名?
我正在制作一款运动产品。我有三节课Oop 相关类之间是否应该有冗余的方法名?,oop,design-patterns,dry,encapsulation,Oop,Design Patterns,Dry,Encapsulation,我正在制作一款运动产品。我有三节课 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 // "K
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!"
}
球队就是任何运动队。比赛是两队之间的体育比赛。在比赛期间,会发生与该比赛相关的比赛
我需要得到主客场球队的名字、简称和缩写,只要有比赛
或比赛
。你喜欢哪种选择?为什么
选项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会有很多方法重复。在这两种方法中,选项1更可取。 通常情况下,你不会从一场比赛到另一场比赛,从一场比赛到另一场比赛
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更适合您的代码
这都是因为“得墨忒尔定律”(Law of Demeter)简单地说,你不应该知道这场比赛,如果这是比赛知道你真正想要的,你应该知道球队
该链接有一个不错的例子,我建议您阅读:)