Una domanda per gli esperti di OOP. - pagina 17

 
Vladimir Simakov:
Intendo il numero di classi. Ognuno è lungo 200 righe.
Quanto sarebbe più difficile accedervi? Ho un kernel globale che è visibile dappertutto. In OOP dovrei rinunciarvi. Come potrei lavorare con gli elementi in windows allora? Divento comatoso quando cerco di immaginarlo)).
 
Реter Konow:
Quanto sarebbe più difficile l'accesso? Ho un kernel globale che è visibile dappertutto. In OOP dovrei rinunciarvi. Come potrei lavorare con gli elementi in windows allora? Divento comatoso quando cerco di immaginarlo)).

Classe statica.

 

Vladimir Simakov:
А теперь к эффективности. Switch - это что в конечном итоге? Это последовательное сравнение параметра с константами. Внимание Петр, последовательное.

non è affatto necessario.

Questo non significa che Peter abbia ragione o che l'interruttore debba essere messo ovunque, ma comunque.

 
Alexey Navoykov:
Sì, esatto,quindi in termini di velocità, è ovviamente l'opzione più veloce in MQL. Ma l'accesso aglioggetti di classe nell'ambiente gestito è indiretto.
Grazie per questa breve panoramica. Ritiro quello che ho detto sullo switch.
 
Georgiy Merts:

Esatto, di più su questa funzione. Avete un interruttore di dimensioni mostruose che seleziona una delle decine di funzioni richieste. In un tale switch, è molto facile fare un errore scrivendo accidentalmente il codice relativo a uno dei rami nel posto sbagliato.

Le cose sono molto più semplici con un sovraccarico. Abbiamo dieci discendenti diversi, e ogni volta lavoriamo con UNA classe, e questa ha UNA funzione sovraccaricabile. Non possiamo scriverlo accidentalmente in un'altra classe, perché dobbiamo aprire un file completamente diverso per questo.

Inoltre - il parsing stesso in questo enorme switch è, secondo me, molto più stressante che aprire l'unica classe di cui abbiamo bisogno, e poi analizzare solo una funzione.

In effetti, nel codice assembler tutta la gestione di questo interruttore si riduce comunque allo stesso swich, in funzione di questo puntatore. Ma nel caso di OOP tutto questo è nascosto al programmatore e non interferisce con il suo lavoro. Senza OOP - devi occupartene.

In parole povere, quando si cammina - si finisce per inviare segnali ai muscoli in una certa sequenza che li muovono. Tuttavia, a livello di coscienza - si ricorda solo quale movimento fare. Ecco, l'OOP è esattamente quel tipo di "memoria di quale movimento fare". Lei "non capisce perché abbiamo bisogno di ricordare il movimento quando abbiamo un mucchio di muscoli, e nervi collegati ad essi". bene... L'ho già detto molte volte, per i titani della memorizzazione, è davvero sufficiente ricordare quali muscoli devono essere tesi in quale sequenza per andare. Non ha senso ricordare tutto il movimento. Per altri, che non possono ricordare così tanto, è molto più ragionevole ricordare l'intero movimento, e cosa c'è con i muscoli, in quale sequenza sono tesi e in che misura - è più ragionevole nasconderlo alla mente.

Le funzioni sovraccaricate sono solo funzioni diverse per il compilatore, e nessun interruttore.

 
Реter Konow:
Quanto sarebbe più difficile l'accesso? Ho un kernel globale che è visibile dappertutto. In OOP dovrei rinunciarvi. Come lavorare con gli elementi in windows allora? Divento comatoso quando cerco di immaginarlo)).

Perché dovrebbe essere così?

Il kernel globale e l'OOP non si escludono a vicenda.

Solo gli elementi nelle finestre dovrebbero essere incapsulati all'interno di classi di finestre, non "Laying on view". In modo che nessuno possa accidentalmente "entrare nel posto sbagliato". Cambiare una variabile e fare un errore sulla sua posizione all'interno di un enorme array globale è molto facile, mentre è molto più difficile interrogare l'interfaccia giusta e poi cambiare la stessa variabile nell'oggetto giusto e fare un errore.

 
Koldun Zloy:

Le funzioni sovraccaricate sono semplicemente funzioni diverse per il compilatore, e nessun interruttore.

E come si seleziona quello che serve? Stiamo parlando di funzioni virtuali e late binding. Quale funzione sovraccaricata sarà chiamata? Questo è determinato dal puntatore this, che viene passato implicitamente quando lo chiamate. E come pensate che venga fatta questa scelta?

 
Georgiy Merts:

E come viene selezionato quello che vogliamo? Stiamo parlando di funzioni virtuali e late binding. Quale funzione sovraccaricata sarà chiamata? Questo è determinato dal puntatore this, che è implicitamente passato alla chiamata. E come pensate che venga fatta questa scelta?

In realtà, Peter non stava parlando di funzioni virtuali.

Ma non hanno nemmeno interruttori.

Una classe che ha funzioni virtuali ha una tabella di funzioni virtuali.

E ogni oggetto di questa classe contiene una variabile implicita - un puntatore alla tabella delle funzioni virtuali.

Se una o tutte le funzioni virtuali sono sovrascritte nel discendente, viene creata una nuova tabella e le istanze discendenti contengono un puntatore ad essa.

 
Koldun Zloy:

In realtà, Peter non stava parlando di funzioni virtuali.

Ma non hanno nemmeno interruttori.

Una classe che ha funzioni virtuali ha una tabella di funzioni virtuali.

E ogni oggetto di questa classe contiene una variabile implicita - un puntatore alla tabella delle funzioni virtuali.

Se una o tutte le funzioni virtuali sono sovrascritte nel discendente, viene creata una nuova tabella e le istanze del discendente contengono un puntatore ad essa.

Esattamente. Sto chiedendo, come funziona questa stessa tabella? Nel codice assembler, è lo stesso interruttore.

E riguardo al "non parlare di funzioni virtuali" - è un po' come "perché OOP"... Cioè, si tratta di funzioni virtuali, e non di semplici nomi di funzioni identiche con argomenti diversi.

 
Georgiy Merts:

Esattamente. Quindi la mia domanda è: come funziona questa tabella? Nel codice assembler è lo stesso interruttore.

No. È solo un array di puntatori a una funzione.

Il codice assembly prende un indirizzo di tabella dall'oggetto.

Prende l'indirizzo della funzione in una certa posizione.

E viene fatto un salto a quell'indirizzo.

Che dire di "non stavo parlando di funzioni virtuali" - è quello che intendevo con "perché OOP"... Cioè, si tratta di funzioni virtuali, non solo di nomi di funzioni identiche con argomenti diversi.

A giudicare dalla sua domanda, stava parlando di funzioni con nomi identici.

Molto probabilmente non è nemmeno a conoscenza delle funzioni virtuali.