Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-06-2008, 14:26   #1
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
[Design] Qual è un design adatto per...

Non riesco a trovare un design "corretto" per gestire un protocollo di comunicazione con una cinquantina di comandi.
Ad ogni comando corrisponde un'azione, una modifica dello stato di qualche altro oggetto e una risposta.

Al momento c'è un Mediator in che si occupa di smistare le operazioni e di tenere uno stato centralizzato. La classe però è decisamente grossa ed ha almeno un metodo per ogni comando.

Ad esempio ho varie classi che singolarmente monitorano aspetti differenti del sistema, adesso sono istanziate dal Mediator che ne modifica i parametri a seconda del comando ricevuto.

Ho provato ad effettuare il refactoring usando il Factory, che sembra l'ideale in questo caso, la creazione dei comandi è alquanto agevole è ci vuole un attimo ad aggiungerne di nuovi.
Il mio problema è che con il factory non ho più un'entità che gestisca l'interscambio di informazioni e dovrei fare ricorso massivo ai singleton.
Se il singleton può andare bene per la classe che gestisce la comunicazione (tanto ce ne deve essere una sola), non mi piace assolutamente per tutto il resto.
E in alternativa dovrei modificare l'interfaccia per passare tutti i riferimenti di tutti i possibili oggetti manipolabili da un comando, che lo vedo come un obrobrio.

Insomma non riesco più a riunire ciò che il Factory ha diviso.

Qual è il design corretto da applicare in questi casi?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2008, 14:34   #2
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
mmmm...
non ho capito bene se è il tuo caso..
ma hai già provato ad applicare il Command Patern?
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2008, 15:19   #3
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
mmmm...
non ho capito bene se è il tuo caso..
ma hai già provato ad applicare il Command Patern?
Beh tramite il Factory creo un Command.
Poi però mi manca il modo con cui fare interagire i Command tra di loro e con altri oggetti.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2008, 16:09   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Scusa, ma i command li dovresti istanziare una sola volta per tutta l'applicazione ed in base ad un valore intero ricevuto (l'azione indicata nel pacchetto) dovresti scegliere un command da eseguire. I command dovrebbero essere implementati come method object.

Ultima modifica di cionci : 24-06-2008 alle 16:12.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2008, 17:11   #5
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da cionci Guarda i messaggi
Scusa, ma i command li dovresti istanziare una sola volta per tutta l'applicazione ed in base ad un valore intero ricevuto (l'azione indicata nel pacchetto) dovresti scegliere un command da eseguire. I command dovrebbero essere implementati come method object.
Il mio problema è fare interagire i command non istanziarli.
Il Factory istanzia già il command appropriato in base all'id messaggio.
Ma l'interfaccia non consente il passaggio dei riferimenti a tutti i possibili oggetti manipolati dai singoli command.
E oltretutto il Factory isola la classe che conosce le istanze dei vari oggetti dai command che li devono usare.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2008, 17:56   #6
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Il mio problema è fare interagire i command non istanziarli.
Il Factory istanzia già il command appropriato in base all'id messaggio.
Ma l'interfaccia non consente il passaggio dei riferimenti a tutti i possibili oggetti manipolati dai singoli command.
E oltretutto il Factory isola la classe che conosce le istanze dei vari oggetti dai command che li devono usare.
ecco, questa parte mi sfugge...
i command devono interagire tra loro o con oggetti esterni?
E comunque con il factory non hai a disposizione tutti i riferimenti dei vari command?
In quel modo, magari implementando un observer pattern, dovresti riuscire a instradare gli eventi ai vari oggetti coinvolti che poi potranno reagire opportunamente..
..o mi sfugge ancora qualcosa?

certo che in effetti discutere di quale design pattern sia migliore senza conoscere pienamente l'architettura è un pò un casino..
infatti io ti sto suggerendo solo quelli che mi vengono in mente in base a quello che io ho capito che ti serve..
ma se non ho capito un cazz allora i miei suggerimenti sono praticamente inutili
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2008, 18:48   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Il mio problema è fare interagire i command non istanziarli.
Il Factory istanzia già il command appropriato in base all'id messaggio.
Ma l'interfaccia non consente il passaggio dei riferimenti a tutti i possibili oggetti manipolati dai singoli command.
E oltretutto il Factory isola la classe che conosce le istanze dei vari oggetti dai command che li devono usare.
Non capisco cosa intendi sinceramente. Non capisco nemmeno a cosa serva un factory. Basta un map che associa l'id al command da allocare al momento dell'instaurazione della connessione o al cambio di stato del protocollo.
Per far interagire i command con l'esterno dovrai passare i riferimenti agli altri oggetti o al costruttore del command o al metodo che esegue il comando stesso.

Ultima modifica di cionci : 24-06-2008 alle 18:50.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2008, 18:50   #8
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da cionci Guarda i messaggi
Non capisco cosa intendi sinceramente. Non capisco nemmeno a cosa serva un factory. Basta un map che associa l'id al command da allocare al momento dell'instaurazione della connessione o al cambio di stato del protocollo.
Per far interagire i command con l'esterno dovrai passare i riferimenti alla altri oggetti o al costruttore del command o al metodo che esegue il comando stesso.
è questo pure il mio problema...
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2008, 22:30   #9
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da tomminno Guarda i messaggi
E in alternativa dovrei modificare l'interfaccia per passare tutti i riferimenti di tutti i possibili oggetti manipolabili da un comando, che lo vedo come un obrobrio.
Come viene specificato quali oggetti un comando modifica ? Se dipende solo dal comando in se' probabilmente e' solo una questione di trovare un modo opportuno di istanziare i comandi. In caso contrario probabilmente il messaggio passato contiene un qualche ID dell'oggetto su cui operare, al che ti basta una classe che mappi ID -> oggetti. O forse la sto facendo troppo semplice ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2008, 16:44   #10
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Come viene specificato quali oggetti un comando modifica ?
E' il comando a sapere cosa deve modificare.
Il comando ImpostaSogliaXSensoreY sa di dover usare l'oggetto SensoreY, il problema è fargli conoscere l'istanza del SensoreY.

