Domande su OOP in MQL5 - pagina 50

 
Aleksey Mavrin:

Dimitri, in questo caso probabilmente stai confondendo un po' gli obiettivi dei modelli Keeper e Prototype, e tutte le loro possibili combinazioni e manifestazioni. Primo: l'istantanea non deve necessariamente copiare l'intero oggetto, a differenza di Prototype.

E sì, la necessità dell'incapsulamento si manifesta soprattutto nei grandi progetti con molte persone. Per giocattoli come la maggior parte di questi, è un po' ridondante.

A cosa si riduce - sedersi e discutere in tutta serietà sul fatto che un valore può essere assegnato a una variabile e poi può essere usato. Oh sì - quando si programma qualsiasi cosa su qualsiasi cosa, molte volte si assegnano valori diversi a variabili diverse e poi si usano. Ma ora si chiama in modo diverso, e ora quando se ne parla, bisogna aggrottare le sopracciglia e mettere uno sguardo serio.

Ed è importante non fare un errore, se tutti i campi sono salvati, è Prototipo, e se non tutti, è Keeper, o i ragazzi rideranno.

 
Sergey Dzyublik:

Non sei un membro della setta "stanno installando internet, non ci serve, non abbiamo bisogno del tuo internet...", vero? ???


1. il custode, per progettazione, è simile al modello che usano per memorizzare lo stato durante la digitazione con contenuto mutevole per eseguire il rollback delle modifiche quando queste modifiche non sono una ma diverse centinaia. Per esempio, editor di foto, editor di testo...
L'ho trovato dopo aver scritto -https://refactoring.guru/ru/design-patterns/memento
2. Fondamentalmente è una cattiva pratica non conoscere e non capire il soggetto per criticare qualcosa lì...
3. Come può qualcosa che già non si capisce diventare più confuso e difficile da capire?
4. Il resto sta a voi...


Cosa c'entra il GOP?

 
Sergey Dzyublik:

Per caso, non sei un membro della setta "loro installano intinet, noi non ne abbiamo bisogno, tu intinet"? ???


1. il custode, per progettazione, è simile al modello che usano per memorizzare lo stato durante la digitazione con contenuto mutevole per eseguire il rollback delle modifiche quando queste modifiche non sono una ma diverse centinaia. Per esempio, editor di foto, editor di testo...
L'ho trovato dopo aver scritto -https://refactoring.guru/ru/design-patterns/memento
2. Fondamentalmente è una cattiva pratica non conoscere e non capire il soggetto per criticare qualcosa lì...
3. Come può qualcosa che già non si capisce diventare più confuso e difficile da capire?
4. Il resto sta a voi...


Sono con voi fino in fondo! Grazie per aver argomentato il mio punto... Ero pigro))

Aggiungerei solo al punto 1 che lo snapshot non memorizza necessariamente tutti i dati dell'oggetto, e ci possono essere diversi rami con centinaia di snapshot dello stesso oggetto "snapshot da lati diversi". In questo caso, immagazzinare centinaia di copie di dati inutilizzati è veramente la pratica peggiore.

 
Dmitry Fedoseev:

Si è arrivati a questo - sedersi lì e parlare in tutta serietà di come ad una variabile può essere assegnato un valore e poi essere usata. Oh sì - quando si programma qualcosa in qualsiasi cosa, molte volte si assegnano valori diversi a variabili diverse, e poi si usano. Ma ora si chiama in modo diverso, e ora quando se ne parla, bisogna aggrottare le sopracciglia e mettere uno sguardo serio.

Ed è importante non fare un errore, se tutti i campi sono salvati, allora è il Prototipo, e se non tutti, allora il Guardiano, o i ragazzi rideranno.

Dmitry, ti assicuro, sarei felice di ridere di te, beh, mi piace) ma in questo caso, hai esagerato, anche particolarmente ben sorriso.

Sei solo molto confuso - uno SHOT non equivale a una COPIA DELL'OGGETTO, te l'ho fatto notare.

Se non è chiaro, lasciate che vi spieghi con un esempio - avete 1000 byte di oggetto, avete bisogno di 200 per lo snapshot, quindi perché copiare 800, specialmente se avete molti milioni di snapshot salvati.

