Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Gestione ordini di un ristorante
Forum - Java - Gestione ordini di un ristorante

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
WildBlood (Normal User)
Rookie


Messaggi: 58
Iscritto: 17/02/2015

Segnala al moderatore
Postato alle 15:14
Martedì, 03/01/2017
Salve a tutti e buon inizio anno, vorrei avere un consiglio per quanto riguarda lo sviluppo di un software per la gestione di ordini in un ristorante. Nella traccia che mi è stata consegnata mi si chiede di utilizzare almeno due design pattern noti. In pratica abbiamo i seguenti requisiti:
1. Abbiamo n camerieri e m tavoli, che sono identificati con codice univoco,
2. Ogni cameriere prende la ordinazioni e le manda al reparto cucina o a quello delle bevande, in base a ciò che è stato ordinato,
3. I prodotti tutti sono divisi per categorie,
4. Ci sono due tipi di utente: Cameriere e Amministratore, che possiedono privilegi diversi,
5. Bisogna simulare anche i tempi per la preparazione di un ordine.

Voi quali Design Pattern usereste ? Ringrazio anticipatamente tutti quelli che risponderanno.
Inoltre, se avete consigli di altro genere su come sviluppare l'applicazione, ovviamente sono ben accetti.

PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 17:12
Martedì, 03/01/2017
Posta così la domanda la prima risposta che mi viene in mente è: un "Observer" e un "Chain of Responsibility", ma sarebbero riduttivi, volendo si possono utilizzare almeno una decina di pattern.
Il mio consiglio è: prendi carta e penna (o quello che sei più comodo) e inizia a fare uno schema di come strutturare il tuo software, scrivi le classi e come interagiscono tra di loro e vedrai che i pattern vengono fuori da soli.      
G.


Ibis redibis non morieris in bello
PM Quote
Avatar
WildBlood (Normal User)
Rookie


Messaggi: 58
Iscritto: 17/02/2015

Segnala al moderatore
Postato alle 17:26
Martedì, 03/01/2017
Testo quotato

Postato originariamente da Goblin:

Posta così la domanda la prima risposta che mi viene in mente è: un "Observer" e un "Chain of Responsibility", ma sarebbero riduttivi, volendo si possono utilizzare almeno una decina di pattern.
Il mio consiglio è: prendi carta e penna (o quello che sei più comodo) e inizia a fare uno schema di come strutturare il tuo software, scrivi le classi e come interagiscono tra di loro e vedrai che i pattern vengono fuori da soli.      
G.



Grazie mille, farò così come dici. Inoltre, dovrei usare o un database, oppure dei file, per la gestione dei camerieri, dei tavoli e dei prodotti. Io avevo pensato di utilizzare un database, in particolare MySQL, andrebbe bene ? Inoltre, la connessione ad un Database va bene solamente per applicazioni web oppure anche per applicazioni standalone ?

Ultima modifica effettuata da WildBlood il 03/01/2017 alle 17:33
PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 22:28
Martedì, 03/01/2017
Per quanto riguarda MySQL in versione Embedded (StandAlone) non so se hanno continuato lo sviluppo, ma basta dare uno squardo nel sito ufficiale https://www.mysql.it/.
Una precisazione, MySQL è un server DBMS SQL e può essere usato per qualsiasi tipo di applicazione, basta installare il server e i driver per la connessione usata; dunque se vuoi usare MySQL installi il server e poi con Java, C++, Delphi, C# o quello che vuoi, ti connetti e usi la base dati SQL che MySQL ti mette a disposizione come meglio credi.
A questo punto mi sorge spontanea una domanda, ma il tuo software come evolve ? Nel senso, è solo un esercizio didattico e/o accademico per implementare i design pattern, oppure potrebbe essere visto in modo più amplio ?
Nel primo caso io, personalmente, farei solo delle classi persistenti di dati che non hanno nessuna base (al massimo dei file di testo per inizializzare un minimo di magazzino), e mi focalizzerei più sulla gestione dello scambio informazioni tra clienti-camerieri-cuochi.
Se invece hai intenzione di costruire un software che oltre un esercizio accademico ha anche uno sviluppo concreto e con i vari crismi MCV e designer pattern, allora puoi iniziare a pensare ad una base dati solida (MySQl, SQL-Server, ... altro ..), e a questo punto il giochino si fa interessante, ci vuole una vera e propria pianificazione e programmazione del lavoro e un attenta gestione nella costruzione di interfacce e classi.
G.


