Narek
Narek

Reputation: 39881

How to understand if a property is a member of a class or I have to create a different class that holds it?

Sometimes when you create a class you can add there several properties (new data members) that you are not certain if you want to do or not. For example, I have a casino slots game. I have tiles and tiles are spinning on different reels. So once 3 tiles come on the same line then player wins 3$, 4 tiles - 4$ and 5 tiles - 5$ for tile A and for tile B player wins 5$, 10$, 20$ accordingly. Should, for example, each tile store the data of its reward or there should be a reward manager for checking how many tiles are consecutive next to each other to give the reward to the player?

Please note that I don't want to have such a situation. But I find me many times thinking "Should I add this data, and consequently, corresponding logic the my class or not?". I worry about single responsibility principle when I want to have different managers for such things, but on the other hand I came to a situation to create several singletons or singleton-like classes.

Upvotes: 1

Views: 31

Answers (1)

Henrique Barcelos
Henrique Barcelos

Reputation: 7900

Well, this sounds a lot like a use case for the Strategy Pattern.

As far as I am concerned (never been to a casino, since they're prohibited here in my country), most of slot machines work the same way.

So, you might think of one implementation as (pseudo-java code):

class Figure {
    private String representation;
}

class Slot {
   private Set<Figure> figures;
   public Figure getRandom() {
       // retrieve random figure from a slot
   }
}

interface IRewardStrategy {
    public int getReward(SlotMachine machine);
}

class OneFoldRewardStrategy implements IRewardStrategy {
    public int getReward(SlotMachine machine) {
        return machine.getCurrentLinedSlotsCount();
    }
}

class TenFoldRewardStrategy implements IRewardStrategy {
    public int getReward(SlotMachine machine) {
        return 10 * machine.getCurrentLinedSlotsCount();
    }
}

class SlotMachine {
    private int slotCount;
    private List<Slot> slots;
    private List<Figure> currentRollResult;
    private IRewardStrategy rs;

    public SlotMachine(List<Slot> slots, IRewardStrategy rs) {
        this.slots = slots;
        this.rs = rs;
    }

    public void roll() {
        // For each slot, get random figure
    }

    public int getTotalSlots() {
        return slotCount;
    }

    public int getCurrentLinedSlotsCount() {
        // Iterates over the current roll result and get the number of lined slots
    }

    public int getReward() {
        this.rs.getReward(this); // delegates to the reward strategy
    }
}

// Usage

SlotMachine machine = new SlotMachine(..., new TenFoldRewardStrategy());
machine.roll(); // suppose this give 3 slots in a row...
print(machine.getReward()); // This will yield 30

Attention: This is a very bare code, just to give you an idea, it has several problems.

Upvotes: 1

Related Questions