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)简单地说,你不应该知道这场比赛,如果这是比赛知道你真正想要的,你应该知道球队

该链接有一个不错的例子,我建议您阅读:)