p/s// E in generale. La gente non si rende conto che i modelli sono solo un esempio elementare di risoluzione di un problema TIPICO elementare. E infatti i compiti non sono elementari, ma più complicati. E per risolvere i problemi reali i modelli sono necessari, ma spesso non in forma pura di libro, ma adattati a un compito particolare, possibilmente combinati tra loro, possibilmente con l'aggiunta di qualche improvvisazione, espressa a volte in una semplificazione, se il compito lo permette, o viceversa "ponderazione" della realizzazione.

Di nuovo, perché avete bisogno di incapsulamento e interfacce - questo probabilmente non può essere capito se il vostro QI è al di sotto di Wasserman, o se non avete partecipato a progetti reali, quando diverse parti del progetto sono cambiate da diverse persone simultaneamente, e non seguire i principi di base di OOPD comporta costi enormi nel catturare i bug. Davvero, perché tutto questo per timbrare EAs per il mercato))

 
Dato:
1. Una macchina a stati finiti (FSA)
2. Il numero di KA è sconosciuto.
3. Stati del veicolo spaziale: successo / fallimento / lavoro
4. Le CA sono eseguite in diversi thread, il numero di thread è sconosciuto

Un modello deve permettere:
1. Emettere un ID unico per ogni processo - il contatore non funziona
2. Aggiungere spa spa in modo uniforme per fili
3. Ottenere lo stato del veicolo spaziale
4. Riavvia KA se lo stato di KA è lo stesso del task che è stato emesso in precedenza
5. Salvare AC nel database e rimuoverlo dal flusso se lo stato ha successo
6. Ripristinare lo stato di AC (ID dal salvataggio) e aggiungerlo al flusso
7. Per avere un pool comune per lo scambio di messaggi EA, il pool non è di gomma, gli EA cancellati non ricevono messaggi, ma gli EA appena creati dovrebbero ricevere nuovi messaggi e non quelli lasciati dagli EA uccisi, non c'è sincronizzazione tra i thread e gli EA
8. Salvare e ripristinare lo stato dell'intero pattern e del pool di messaggi

* Le KA non svolgono gli stessi compiti
** Message pool è il problema principale, ma potrebbe essere sia CA o DB o ?
*** forse è tutto lavoro di database e i modelli non sono affatto necessari qui?
 
?
 
Igor Makanu:
Dato:
1. Una macchina a stati finiti (FSA)
2. Il numero di KA è sconosciuto.
3. Stati del veicolo spaziale: successo / fallimento / lavoro
4. Le CA sono eseguite in diversi thread, il numero di thread è sconosciuto

Un modello deve permettere:
1. Emettere un ID unico per ogni processo - il contatore non funziona
2. Aggiungere spa spa in modo uniforme per fili
3. Ottenere lo stato del veicolo spaziale
4. Riavvia KA se lo stato di KA è lo stesso del task che è stato emesso in precedenza
5. Salvare AC nel database e rimuoverlo dal flusso se lo stato ha successo
6. Ripristinare lo stato di AC (ID dal salvataggio) e aggiungerlo al flusso
7. Per avere un pool comune per lo scambio di messaggi EA, il pool non è di gomma, gli EA cancellati non ricevono messaggi, ma gli EA appena creati dovrebbero ricevere nuovi messaggi e non quelli lasciati dagli EA uccisi, non c'è sincronizzazione tra i thread e gli EA
8. Salvare e ripristinare lo stato dell'intero pattern e del pool di messaggi

* Le KA non svolgono gli stessi compiti
** Message pool è il problema principale, ma potrebbe essere sia CA o DB o ?
*** forse è tutto lavoro di database e i modelli non sono affatto necessari qui?
1. Hai un compito complesso, quindi la parola modello può essere usata solo al plurale nella tua domanda, se mai :)
2. È necessario aggiungere CA in modo uniforme tra i fili. Cosa c'è di sbagliato in una fabbrica implementata con un idemaker singleton e un thread manager? Perché un semplice contatore non è adatto, non è chiaro? Non c'è modo di controllare la creazione di CA o cosa? Quindi stai facendo un addon per il progetto di qualcun altro o il tuo?
7. Osservatore con filtraggio in base al tempo di creazione del veicolo spaziale. Tutte le implementazioni per MT.
Tutto salva nel database - il livello del database non è complicato.
Collegamento delle fabbriche con ripristino dal database senza difficoltà.
E in generale - la risposta corretta alla tua domanda - hai bisogno di TUTTI i modelli come minimo. Seriamente. Dopo averli padroneggiati tutti avete bisogno di intraprendere tali compiti. Perché lungo la strada si può avere bisogno sia del decoratore che della facciata (per il DB) e del visitatore per implementare eventi end-to-end e altri.

 

