首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >网球-重构-卡塔通过OOP

网球-重构-卡塔通过OOP
EN

Code Review用户
提问于 2017-08-30 15:07:11
回答 1查看 1.5K关注 0票数 2

我在试图解决网球-重构-卡塔问题。这在启动时似乎相当困难,但通过使用OOP,它可以使用单个if进行深度重构。

我的第一个理解是TennisGame (主类)有一个Score。或者至少应该有一个。

此外,得分的可能性只有20(爱-全部,15-全部……)每一个人都将Scores引向更高的位置,这取决于谁是最后一个得分得分的球员(例如:爱情--如果最后一分是由第一名选手“爱-其他人”得分的话),那么“爱--所有的爱”就会导致“爱情”。通过这个观察,我写了20个这样的类:

代码语言:javascript
运行
复制
public class LoveAll implements IScore {

    public IScore Player1Scored() {
        return new FifteenLove();
    }

    public IScore Player2Scored() {
        return new LoveFifteen();
    }

    public String Label() {
        return "Love-All";
    }
}

这似乎是浪费时间,但这并不坏,因为每一节课都是简单而简洁的。这给了我编写这样一个TennisGame4的可能性:

代码语言:javascript
运行
复制
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约束?

考虑到这一点:

  • 代码当然可以增强(播放器也应该是一个对象);
  • 为了留在卡塔,我已经在90分钟左右做了所有的事情;
EN

回答 1

Code Review用户

发布于 2017-08-30 16:27:09

正如您所说的,Score的可能性有限,我称之为GameScore,更准确地说是这样。这需要一个枚举。

代码语言:javascript
运行
复制
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和预定义的字符串文字可以在运行时生成零内存分配。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/174395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档