Stavo leggendo il blog di Eric Lippert su Wizard and Warriors .
Suggerisce la creazione di una classe Rules
, citazione:
We keep on talking about “rules”, and so apparently the business domain of this program includes something called a “rule”, and those rules interact with all the other objects in the business domain. So then should “rule” be a class? I don’t see why not!
Le regole :
- Un guerriero può usare solo una spada.
- Una procedura guidata può utilizzare solo uno staff.
Forse non ci sto pensando nel modo giusto, ma suppongo di avere la seguente classe GameRules
:
public final class GameRules {
public static boolean verifyifwizardcancarry(Weapon weapon){
boolean canCarry = false
if weapon is a a staff set canCarry to true
return canCarry;
}
}
e Player
:
public abstract class Player{
private List<Weapon> weapons;
public abstract void add(Weapon weapon);
}
public final class Wizard extends Player{
@Override
public void add(Weapon weapon){
if(GameRules.verifyifwizardcancarry(weapon){
// - code to add weapon to inventory
}
}
}
Il rifiuto di una base di armi sul tipo (indipendentemente da dove è posizionata la logica) viola LSP ?
Nel mio metodo add(Weapon weapon)
prometto che accetterò un'arma di qualsiasi tipo, quindi respingerla in base al tipo è una violazione di LSP, corretto? In tal caso, come imporrebbe le regole di cui sopra?