Sergey Dzyublik:

1. Un custode, simile nel design al modello utilizzato per memorizzare lo stato quando si scrive con contenuto mutevole per eseguire il rollback dei cambiamenti quando questi cambiamenti non sono uno ma diverse centinaia. Per esempio un editor di foto, un editor di testo...

2. Infatti, è cattiva pratica non conoscere e non capire il soggetto per criticare qualcosa lì...

Il punto chiave è stato evidenziato: è il contenuto modificabile che è la radice di molti problemi di uso improprio di OOP. Anche io sono stato a lungo in questo, ma con l'esperienza arriva gradualmente la comprensione.Il codice dove ci sono molte interrelazioni tra gli oggetti (puntatori) e allo stesso tempo questi oggetti sono modificabili - è un terribile spaghetto che non cambierà. Quindi, dovremmo sforzarci di rendere immutabili gli oggetti di riferimento. Solo gli oggetti di valore devono essere modificabili, cioè strutture e tipi semplici, e anche i puntatori.

In questo caso, è auspicabile dichiarare l'oggetto iniziale come una struttura, non come una classe. Poi si può cambiare il suo contenuto. In questo caso, naturalmente, nessun puntatore ad esso sarà preso e salvato come nel modello discusso, e questo è corretto. Per cambiare gli oggetti è necessario fare esplicitamente riferimento ai loro metodi, o passarli come argomento a una funzione, cioè

memento.restoreState(myObject);

o

myObject.restoreState(memento);

Non così:

memento.restoreState();

sembra che stiamo cambiando un oggetto memento, ma in realtà stiamo cambiando qualche altro oggetto, che probabilmente si trova altrove nel programma. Questo crea un effetto collaterale: è lo stesso che cambiare una variabile globale in un posto e usare il suo valore in un altro posto.

Cioè un memento non dovrebbe memorizzare un riferimento all'oggetto originale. Dovrebbe memorizzare solo il contenuto. Questa è la mia opinione, ma penso di non essere lontano dalla verità )

 
Aleksey Mavrin:
In generale - la risposta corretta alla tua domanda è che hai bisogno di TUTTI i modelli come minimo. Seriamente.

Non sto rivendicando la mia opinione, probabilmente letta da qualche parte, ma imho, ci sono solo due problemi nella programmazione: struttura corretta del programma e trovare rapidamente un buon nome per una variabile, e tutto il resto è fatto abbastanza facilmente

Anch'io sono serio.

Grazie, leggerò i tuoi schemi

Aspetterò, nel caso in cui appaia qualcun altro, ma solo a livello di domande di principianti e formatori akademvelopers che piombano su ))))

 
Alexey Navoykov:

1) Il codice, che ha molte interrelazioni tra gli oggetti (puntatori), e allo stesso tempo gli oggetti sono modificabili, è uno spaghetto assurdo, in cui il diavolo non può capire dopo. Quindi, è necessario sforzarsi affinchégli oggetti di riferimento siano immutabili.
2)
Solo gli oggetti di valore, cioè strutture e tipi semplici, e i puntatori dovrebbero essere modificabili.
3)
In questocaso, è auspicabile dichiarare l'oggetto iniziale come una struttura, non come una classe. Poi si può cambiare il suo contenuto. Naturalmente, non si può prendere un puntatore ad esso e salvarlo come nel modello discusso, e questo è corretto.
4) Glioggetti devono essere cambiati chiamando esplicitamente i loro metodi o passandoli come argomento in una funzione.
Sembra chestiamo cambiando l'oggetto memento ma in realtà è qualche altro oggetto che probabilmente si trova altrove nel programma. Questo crea un effetto collaterale.

1. Si scopre che la struttura dei dati Tree è tutto dal male...
2. Povero C++ dove class == struct privata, cosa fare, probabilmente dovremmo abbandonare strutture e classi.
3. E questo è giusto: nessun modello, nessun ordinamento per puntatori, nessun risparmio di memoria, specialmente per oggetti grandi...
4. Non dobbiamo dimenticare di proibire l'uso di interfacce e funzioni template, altrimenti non capirete con quale oggetto state lavorando - che orrore...

Motivazione: