一段时间以来,我一直在尝试更好地构建代码结构,并专注于在我的代码中越来越多地使用OOP概念。
我有一个关于以下情况的简单问题,以及如何从设计模式的角度最好地解决它。
我有一个游戏,玩家可以在其中抢劫商店。商店由Shop
对象表示,抢劫由RobEvent
表示。我有一个Spawner
对象,当有人试图抢劫商店时,该对象负责处理有价证券。
我的中心问题是,我有一种感觉,RobEvent
对象包含下面所述的太多信息和功能,并且我可以将信息和功能拆分为更多的对象,为此,我需要您的帮助!
public class Main
{
public static void main(String[] args)
{
}
public class Shop {
private String name;
private Location location;
private boolean isBeingRobbed = false;
/*
* Here one of the problems, should the shop have the
* data of the npcs, which will appear
* in the shop when the player attempts to rob it.
* Should it have methods to place "spawn" positions of
* the securities, the type, the amount etc.
* and store it here?
*
*/
public Shop(String name, Location location){
this.name = name;
this.location = location;
}
public boolean isBeingRobbed(){
return isBeingRobbed;
}
protected void setBeingRobbed(boolean bool){
this.isBeingRobbed = bool;
}
}
public class RobEvent extends Looper {
private Shop shop;
RobEvent(Shop shop){
this.shop = shop;
}
public void start(){
shop.setBeingRobbed(true);
}
@Override
protected void logic(){
/*
* Big chunk of game logic
* Spawning the securities, checking if they
* all appeared(they got a delay of few seconds each),
* check if he ran away before everything
* spawned, check if he killed all, check if all appeared
*/
}
private void completed(){
shop.setBeingRobbed(false);
}
}
public class Spawner {
/* not important things
*
* just has a method to
* handle the spawn of a security
*/
public void spawn(NPC npc){
/*
* spawn the npc aka security
*/
}
}
}
我最大的问题是logic()
方法变得非常大。这是一个方法,它由超类每秒循环一次。
更多细节:
RobEvent
必须知道它当前是否正在产生证券并做特定的事情,最烦人的是跟踪生成的证券,因为如果他逃跑了,则必须全部删除它们。我觉得这是关于此对象的太多信息,例如,我可以将跟踪生成的证券拆分到一个单独的对象中,然后在tracker.despawn
有一个{具体状态。
编辑:代码实际上是对实际代码的简化。
答案 0 :(得分:1)
RobEvent必须知道它当前是否正在产生证券并做特定的事情,-它必须检查是否都产生了证券并做特定的事情,-它必须检查玩家是否在完成之前逃跑并进行特定的事情。事情-必须检查玩家是否杀死了所有人并做特定的事情等。
这听起来像middleware usage,它将逻辑与状态分离。
RobEvent
需要跟踪RobState
。您有多个RobState
,例如StartSpanSecuritiesState
,AllSecuritiesSpanedState
,PlayerRunAwayState
等。
interface RobState {
void handle();
}
class RobEvent extends Looper implements RobState {
// add new member
private RobState robState;
private Shop shop;
RobEvent(Shop shop) {
this.shop = shop;
this.robState = new StartSpanSecuritiesState();
}
// add new setter - gets normally called only by a `State`
void setRobState(RobState robState) {
this.robState = robState;
}
// ..
}
每个RobState
都知道下一个RobState
,并通过setRobState
的{{1}}对其进行设置。
RobEvent
所有修改之后,class StartSpanSecuritiesState implements RobState {
private RobEvent robEvent;
public StartSpanSecuritiesState(RobEvent robEvent) {
this.robEvent = robEvent;
}
@Override
public void handle() {
// span your securities
//...
// go to the next state
robEvent.setRobState(new AllSecuritiesSpanedState(robEvent));
}
}
方法可能类似于:
logic
希望对您有所帮助!如果不是这次,也许是将来!
玩游戏吧:]
答案 1 :(得分:0)
就OO结构而言,类具有状态(其属性)和行为(其方法)。我将RobEvent视为Shop的一种行为,即将其移至方法而不是成为类。
对于您的logic()方法变得太长,最好知道它太长,这通常表明它做得太多。最简单的方法是将其拆分为较小的方法,每个方法执行一件特定的事情并依次调用。例如,典型的游戏循环可能类似于:
public void gameLoop(){
while(this.gameRunning){
this.checkUserInputs();
this.updateGameState();
this.updateGameDisplay();
}
}
更短/更小的方法比冗长的方法更容易理解和维护。
答案 2 :(得分:0)
除其他答案外,我还将考虑将RobEvent建模为实际的this.productService.getProductById(id)
.subscribe((data )=> {this.TotalPrice = data.Price;});
(我不是Java开发人员,也不知道如何在Java中实现这些功能)。商店被抢劫时,它会发送Event
。 RobEvent
对象可以订阅这些事件,并在每个Spawner
上发送证券。
然后,如果强盗逃走,商店将发送RobEvent
所订购的所有证券(或RobberRunAwayEvent
)。