Diciamo che abbiamo una classe con molti metodi che fanno qualcosa di diverso ma possono essere raggruppati insieme come un "tipo di funzionalità". Ad esempio, aggiungendo una configurazione o impostando le regole.
Andiamo con l'esempio delle regole. Diciamo che abbiamo una classe che modella un gioco da tavolo, e abbiamo aggiunto regole diverse, quindi quando il gioco è giocato le regole sono garantite:
public class Game {
private RuleManager ruleManager;
// etc...
public Game() {
ruleManager = new RuleManager(this);
setupGameRules();
// etc...
}
private setupGameRules() {
if (players.size() == 1)
setupSinglePlayerRule();
else
setupMultiplePlayerRule();
setupNumberOfTurnsRule();
setupScoreRule();
}
private void setupSinglePlayerRule() { /*...*/ }
private void setupMultiplePlayerRule() { /*...*/ }
private void setupNumberOfTurnsRule() { /*...*/ }
private void setupScoreRule() { /*...*/ }
}
Questo è solo un esempio che mi è appena venuto in mente. Il modello attuale è qualcosa di diverso ma troppo difficile da spiegare qui. L'idea e la struttura, tuttavia, sono le stesse che nell'esempio.
Vorrei estrarre tutti quei metodi setupXRule()
in qualche modo in unità, in termini di design. Motivi:
- Rende il codice più chiaro
- Le regole del gioco non sono fisse e "hardcoded" nella classe di gioco
- È possibile aggiungere ulteriori regole. Ecco cosa intendevo con generalizzazione. Vorrei che qualsiasi altro programmatore utilizzi questa classe per definire le proprie regole e impostarle sul gioco.
Quale sarebbe l'approccio migliore?
Aggiornamento: ho pensato a questo progetto:
public abstract class GameRule {
protected Game game;
protected RulesManager rulesManager;
protected Rule[] rules;
public GameRule(Game g) {
game = g;
rulesManager = g.getRulesManager();
}
// Sets up the rule
protected abstract void build();
// Posts the rule to the game, so when it's played the rule is enforced
public void post() {
if (rules == null)
throw new IllegalStateException("The rules have not beein initialized yet.");
rulesManager.post(rules);
}
}
E poi abbiamo regole diverse:
public class SinglePlayerRule extends GameRule {
public SinglePlayerRule(Game g) {
super(g);
build();
}
protected void build() {
// sets up the rule using the rule manager internal operation to handle and manage rules
}
}