2016-04-08 3 views
3

Während ich schreibe Generic RPG Number 3,742, habe ich eine Klasse für Items und Inventory implementiert. Konzeptionell und Item ist ein bestimmtes Element. Ich wollte einen Weg, Gegenstände zu "stapeln", so dass ich nur 1 Eintrag in Inventory für jede Art von Item hätte.Potenziell nutzloses Objekt

Um dies zu tun, habe ich eine Item Wrapper, die eine privateItem und Number of Items hat. Es hat auch ein paar Methoden, um das Gesamtgewicht aller dieser Items, etc. zu bekommen

Das Problem kommt, wie ich auf diese erweitern. Ich finde, dass ich fast jede Item Methode in meiner Item Wrapper Klasse duplizieren möchte. Die Alternative ist, die Itempublic machen und sich darauf beziehen in der Inventory Klasse, die sich genauso schlecht anfühlt.

Ist das ein Zeichen, dass Item Wrapper nicht existieren sollte? Dies erzeugt Probleme mit entweder doppelten Elementen in Inventory oder dem Konzept Item s, das singulär ist. Ich denke, es gibt wahrscheinlich eine bessere Lösung, aber ich kann es nicht finden.

EDIT: Hinzufügen weiterer Klärung der aktuellen Klassenstruktur.

Player_Character hat eine private Inventory.

Inventory hat eine private [mumble] Vector von Item Wrapper s.

Item Wrapper hatte eine private Item und private int "how_many".

Beachten Sie die "hatte." Wie ich auf Inventory erweitert habe, habe ich bemerkt, dass ich Item_Name oder andere Dinge, die spezifisch für Item sind. Wenn ich mein Design nicht ändere, kopiere ich entweder alle Get Funktionen in Item in Item Wrapper oder mache Item öffentlich (in Item Wrapper).

+1

haben Sie eine Sammlung von 'Item's? Ein "Wrapper" umschließt typischerweise eine einzelne Instanz, genau wie Süßigkeiten. – maasg

+0

Die Darstellung von Item-Methoden in einem Wrapper macht für mich keinen Sinn. Eine Sammlung von Gegenständen ist kein Gegenstand. –

Antwort

4

Ich denke, Sie machen das Problem komplexer, als es sein muss. Sie könnten das Problem vereinfachen, indem Sie ein quantity Feld zu Item hinzufügen und eine Methode zur Berechnung des Gesamtgewichts mit quantity und weight bereitstellen. Ihre ItemWrapper fügt nichts hinzu, was ein zusätzliches Feld und eine Methode nicht tun können.

+0

Wenn Sie Gruppen von Elementen als ein einzelnes Objekt behandeln möchten, ist der 'ItemWrapper'-Typ nützlich (siehe meine frühere Antwort). –

+0

@GregBrown Ich denke, ein anderer Teil der Frage ist "Ist das Konzept eines einzelnen Artikels nützlich? Könnte es leicht durch 'einen oder mehrere Artikel ersetzt werden?'" – RowlandB

+1

@RowlandB Ich habe mir deine ursprüngliche Frage genauer angeschaut. Es erscheint mir komisch, einen öffentlichen 'ItemWrapper'-Typ zu haben, aber einen privaten' Item'-Typ. Wenn Sie wirklich nur den Typ eines Artikels und eine zugehörige Menge speichern müssen, dann könnten Sie vielleicht einfach eine Karte von Typ zu Menge verwenden, wobei der Kartenschlüssel der Artikeltyp ist. Der Kartenwert wäre die Anzahl der Artikel dieses Typs. –

5

Ihr ItemWrapper Typ klingt wie es könnte ein Beispiel für eine composite, die ein sehr häufiges Design-Muster ist. Wenn dem so wäre, würde ich es nicht als überflüssig oder nutzlos betrachten.

+0

Würde jemand die downvotes erklären? –

+0

Der Link, den Sie geteilt haben, spricht über 'Tree Structures', was nicht wirklich das ist, wonach ich suche. Muss das zusammengesetzte Designmuster ein 'Baum' sein? – RowlandB

1

Was du beschreibst schreit mir etwas ein, wie ein Map sehr gut tut. Warum haben Sie nicht eine Inventory Implementierung etwas wie folgt;

public class Inventory { 

private static final int MAX_SIZE = 10; 

private final Map<Type, List<Item>> inventoryItems = new HashMap<Type, List<Item>>(); 

// Keep track of the total number of items in the inventory 
private int totalSize; 

public void add(Item item) { 

    // If the total size is greater than the max then don't allow the operation... 
    if(totalSize == MAX_SIZE){  
     throw new IllegalStateException("Exceeded maximum size"); 
    } 

    if (!inventoryItems.containsKey(item.getType())) { 
     inventoryItems.put(item.getType(), new ArrayList<Item>()); 
    } 

    inventoryItems.get(item.getType()).add(item); 

    totalSize++; 
} 

public List<Item> getItems(Type type) { 
    return inventoryItems.get(type); 
} 

public int getTotalWeight() { 

    int total = 0; 

    for (List<Item> items : inventoryItems.values()) { 
     total += calculateTotalWeight(items); 
    } 

    return total; 
} 

public int getTotalWeightByType(Type type) { 
    return calculateTotalWeight(inventoryItems.get(type)); 
} 

private int calculateTotalWeight(List<Item> items) { 
    int total = 0; 

    for (Item item : items) { 
     total += item.getWeight(); 
    } 

    return total; 
} 

public void remove(Item item) { 
    // Remove the item from inventoryItems and decrement the count 
    totalSize--; 
} 

} 

Entfernt die Notwendigkeit für Ihre ItemWrapper Klasse.

Sie hätten dann eine Character Klasse, die etwas in Richtung ...

public class Character { 

private final String name; 

... // Any other fields 

private final Inventory inventory; 

public Character(String name) { 
    this.name = name; 
    this.inventory = new Inventory(); 
} 

... 

public void addToInventory(Item item) { 
    inventory.add(item); 
} 

public List<Item> getItemsByType(Type type) { 
    return inventory.getItems(type); 
} 

public void removeFromInventory(Item item) { 
    inventory.remove(item); 
} 

... 

} 

HINWEIS: Sie erwähnen, dass Sie Vector verwenden, die den Aufwand für die Synchronisation auf jedem Betrieb hat (wahrscheinlich nicht notwendig). Ich sehe wirklich kein Problem mit Ihnen mit einem Map ...

+0

Was gibt mir die Verwendung einer 'Map'? Der Punkt von "Item Wrapper" ist es, einfaches Zählen, aber auch Platz zu sparen (sowohl konzeptionell als auch rechnerisch). Diese Lösung hilft nicht unbedingt rechnerisch - ist das im modernen Computing kein Problem? – RowlandB

+1

@RowlandB Ich habe das Gefühl, dass Sie Ihr Problem übermäßig komplizieren. – kstandell

+0

Ich bin nur nicht vertraut mit 'Map', also versuche ich (hah!) Meinen Kopf um sie herum zu wickeln, bevor ich irgendetwas akzeptiere. – RowlandB

Verwandte Themen