Ibis redibis non morieris in bello
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 22:36
Martedì, 03/01/2017
Se è solo un programma didattico sqlite è molto più indolore di mysql, salva il database in un file e non devi perdere tempo a configurare un server sql, che non è una gran difficoltà ma visto che hai già altri problemi a cui pensare...

PM Quote
Avatar
WildBlood (Normal User)
Rookie


Messaggi: 58
Iscritto: 17/02/2015

Segnala al moderatore
Postato alle 23:24
Martedì, 03/01/2017
Testo quotato

Postato originariamente da WildBlood:

Testo quotato

Postato originariamente da Goblin:

Posta così la domanda la prima risposta che mi viene in mente è: un "Observer" e un "Chain of Responsibility", ma sarebbero riduttivi, volendo si possono utilizzare almeno una decina di pattern.
Il mio consiglio è: prendi carta e penna (o quello che sei più comodo) e inizia a fare uno schema di come strutturare il tuo software, scrivi le classi e come interagiscono tra di loro e vedrai che i pattern vengono fuori da soli.      
G.



Grazie mille, farò così come dici. Inoltre, dovrei usare o un database, oppure dei file, per la gestione dei camerieri, dei tavoli e dei prodotti. Io avevo pensato di utilizzare un database, in particolare MySQL, andrebbe bene ? Inoltre, la connessione ad un Database va bene solamente per applicazioni web oppure anche per applicazioni standalone ?  



In pratica è un progetto d'esame, quindi non so, mi consigliate di usare un file di testo per immagazzinare le informazioni oppure di usare sqlite (che a quanto ho capito, è comunque un file di testo) ?
Per quanto riguarda lo scambio di informazioni tra clienti-camerieri-cuoco come lo implementereste ?
Inoltre, dovrei a questo punto sviluppare una classe per "cliente".

PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 0:09
Mercoledì, 04/01/2017
mmm forse mi sono spiegato male, mi scuso, forse ho usato una terminologia errata..... allora..
io ho detto di usare delle classi persistenti, ossia classi che leggono le informazioni da un db (business-logic), in questo caso, da un file di testo e dunque usarle in maniera unidirezionale e non bidirezionale, ossia non salvano niente, ti servono solo per implementare la business-logic, lumo ha detto di usare SQLite al posto di MySQL, il quale è si un file di "testo", ma con la potenza delle query SQL, dunque di implementare la business-logic con le classi persistenti con SQLite.
Per lo scambio di informazioni, esiste appunto un design pattern "Observer", il quale è delegato alla notifica dello scambio di informazioni, questo in accoppiata al pattern "Chain of Responsibility" dovrebbe fare quello che chiedi, l'implementazione, mi spiace ma con java non vado molto d'accordo ... passo la palla.
G.


Ibis redibis non morieris in bello
PM Quote
Avatar
WildBlood (Normal User)
Rookie


Messaggi: 58
Iscritto: 17/02/2015

Segnala al moderatore
Postato alle 0:45
Mercoledì, 04/01/2017
Testo quotato

Postato originariamente da Goblin:

mmm forse mi sono spiegato male, mi scuso, forse ho usato una terminologia errata..... allora..
io ho detto di usare delle classi persistenti, ossia classi che leggono le informazioni da un db (business-logic), in questo caso, da un file di testo e dunque usarle in maniera unidirezionale e non bidirezionale, ossia non salvano niente, ti servono solo per implementare la business-logic, lumo ha detto di usare SQLite al posto di MySQL, il quale è si un file di "testo", ma con la potenza delle query SQL, dunque di implementare la business-logic con le classi persistenti con SQLite.
Per lo scambio di informazioni, esiste appunto un design pattern "Observer", il quale è delegato alla notifica dello scambio di informazioni, questo in accoppiata al pattern "Chain of Responsibility" dovrebbe fare quello che chiedi, l'implementazione, mi spiace ma con java non vado molto d'accordo ... passo la palla.
G.  



Assolutamente, non volevo il codice Java (sarebbe stato come barare :rotfl: ), in ogni caso capisco cosa intendi, nel frattempo che attendevo la risposta, l'h sviluppato con MySQL, e questo è il codice che ne è venuto fuori per la classe popolaCamerieri:

