Java OOP:如何正确创建对象

new*_*ger 5 java oop object

我正在使用OOP创建一个简单的保龄球游戏,我希望每个碗都有一个类,一个由两个碗组成的Frame类,以及一个由十个帧组成的Game类.

目前我有这样的事情

Bowl.java

public class Bowl {

int bowlScore = 0;

public Bowl(int pinsKnocked){
    bowlScore = pinsKnocked;
}
}
Run Code Online (Sandbox Code Playgroud)

Frame.java

public class Frame{

int firstScore;
int secondScore;
public Bowl firstBowl;
public Bowl secondBowl;

public Frame (){
    firstBowl = new Bowl(0);
    secondBowl = new Bowl(0);
}

public Frame (int firstScore, int secondScore){
    firstBowl = new Bowl(firstScore);
    secondBowl = new Bowl(secondScore);
} 
Run Code Online (Sandbox Code Playgroud)

Game.java

public class Game {

int totalScore;
public Frame firstFrame;
public Frame secondFrame;
...
    public Frame tenthFrame;

public Game(){
    firstFrame = new Frame();   
}

public Game(Frame f){
    firstFrame = f;
}
Run Code Online (Sandbox Code Playgroud)

这是使用OOP功能的正确方法还是我能如何改进?

Edw*_*uck 4

设计保龄球游戏并没有 100% 正确的方法;有许多可行的解决方案,甚至还有更多无效的解决方案。

您需要的是一个适合您和您的目标的解决方案。

如果你想显示分数,那么我建议你从一种getScore()方法开始。如果您想显示获胜者,请从一个displayWinners()方法开始。

最终你会发现这些方法自然地绑定到各种名词上。例如,您可能一开始会getScore()附着在一个Game物体上,但随后意识到这不自然地意味着您的游戏只能有一个分数。如果发生这种情况,您可以将 移动getScore()到一个Player对象,并让游戏保留一名或多名玩家。

如果您正在使用自然属于其他地方的方法,那么代码中会有许多提示可以指导您。最明显的提示是,一个方法似乎对另一个对象的数据特别感兴趣,甚至对它自己的数据更感兴趣。在上面的例子中,getScore()游戏对象中的 a 对玩家的框架、球等过于感兴趣。

为了获得如何安全地将代码从一个地方移动到另一个地方的技能和指导,我建议阅读 Martin Fowler 的《重构》一书。

这里演示了一个很好的例子,完全使用您的问题

祝你好运,一段时间后,由于获得的技能,你将能够跳过这个过程的一些部分;然而,当第一次学习时,最好不要跳过这些探索性步骤(从头开始)。

附言。请记住,您的代码只会执行您测试它要做的事情,如果您不熟悉测试驱动开发,那么研究一下它可能是个好主意(提示,这是一个巨大的轻描淡写)。