Un oggetto comunica con un altro oggetto

-1

I chiesto simile domanda stamattina, e per qualsiasi motivo, non ricevo una risposta completa alla mia domanda. Lo chiederò in un modo diverso.

Stavo cercando di capire la serie di blog di Eric Lippert Wizard and Warriors e vedi le difficoltà che possono capitare quando cerchi di usare il sistema di tipi per codificare le regole di un gioco.

Supponiamo che abbia una classe Weapon e una classe Character .

public abstract class Weapon 
{
    private String name;
    private int damage;

    public abstract void attack(Character character)
} 


 public abstract class Character
 {
     public final boolean tryCarry(Weapon weapon)
     {
         // code to try and add weapon to player inventory. 
     }
 }

Nella mia domanda collegata ho chiesto di utilizzare un enum o un insieme di enums che sono attributi che descrivono un Weapon , quindi ad esempio, un Sword potrebbe avere LongBlade e Destructable come attributi e l'oggetto Character può interrogare tale raccolta per determinare se il Weapon può essere aggiunto all'inventario del giocatore, purché soddisfi determinati requisiti.

Quindi un'implementazione potrebbe essere simile a questa:

public final boolean tryCarry(Weapon weapon)
{
   if !(weapon.containsAttribute(GameObjectAttribute.LongBlade))
   {
       // add weapon to inventory
   } 
}

Come suggeriscono le risposte, questo complica il problema.

Il blog suggerisce l'uso di una classe Rule . La mia domanda collegata suggerisce un metodo tryCarry(Weapon weapon) .

Forse non capisco appieno la serie di blog (e se non lo faccio, qualcuno può fornire maggiori dettagli?) ma non riesco a vederlo in nessun altro modo.

Per come la capisco, devi comunicare con la classe Rule o Player per determinare quale percentuale diWeapon hai e se può essere aggiunto. come lo faresti? Per me comunque, un valore, se è un string o enum , deve essere memorizzato da qualche parte per indicare esattamente quale arma stai cercando di aggiungere.

    
posta 02.10.2018 - 03:38
fonte

1 risposta

1

Segui il principio "tell, do not ask".

Se vuoi che un personaggio raccolga un'arma, chiama tryCarry per dire loro di prenderlo. Se non possono, lo segnaleranno di nuovo.

Ogni classe (oggetto di ogni) dovrebbe sapere cosa è in grado di fare e dovrebbe avere metodi per farlo. Quindi se vuoi che faccia qualcosa, dillo. Se a volte non può farlo, assicurati di progettare il metodo con una risposta di stato.

Se ci sono regole da controllare, allora ogni personaggio dovrebbe sapere quali regole si applicano a loro. Pertanto, la verifica della regola dovrebbe far parte del metodo tryCarry. Qualsiasi regola verrebbe inizializzata nel costruttore.

Dì al personaggio che cosa raccogliere passando un riferimento all'oggetto che desideri raccogliere. Non inventare altre stringhe o enigmi in quanto ciò complica le cose.

    
risposta data 02.10.2018 - 10:45
fonte

Leggi altre domande sui tag