Quote:
Se dipende solo dal comando in se' probabilmente e' solo una questione di trovare un modo opportuno di istanziare i comandi. In caso contrario probabilmente il messaggio passato contiene un qualche ID dell'oggetto su cui operare, al che ti basta una classe che mappi ID -> oggetti. O forse la sto facendo troppo semplice ?
Se non fosse che tutti i comandi implementano la stessa interfaccia e un comando può usare più oggetti che non hanno la stessa interfaccia...
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2008, 16:45   #11
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da cionci Guarda i messaggi
Non capisco cosa intendi sinceramente. Non capisco nemmeno a cosa serva un factory. Basta un map che associa l'id al command da allocare al momento dell'instaurazione della connessione o al cambio di stato del protocollo.
Per far interagire i command con l'esterno dovrai passare i riferimenti agli altri oggetti o al costruttore del command o al metodo che esegue il comando stesso.
Factory o meno, usando una interfaccia comune per i comandi, ci vorrebbero decine di parametri, ovvero tutti quelli manipolabili dall'insieme di tutti i comandi e se c'è da aggiungere una nuova funzionalità con un nuova classe con relativi comandi per il controllo vanno modificati tutti.
E non è nemmeno detto che un comando agisca su un solo oggetto per cui non posso nemmeno usare i template/generics

Forse è il caso di esemplificare la struttura del programma:
Al momento c'è una classe Manager che istanzia praticamente tutto, il client per la connessione, le classi che rappresentano dei sensori, il GPS, il GSM (tutti questi hanno interfacce completamente differenti e non unificabili).
Poi ci sono tanti messaggi che controllano le singole funzioni, alcuni esempi:
ImpostaSogliaXSensoreY
ImpostaSogliaTemperatura
ResettaTuttiSensori
ImpostaStringaNMEA
ImpostaNumeroTelefonoServer

All'arrivo di un messaggio dal socket una map associa il messaggio ad un metodo che esegue il lavoro e risponde al server con il risultato dell'operazione. Insomma scarsamente OO.

Quello che volevo fare (e che in parte ho già fatto), già che devo rimettere mano al caos attuale, era creare una classe Command per ogni comando tipico del pattern command, una classe Factory per istanziare il comando appropriato in base al messaggio, dopotutto serve a questo il Factory no?

A questo punto nasce il problema di come fare per far si che il Command che gestisce il messaggio ImpostaSogliaXSensoreY abbia un riferimento alla classe SensoreY, che quello per ImpostaSogliaTemperatura abbia un riferimento alla classe SondaTemperatura, che quello per ResettaTuttiSensori abbia un riferimento a tutti i sensori, che ImpostaStringaNMEA abbia un riferimento al GPS e ImpostaNumeroTelefonoServer al GSM.

O comunque un modo per far si che all'arrivo del messaggio venga modificata la classe opportuna, anche rivedendo completamente la struttura che avevo pensato di usare.

Spero che adesso sia più chiaro.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2008, 17:01   #12
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da tomminno Guarda i messaggi
A questo punto nasce il problema di come fare per far si che il Command che gestisce il messaggio ImpostaSogliaXSensoreY abbia un riferimento alla classe SensoreY, che quello per ImpostaSogliaTemperatura abbia un riferimento alla classe SondaTemperatura, che quello per ResettaTuttiSensori abbia un riferimento a tutti i sensori, che ImpostaStringaNMEA abbia un riferimento al GPS e ImpostaNumeroTelefonoServer al GSM.
La prima soluzione che mi viene in mente è appunto istanziare una sola volta i Command e passare al costruttore i vari riferimenti alle classi necessarie.
Mi sembra anche la soluzione più semplice. L'interfaccia per il metodo che implementa il comando resterà la stessa.

La seconda soluzione che mi viene in mente è delegare la modifica dei sensori (e delle altri oggetti) agli oggetti stessi, i quali si registreranno su un observer in attesa di processare uno o più tipi di messaggi.
Alla ricezione un pacchetto verrà fatto un dispatch di un messaggio sull'observer. L'observer lo inoltrerà agli oggetti registrati per quel tipo di messaggio che si occuperanno di fare il parsing dei dati restanti per riconoscere se è diretto a loro oppure no (a seconda del messaggio puoi far arrestare l'inoltro del messaggio agli altri oggetti).
E' una soluzione abbastanza valida, ma anche computazionalmente più costosa.
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Blue Origin rinvia il secondo lancio del...
Nasce l'albo degli influencer 'rilevanti...
Il Digital Networks Act è stato r...
ASUS ROG ha lanciato due nuovi monitor d...
I nuovi iPhone 18 Pro potrebbero present...
Una parte dei Galaxy S26 avrà chi...
Amazon permetterà agli autori ind...
Il caso Zuckerberg a Palo Alto: una scuo...
Texas contro Roblox: il procuratore gene...
Offerte auto da urlo su Amazon: da CarPl...
Windows 11 26H1 in arrivo fra pochi mesi...
Un Black Friday continuo a rilascio lent...
Redmi Pad Pro da 12,1" 2560x2600 pi...
Tesla Roadster rinviata (di nuovo): ora ...
Il nuovo TV premium 2025 Samsung OLED 4K...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:47.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v