HiveBrain v1.2.0
Get Started
← Back to all entries
snippetjavaMinor

Find existing player to update or create new one

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
updatenewcreateplayeronefindexisting

Problem

I'm making a game in Java 7, and I have this block of logic when handling an update from the server.

public void handleNewPlayer(Player newPlayer, Player[] otherPlayers) {
    boolean done = false;
    for (Player otherPlayer : otherPlayers) {
        if (newPlayer.id == otherPlayer.id) {
            updatePlayer(otherPlayer);
            done = true;
            break;
        }
    }

    if (!done) {
        createPlayer(newPlayer);
    }
}


The client has a list of players, and gets a player object from the server. If the client already has that player (one with the same id), it updates that existing one, otherwise it creates a new one.

This code looks ugly though. The done flag is really getting under my skin. Is there a better way to organize this to avoid that? Are there any other problems with this code?

Sidenote: createPlayer() and updatePlayer() do very different things, and need to be seperate methods.

Solution

A very quick review for the code, and assuming Java def handleNewPlayer(Player newPlayer, Player[] otherPlayers) {
def otherPlayer = otherPlayers.find() { newPlayer.id == otherPlayer.id }
if (otherPlayer) {
updatePlayer otherPlayer
}
else {
createPlayer newPlayer
}
}

Code Snippets

public void handleNewPlayer(Player newPlayer, Player[] otherPlayers) {
    for (Player otherPlayer : otherPlayers) {
        if (newPlayer.id == otherPlayer.id) {
            updatePlayer(otherPlayer);
            return;
        }
    }

    createPlayer(newPlayer);
}
public void handleNewPlayer(Player newPlayer, Player[] otherPlayers) {
    final Optional<Player> otherPlayer = Arrays.stream(otherPlayers)
        .filter((Player p) -> newPlayer.id == p.id)
        .findFirst();

    if (otherPlayer.isPresent()) {
      updatePlayer(otherPlayer.get());
    }
    else {
      createPlayer(newPlayer);
    }
}
public void handleNewPlayer(Player newPlayer, Player[] otherPlayers) {
    final Optional<Player> player = Arrays.stream(otherPlayers)
        .filter((Player p) -> newPlayer.id == p.id)
        .findFirst()
        .orElse(newPlayer);

    if (newPlayer == player) {
      createPlayer(newPlayer);
    }
    else {
      updatePlayer(player);
    }
}

Context

StackExchange Code Review Q#107963, answer score: 3

Revisions (0)

No revisions yet.