2013-05-06 15 views
16

Il mio progetto java richiedeva di creare una matrice di oggetti (elementi), compilare la matrice di elementi e quindi creare un metodo principale che chiede a un utente di immettere il codice articolo che restituisce l'elemento corrispondente.Consigli sul programma Java

ci ho messo un po 'per capire, ma ho finito per "barare" utilizzando una variabile pubblicaper evitare abbagliante/riferimento l'oggetto tra le classi.

Per favore aiutatemi a restituire correttamente l'oggetto.

Questa è la classe con la maggior parte dei miei metodi tra cui inserire e la trovare metodo.

public class Catalog { 
    private Item[] itemlist; 
    private int size; 
    private int nextInsert; 
    public Item queriedItem; 

    public Catalog (int max) { 

     itemlist = new Item[max]; 
     size = 0; 
    } 
    public void insert (Item item) { 
     itemlist[nextInsert] = item; 
     ++nextInsert; 
     ++size; 
    } 
    public Item find (int key) { 
     queriedItem = null; 

     for (int posn = 0; posn < size; ++posn) { 
      if (itemlist[posn].getKey() == key) queriedItem = itemlist[posn]; 
     }{ 
      return queriedItem; 
     } 
    } 
} 

Questa è la mia classe principale:

import java.util.*; 

public class Program { 
    public static void main (String[] args) { 

     Scanner kbd = new Scanner (System.in); 
     Catalog store; 
     int key = 1; 

     store = new Catalog (8); 
     store.insert(new Item(10, "food", 2.00)); 
     store.insert(new Item(20, "drink", 1.00)); 



     while (key != 0) { 

      System.out.printf("Item number (0 to quit) ?%n"); 
      key = kbd.nextInt(); 
      if (key == 0) { 
       System.out.printf("Exiting program now!"); 
       System.exit(0); 
      } 

      store.find(key); 

      if (store.queriedItem != null) { 
       store.queriedItem.print(); 
      } 
      else System.out.printf("No Item found for %d%n", key); 

     } 
    } 
} 

Grazie Apprezzo l'aiuto !!!!!!

+7

+1 per ammettere che è per una classe –

+6

+1 per voler imparare e non solo ottenere una risposta. – SomeShinyObject

+1

è possibile aggiungere un metodo 'printQueriedItem' alla classe Catalog, che eseguirà il controllo nullo e stamperà. – assylias

risposta

11

store.find(key); restituisce un Item si dovrebbe usare ed eliminare il campo pubblico da Catalog

public Item find (int key) { 
    Item queriedItem = null; 
    //.... 
} 

Item searched = store.find(key); 

if (searched != null) 
    searched.print(); 
else 
    System.out.printf("No Item found for %d%n", key); 
9

Rimuovere l'utilizzo del queriedItem interamente e solo restituire l'articolo da find: Sostituire

 store.find(key); 

    if (store.queriedItem != null){store.queriedItem.print();}else System.out.printf("No Item found for %d%n", key); 

Con

Item foundItem = store.find(key); 
if (foundItem != null) { 
    foundItem.print(); 
} else System.out.printf("No Item found for %d%n", key); 
+0

Devo modificare il mio metodo FIND? –

+1

Una volta rimossa la definizione a livello di classe di queriedItem, sì - ma basta definirla all'interno di 'find'. – CPerkins

+0

Questa è la mia prima volta su Stackoverflow. Quest'ultimo consiglio era il risultato di un banale errore di denominazione da parte mia xD. –

-1

Beh, qui ci sono alcuni suggesetions (scegliere complessità a propria discrezione, ma tutti loro è altamente raccomandato):

  • Research Properties, ad esempio here. O XML. È possibile popolare l'array con i valori di un file di configurazione per una maggiore flessibilità.
  • Utilizzare constanst per i valori letterali nel codice (dove sono necessari).
  • Crea un'applicazione Application per inizializzare l'intera applicazione. Cose come questa devono essere separate dalla logica del tuo dominio.
  • Creare un'interfaccia UserInputProvider in modo da poter modificare facilmente il modo in cui l'input dell'utente viene letto senza influenzare nient'altro. Implementalo con una classe ConsoleInputProvider ad esempio.
  • In generale, provare a utilizzare le interfacce per tutto ciò che non è un oggetto dominio puro (qui, l'unico che si ha è probabilmente Item).
  • Cerca di mantenere i tuoi metodi il più corti possibile. Invece di fare molte cose in un metodo, invocate altri metodi (logica relativa al raggruppamento) chiamati appropriatamente per dire cosa sta facendo.
  • Se non ti è permesso di ingannare e utilizzare List o un Map, escogitare una propria implementazione di uno, separare la struttura dei dati e la gestione dalla logica rappresentata da Catalog (cioè Catalog a sua volta delegare a, per esempio, o Map.get metodo equivalente dell'implementazione della struttura dati)
  • Il tuo main dovrebbe semplicemente avere ApplicationFactory (o un framework IoC) per compilare e inizializzare l'applicazione, invocare il UserInputProvider (non dovrebbe conoscere l'esatta implementazione che sta utilizzando) per ottenere l'input dell'utente , convalidare e convertire i dati come richiesto, richiamare Catalog per trovare l'appropriato Item e quindi (in modo simile all'interfa di input ce) invia il risultato (i dati esatti che ha ottenuto, non una stringa o simili) ad alcune implementazioni di un'interfaccia SearchResultView che decide come visualizzare questo risultato (in questo caso sarà un'implementazione basata su console, che stampa una stringa che rappresenta il Item ottenuto).


In generale, maggiore è il livello di disaccoppiamento è possibile ottenere, meglio il programma sarà.

I Single Responsibility Principle afferma: "ogni classe dovrebbe avere una sola responsabilità, e che la responsabilità dovrebbe essere interamente incapsulati dalla classe". Questo vale anche per i metodi: dovrebbero avere uno e un solo compito ben definito senza effetti collaterali.

+3

Questo è inutilmente complesso per qualcuno che sta appena iniziando con la lingua. – AndyPerfect

+0

Sì amico, questa è chiaramente una domanda java 101. Grazie per la tua risposta lunga e dettagliata, ma è controproducente a causa del mio livello di competenze e di quello di persone che potrebbero trovarlo tramite Google. –

+1

@AndyPerfect Beh, non proprio. Ecco perché ho suggerito di "scegliere la complessità a tua discrezione". La sua modularità è una chiave per i poteri di Java. Inoltre, la domanda originariamente leggeva "come farlo bene". Questo è come farlo bene. – Powerslave