|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
|
[C++] Realizzare codice modulare
Ciao a tutti...
Devo realizzare un'applicazione in c++ per win32. Questa applicazione dovrebbe essere formata da un main che permette di creare delle catene composte da vari blocchi. Praticamente dal main posso lanciare su thread diversi catene e distruggerle. Queste catene sono formate da diversi blocchi, il primo acquisisce dei dati, l'ultimo li visualizza e nel mezzo diversi blocchi che processano, i diversi blocchi sono autonomi e comunicano scambiandosi un char ad esempio. Ogni blocco dovrebbe essere una classe, così sta su un file a parte, ci può lavorare un'altra persona e si puù modificare un blocco senza modificare l'intero programma. Un esempio di catena potrebbe essere: blocco che acquisisce audio, blocco codifica, blocco decodifica, riproduzione audio... Come posso realizzare una struttura del genere? Avete degli esempi? Suggerimenti?
__________________
Dont drink and drive but smoke and fly Peugeot 206 enfant terrible!!! |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Quote:
Se metti giù uno schema già ti viene più facile dividere i vari blocchi in classi. L'unico consiglio che posso darti è di tenere divisa la logica applicativa con quella che interfaccia col SO (win32) che quindi realizza l'interfaccia e fa le chiamate a basso livello. |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
|
Ma più che i vari blocchi a me interessa proprio la struttura della catena... come farla???
Praticamente io nel main vorrei fare una cosa del genere: Catena = new Chain(); Catena.aggancia(new BloccoA) Catena.aggancia(new BloccoB) Dove BloccoA e BloccoB sono classi che fanno cose completamnte diverse: Ad esempio BloccoA acquisisce audio e BloccoB riproduce audio ma i due blocchi comunicano scambiandosi solo un char..... Non sò se sono stato chiaro... così relizzo un loop audio... poi mam mano vado ad aggiungere blocchi che trattano l'audio
__________________
Dont drink and drive but smoke and fly Peugeot 206 enfant terrible!!! |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
Ma vuoi realizzare codice orientato agli oggetti o modulare?
Perchè parli di moduli, blocchi e classi e li usi tutti insieme nello stesso pensiero :s Comunque, anche se realizzi una applicazione OOP non è detto che le varie classi siano mutabili a piacere. Riguardo l'autonomia, non dare per scontato che una classe sia liberamente modificabile, dato che in molti casi una modifica della classe richiede anche la revisione del suo utilizzo, specie se cambi i metodi della classe e hai un oggetto che cerca di chiamare i vecchi metodi, non più esistenti. Comunque riguardo l'autonomia ti consiglio di leggere questo dettagliatissimo post di PGI-Bis (mi prendo la libertà di linkartelo io Spiega molto bene questo concetto. Fai chiarezza poi cosa vuoi ottenere, sfrutta il consiglio di _Claudio e fai uno schema logico dell'applicazione. Che io sappia la "chained programming" non esiste tra i paradigmi di sviluppo. Esistono invece altri paradigmi che ti permettono di creare un programma con quella logica. Comunque dagli esempi sembra tu voglia usare OOP, ma non credo sia fattibile quel che cerchi. Non puoi passare una classe (e non un oggetto) e sperare che questa magicamente comunichi con il metodo. Idem per l'oggetto, in che modo intendi farli comunicare? Non è solo dicendo: voglio fare Codice:
System.start(); System.run(Environment);
__________________
La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.
Isaac Asimov |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
Codice:
Blocco
-Catena catena
-string nome
+getNome()
+setCatena(Catena c)
+getCatena()
+ricevi(char)
Catena
-mappa string-blocco
+aggancia(Blocco b) = mappa.put(b.getNome(), b), b.setCatena(this)
+getBlocco(String nome) = mappa.get(nome)
Il possesso di un nome da parte dei blocchi non è strettamente necessario. Dipende dal protocollo di comunicazione. Ad esempio se non ti interessa che un blocco X comunichi specificamente con un blocco Y puoi dire: Codice:
Blocco
-Catena catena
+setCatena(Catena c)
+getCatena()
+ricevi(char)
Catena
-lista di blocchi
+aggancia(Blocco b) = lista += b, b.setCatena(this)
+comunica(char c) = per ogni blocco b in lista blocchi, b.ricevi(c)
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
|
Questo si avvicina molto a quello che vorrei fare... Però il discorso è che i vari blocchi della catena sono sempre in esecuzione e si scambiano messaggi (char) sempre nello stesso verso.
Catena BloccoA----BloccoB----BloccoC BloccoA invia sempre messaggi a BloccoB BloccoB invia sempre messaggi a BloccoC Scusate è che non sò spiegare bene quello che voglio fare... provo a essere più chiaro... Io in pratica creo un oggetto BloccoA, uno BloccoB, uno BloccoC BloccoA acquisisce audio e lo manda sotto forma di messaggi char al blocco successivo BloccoB riceve questo char fa delle modifiche e invia il char al blocco successivo BloccoC riceve il char e riproduce l'audio Anche eliminando il bloccoB dalla catena il tutto funziona... e potrei inserire un numero diverso di blocchiB
__________________
Dont drink and drive but smoke and fly Peugeot 206 enfant terrible!!! |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Ti basterà dire:
Codice:
Catena
+comunica(char c, Blocco sender) =
prendi il nodo x che viene dopo sender nella
lista dei nodi e, se c'è, x.ricevi(c)
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Se i blocchi sono sempre in ESECUZIONE CONTEMPORANEAMENTE allora più che delle classi devi usare dei thread con pipe. Su cui puoi dinamicamente caricare l'esecuzione di un blocco (processo) sui thread e gestire le varie pipe.
Nulla di complicato, ci metti più a dirlo che a farlo. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Quote:
, non c'è nemmeno una formalizzazione dello stesso (ecco l'utilità dei tanto vituperati diagrammi UML et similia).Se i blocchi sono dinamici e in qualche modo devono elaborare dati real time contemporaneamente e scambiarsi char tra di loro, non c'è nulla di meglio che i thread. |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
I blocchi di una singola catena girano su thread diversi o lo stesso ?
__________________
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 |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
A lui serve poter "spezzare" una Catena in Blocchi (e quindi, viceversa, comporre una Catena dichiarando una sequenza di aggiunte ordinate di singoli Blocchi alla stessa) solo per poter affidare l'implementazione di un qualsiasi singolo Blocco a un singolo sviluppatore che non si deve preoccupare del "mondo esterno" al Blocco stesso su cui lavora. Nel "mondo esterno" poi, i vari blocchi verranno istanziati e aggiunti in ordine a formare una Catena: esiste poi la possibilità, nel contesto dell'applicazione, di lanciare contemporaneamente più Catene in esecuzione: ognuna sul suo bel thread. Infine, in ogni Catena il primo e l'ultimo Blocco della stessa sono sempre gli stessi: il primo è il Blocco che acquisisce l'audio in input alla Catena, l'ultimo il Blocco che ne esegue la riproduzione.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
|
Ecco esatto ottime spiegazione... ciò è quello che vorrei realizzare... con la piccola differanza che il primo e l'ultimo blocco della sequenza non sono sempre gli stessi
__________________
Dont drink and drive but smoke and fly Peugeot 206 enfant terrible!!! |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Codice:
class Block
{
virtual void execute( char input ) =0;
virtual char output() =0;
};
Codice:
std::vector< shared_ptr<Block> > chain;
...
chain[0]->execute( myInputChar );
for ( int i=1 ; i< chain.size(); ++i )
{
chain[i]->execute( chain[i-1]->output() );
}
Se i vari blocchi devono poter gestire tipi di input/output diversi la cosa diventa piu' complicata, ma non troppo difficile
__________________
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 |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
|
Tanto il blocco iniziale in qualsiasi modo prende l'input: audio, tastiera, rete ecc non fa altro che prenderlo e metterlo sulla catena uscendo come char... Tu invece nell'esempio presumi che al primo blocco arrivi già in input un char ma non è così.
Non si dovrebbe complicare troppo il tutto... Adesso inizio a provare a fare un esempio banale: Primo blocco genera una stringa "Hello" secondo blocco inverte la stringa terzo blocco stampa a video... "olleH" Inserendo nella catena due volte il secondo blocco la stringa dovrebbe uscire "Hello"
__________________
Dont drink and drive but smoke and fly Peugeot 206 enfant terrible!!! Ultima modifica di monelli : 16-09-2009 alle 15:14. |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
no in realta' io pensavo semplicemente ad una cosa a template usando delle buone vecchie liste.
Codice:
template <typename Input, typename Output>
class Block
{
public:
virtual void execute( const Input& input ) =0;
virtual const Output& output() = 0;
};
template <typename Input, typename Output,typename T>
class Chain : public Block<Input,Output>
{
public:
Chain( Block<Input,T>*, Block<T,Output>* );
void execute(const Input& input) { _first->execute(input); _second->execute( _first->output() ); }
const Output& output(){ return _second->output(); }
};
La verbosita' del C++ non rende giustizia all'idea, che di per se' e' molto 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 |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
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 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:00.












, non c'è nemmeno una formalizzazione dello stesso (ecco l'utilità dei tanto vituperati diagrammi UML et similia).








