我在试图解决网球-重构-卡塔问题。这在启动时似乎相当困难,但通过使用OOP,它可以使用单个if
进行深度重构。
我的第一个理解是TennisGame
(主类)有一个Score
。或者至少应该有一个。
此外,得分的可能性只有20(爱-全部,15-全部……)每一个人都将Score
s引向更高的位置,这取决于谁是最后一个得分得分的球员(例如:爱情--如果最后一分是由第一名选手“爱-其他人”得分的话),那么“爱--所有的爱”就会导致“爱情”。通过这个观察,我写了20个这样的类:
public class LoveAll implements IScore {
public IScore Player1Scored() {
return new FifteenLove();
}
public IScore Player2Scored() {
return new LoveFifteen();
}
public String Label() {
return "Love-All";
}
}
这似乎是浪费时间,但这并不坏,因为每一节课都是简单而简洁的。这给了我编写这样一个TennisGame4
的可能性:
public class TennisGame4 implements TennisGame {
private IScore score = null; // Composition here - TennisGame has a Score
private String player1Name;
private String player2Name;
public TennisGame4(String player1Name, String player2Name) {
this.player1Name = player1Name;
this.player2Name = player2Name;
score = new LoveAll();
}
public void wonPoint(String playerName) {
if (playerName.equals("player1"))
score = score.Player1Scored();
else
score = score.Player2Scored();
}
public String getScore() {
return score.Label();
}
}
只是一个if
来区分谁是最后一个得分的球员。你觉得这个解决方案怎么样?这个解决方案是否符合kata约束?
考虑到这一点:
发布于 2017-08-30 16:27:09
正如您所说的,Score
的可能性有限,我称之为GameScore
,更准确地说是这样。这需要一个枚举。
public enum GameScore {
S0000(0, 0), S1500(15, 0), S3000(30, 0), ...;
private static final GameScore[] SWIN = { S1500, ... };
private static final GameScore[] RWIN = { S0015, ... };
private static final String[] NAME = { "Love-All", ... };
...
public GameScore serverWins() {
return SWIN[ordinal()];
}
public GameScore returnerWins() {
return RWIN[ordinal()];
}
public String getDisplayText() {
return NAME[ordinal()];
}
}
就这样。都在一节课上,准备测试。
顺便说一句,在Java中,所有方法名都以小写字母开头,而不是大写字母。(这将是C#或Ada.)
使用enum
和预定义的字符串文字可以在运行时生成零内存分配。
https://codereview.stackexchange.com/questions/174395
复制相似问题