Codice sorgente - presumibilmente Java

  1. package damariomain;
  2.  
  3. import java.sql.*;
  4.  
  5. public class popolaCamerieri {
  6.     public void aggiungiCameriere(int codiceCameriere) {
  7.         Connection conn = null;
  8.         Statement stmt = null;
  9.        
  10.         try {
  11.             Class.forName(JDBC_DRIVER);
  12.            
  13.             // Connessione al database.
  14.             System.out.println("Connessione al database..");
  15.             conn = DriverManager.getConnection(DB_URL, USER, PASS);
  16.             System.out.println("Connessione riuscita..");
  17.            
  18.             System.out.println("Inserimento dei dati..");
  19.             stmt = conn.createStatement();
  20.            
  21.             // Inserimento dei dati.
  22.             String sql = "INSERT INTO camerieri " + "VALUES (" + codiceCameriere + ")";
  23.             stmt.executeUpdate(sql);
  24.             System.out.println("Operazione eseguita con successo..");
  25.         } catch (SQLException  se) {
  26.             se.printStackTrace();
  27.         } catch (Exception e) {
  28.             e.printStackTrace();
  29.         } finally {
  30.             try {
  31.                 if (stmt != null) {
  32.                     conn.close();
  33.                 }
  34.             } catch (SQLException se) {}
  35.            
  36.             try {
  37.                 if (conn != null) {
  38.                     conn.close();
  39.                 }
  40.             } catch (SQLException se) {
  41.                 se.printStackTrace();
  42.             }
  43.         }
  44.     }
  45.    
  46.     static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
  47.     static final String DB_URL = "jdbc:mysql://localhost/daMario";
  48.     static final String USER = "root";
  49.     static final String PASS = "rootpassword";
  50. }



La cosa che non riesco a fare, ma che vorrei fare è delegare la connessione al database ad un'altra classe, solo che non mi riesce.

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 16:32
Mercoledì, 04/01/2017
Visto che probabilmente hai studiato i design pattern, uno che puoi usare per rappresentare la connessione è un singleton che per tutta la durata del programma mantenga aperta la connessione al database (quindi mantiene quella variabile conn e le altre riguardanti alle credenziali al suo interno).
Altrimenti crei l'oggetto connessione nel main del tuo programma e poi lo rendi un parametro del costruttore di tutte le classi che lo richiedono. Questo è molto migliore di un singleton perché così le dipendenze sono esplicite nel codice, eventualmente permette di fare mock testing.

In ogni caso il tuo codice è vulnerabile a SQL injection, se fosse un servizio esposto via web sarebbe un bel problema.

In ogni caso ho letto la traccia e non mi è del tutto chiaro quello che devi fare. Suppongo che il software debba avere due interfacce, una usata dai camerieri per vedere quali ordini sono stati mandati, magari quanto tempo serve al loro completamento in base alla categoria dei prodotti nell'ordine (?) e così via.
Se fosse un sistema vero però servirebbe anche un'interfaccia visibile alla cucina. Se per semplicità assumiamo che gli ordini vengano sempre accettati appena ricevuti e abbiano un tempo esatto di svolgimento, l'interfaccia è inutile perché il comportamento dei cuoci è deterministico ed è sufficiente la parte dei camerieri.
Se invece si vuole simulare in modo più veritiero il tutto, man mano che si accumulano gli ordini, gli ultimi andrebbero messo "in attesa" perché è possibile fare solo un numero massimo di preparazioni in un certo tempo.
In questo caso l'interfaccia per la cucina serve, perché il cuoco segnala ai camerieri se l'ordine è stato preso oppure no. Volendo, si può anche rilassare il determinismo e simulare un tempo random per la preparazione, in quel caso serve anche un modo per dire quando l'ordine è pronto e deve essere azionato dalla cucina.

Non mi è chiaro che ruolo abbiano l'amministratore e la categoria dei prodotti.

Considerato il tutto comunque, non penso valga la pena utilizzare un database, siccome non hai bisogno di fare query complesse sui dati ma sempicemente inserirli o rimuoverli (per quanto riguarda la coda degli oridini). Userei alcuni file di testo con un formato semplice in cui a ogni riga corrisponde una informazione.

Inoltre, hai scritto una classe per popolare il database però nella traccia non è chiaro se i camerieri e le categorie siano già presenti nel database (caso in cui puoi inserirle tu manualmente, ad esempio in dei file come dicevo prima). Semplificherebbe notevolmente il lavoro, anche perché come vedi hai già una sql injection nelle prime righe di codice che hai scritto :P

Ultima modifica effettuata da lumo il 04/01/2017 alle 16:34
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo