Creazione di un sistema di gestione magazzino / magazzino, con più posizioni per ciascun articolo

3

Sto creando un WMS con i seguenti requisiti di base:

  1. Ogni elemento può trovarsi in più posizione s.
  2. Una posizione può contenere più elementi .
  3. Per ciascuna combinazione Località / elemento , devo essere in grado di tenere traccia di: QtyOnHand , QtyReserved e QtyAvailable .
  4. Una posizione può contenere un'altra posizione .

Il comportamento di base richiesto per una posizione è:

  1. Aggiunta / rimozione di un elemento con una quantità .
  2. Aggiunta / rimozione di una posizione nidificata
  3. Tracciamento delle quantità per ciascun elemento all'interno della posizione .

Sto tentando di scrivere il codice rimanendo fedele ai principi di progettazione OOP, ovvero:

  1. Progettare interfacce di classe per riflettere comportamento anziché dati .
  2. Evita Getter / setter s.
  3. Dillo, non chiedere , il più possibile.

Con questo in mente, ecco il codice di base per una posizione:

public class Location{

    private final Map<InventoryItem, Integer> items = new HashMap<>();
    private final Set<Location> locations = new HashSet<>();

    public void add(InventoryItem item, int quantity) {
         if (items.containsKey(item)) {
             InventoryQuantity inventoryQuantity = items.get(item);
             items.put(item, inventoryQuantity.addQuantityOnHand(quantity));
         } else {
             items.put(item, quantity);
         }
    }

    public void add(Location location) {
        locations.add(location);
    }

    public void remove(InventoryItem item, int quantity) {
        if (items.keySet().contains(item)) {
            if ((items.get(item) - quantity) == 0) {
                items.remove(item);
            } else {
                items.put(item, items.get(item) - quantity);
            }
        }
    }

    public void remove(Location location) {
        locators.remove(location);
    }

}

Quindi ora che ho il comportamento di base per l'aggiunta / rimozione, sto avendo difficoltà a capire quale sarebbe il modo migliore per tenere traccia della quantità. Potrei creare una classe InventoryQuantity , come segue:

 public class InventoryQuantity {

    private InventoryItem item;

    private int quantityOnHand;

    private int quantityReserved;

    private int quantityAvailable;

    public InventoryItem getItem() {
        return item;
    }

    public void setItem(InventoryItem item) {
        this.item = item;
    }

    public int getQuantityOnHand() {
        return quantityOnHand;
    }

    public void setQuantityOnHand(int quantityOnHand) {
        this.quantityOnHand = quantityOnHand;
    }

    public int getQuantityReserved() {
        return quantityReserved;
    }

    public void setQuantityReserved(int quantityReserved) {
        this.quantityReserved = quantityReserved;
    }

    public int getQuantityAvailable() {
        return quantityAvailable;
    }

    public void setQuantityAvailable(int quantityAvailable) {
        this.quantityAvailable = quantityAvailable;
    }
}

e memorizza uno InventoryQuantity per ogni InventoryItem in Location , in questo modo:

private final Map<InventoryItem, InventoryQuantity> items = new HashMap<>();

Le mie domande / problemi sono le seguenti:

  1. InventoryQuantity non sembra essere un oggetto reale con un definito comportamento ; piuttosto, sembra essere una struttura dati con l'unico scopo di memorizzare quantità dati (come evidenziato dall'esistenza di Getter / Setter); c'è un modo migliore?
  2. Chiedi una posizione a getQuantityOnHandForItem (elemento) una violazione di Dillo, non chiedere ? D'altra parte, non sembra esserci un modo migliore per recuperare i dati ...

In realtà avevo altre domande, ma questo è quello che ricordo al momento. Se qualcuno può aiutarmi a capire / applicare efficacemente i principi, lo apprezzerei molto!

    
posta IntelliData 15.02.2017 - 17:54
fonte

1 risposta

2

Avrebbe senso nel tuo sistema avere una classe come questa:

public class QuantifiedInventoryItem extends InventoryItem
{
    private int quantityOnHand;

    private int quantityReserved;

    private int quantityAvailable;

    /* getters and setters for fields above, if necessary */
}

Sono d'accordo che sembra un piccolo strano avere un oggetto come InventoryQuantity come lo hai sopra. Non ha alcun comportamento e non si associa ad un oggetto reale.

Un quantificato InventoryItem può mappare su un oggetto del mondo reale (beh, mappa meglio di InventoryQuantity ): un articolo di inventario con quantità note, forse anche in luoghi specifici.

Per quanto riguarda:

Is asking a location to getQuantityOnHandForItem(item) a violation of Tell, don't Ask?

No, non penso che sia una violazione. Penso che "Tell, Do not Ask" si riferisce più a situazioni in cui si ha una logica complessa che dipende dallo stato interno di un oggetto, e tale stato è accessibile tramite molti getter. Il pricincipio si riferisce allo spostamento di quella logica / comportamento in dell'oggetto, poiché è lì che risiedono i dati che lo guidano.

Nel caso di getQuantityOnHandForItem , non stai chiedendo del comportamento specifico guidato da questa funzione, quindi la semplice esistenza della funzione non è probabilmente un problema. Se disponi di un insieme di istruzioni logiche che chiamano costantemente getter di Location , potrebbe valere la pena considerare di rifare la logica a una nuova funzione entro Location .

Vedi: link

    
risposta data 15.02.2017 - 18:24
fonte

Leggi altre domande sui tag