Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to avoid having multiple parameter for a function

Tags:

java

I'm developing a game in which there're many classes. The game appears like a grid plane. I have a function which can detect whether a grid consist of any kind of specified class of object. This function return true if the grid contain any one of the specified type of object and return false if there's none. However, when the number of classes needed to be detected increase, the parameter list can easily become awfully long, does anyone know how can I resolve that problem? Any design pattern would help? Or my design is acceptable in this case?

public boolean sameClass(int x, int y, String... className) {
    for (Entity entity : entities) {
        if (entity.getX() == x && entity.getY() == y) {
            for (String name : className) {
                if (name == entity.getClassName()) {
                    return true;
                }
            }
        }
    }
    return false;
}

examples of using the method

sameClass(x, y - 1, "Boulder", "Enemy", "Wall")
sameClass(x, y - 1, "Player")
like image 959
Stephen Fong Avatar asked Jun 03 '26 02:06

Stephen Fong


1 Answers

  1. You can send Collection to your method:
Set<String> params = new HashSet("Boulder", "Enemy", "Wall");  
boolean result = sameClass(x, y - 1, params);
  1. You can use Builder-like pattern:
boolean result = new Checker(x, y - 1)
  .param("Boulder")
  .param("Enemy")
  .param("Wall")
  .check();

Also, if "Boulder", "Enemy", "Wall" are class of unit, it's better to use Enum instead of strings.

=== Example of possible solution ===

public class Checker {

    private int x;
    private int y;
    private Set<Type> params = new HashSet();

    // Entity related code here

    public Checker(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public Checker param(Type type) {
        this.params.add(type);
        return this;
    }

    public boolean check() {
        for (Entity entity : entities) {
            if (entity.getX() == x && entity.getY() == y) {
                return params.contains(entity.getType());
            }
        }
        return false;
    }

    public enum Type {
        BOULDER,
        ENEMY,
        WALL,
        PLAYER
    }
}
like image 174
Bor Laze Avatar answered Jun 05 '26 00:06

Bor Laze



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!