Parlare dell'OLP nel salone - pagina 6

 
George Merts:

Questa (e tutte quelle che iniziano con underscore) è una funzione protetta della classe.

Bene, sono fusi in uno solo!

C'è solo una funzione - Compare(), ma dobbiamo eseguire un confronto in base alla chiave passata. Corrispondentemente, viene scelta una delle particolari funzioni protette. Ecco perché sono protetti (protected), in modo che l'utente non possa accedervi - sono chiamati solo da Compare() e questo è indicato dalla sottolineatura.

Questa è anche una delle regole di progettazione del codice - una funzione che inizia con un trattino basso non è destinata ad essere chiamata dagli utenti, serve solo a certi compiti in classe. L'accesso è limitato.

Ma perché questi trucchi da circo quando è molto più facile fare tutto con i classici. Usate le funzioni wrapper e le parentesi graffe per nascondere le variabili e le funzioni annidate e impedirne l'accesso e sarete felici. Confonderai solo te stesso e gli altri con questi protetti...

 
Andrei:

Ma perché questi trucchi da circo quando tutto è molto più facile da fare tramite i classici. Usate le funzioni wrapper e le parentesi graffe per nascondere le variabili e le funzioni annidate e impedirne l'accesso e sarete felici. Confonderai solo te stesso e gli altri con questi protetti...

Non capisco... Protetto è un modificatore di accesso per una funzione. Cioè, viene usata una funzione protettrice, alla quale si può accedere solo da una funzione di una classe o di una sua discendente. Inoltre il trattino basso significa per me personalmente che ci sono alcune supposizioni implicite che devono essere prese in considerazione quando lo si usa.

Dennis Kirichenko ha notato correttamente - si potrebbe scrivere tutto in una funzione Compare(). Ma allora sarebbero due dozzine di schermi, sarebbe poco realistico visualizzarlo e più difficile da modificare di adesso.

Ho lasciato solo il selettore di chiavi nella funzione Compare(), mentre il codice che fa il confronto per chiavi particolari è messo in funzioni separate. Poiché queste funzioni sono altamente specifiche del contesto, sono dichiarate nella sezione protetta della classe, in modo da potervi accedere esclusivamente da un'altra funzione della classe o discendente. E per ricordarmi anche che queste funzioni sono destinate ad eseguire un compito specifico e stretto all'interno di un'altra funzione - le inizio con una sottolineatura. Se mi imbatto in una funzione del genere in futuro - vedrò immediatamente che ci sono presupposti impliciti che devono essere presi in considerazione quando la chiamo.

Sembra che voi (facciamo riferimento a "voi") non sappiate bene cosa sono i modificatori di accesso e perché sono necessari.

 
George Merts:

Non capisco... Protetto è un modificatore di accesso per una funzione. Cioè, viene usata una funzione protettrice, alla quale si può accedere solo da una funzione di una classe o di una sua discendente. Inoltre il simbolo underscore per me personalmente significa che ci sono alcuni presupposti impliciti da considerare quando lo si usa.

Bene, si può limitare l'accesso a una funzione in modi classici, senza alcuna OOP.
 
Artyom Trishkin:

Ma niente insulti personali...

Si prega di pulire il thread dall'inondazione, lasciare solo i post educatividi Alexey Volchanskiy
 
Andrei:
Bene, si può limitare l'accesso alla funzione con mezzi classici, senza alcuna OOP.

Come?

Ecco il compito - fare in modo che in futuro, quando si modifica il codice, sia impossibile prendere e usare una certa funzione "ovunque". Come farlo senza OOP-restrizione dell'accesso allo spazio delle classi con l'aiuto di modificatori pubblici-protetti-privati?

 

Apparentemente static e const (questo non è OOP) non sono necessari.

Per quanto riguarda OOP, molto interessante, come sarebbe la seguente funzione, che ha un'ampia applicazione pratica (per niente astratta), in stile procedurale?

Forum sul trading, sistemi di trading automatico e test di strategia

Organizzare un ciclo di overflow dell'ordine

fxsaber, 2017.10.18 12:29

Versione senza riferimento alla storia.
struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}

Questa versione è particolarmente rilevante per MT5 su VPS, poiché MT5 lavora con la Storia molto lentamente ed è computazionalmente costosa.

Ovviamente qualsiasi OOP può essere riscritta in stile procedurale. Ma è la pratica che mi interessa. Quindi ha preso il codice minuscolo di cui sopra, dove e OOP è usato al minimo.

Quindi quanto è più bello/meglio comodo/meglio leggibile/meglio corretto lo stile procedurale rispetto all'OOP in questo esempio? Beh, non per parlare per qualche pagina, ma solo per confrontare il codice sorgente breve procedurale vs OOP. Chiedo agli avversari di OOP di mostrare una masterclass. Questo non è il temuto MT5, ma il buon vecchio MT4.

 
Vladimir Pastushak:
Si prega di pulire questo thread dal flooding, lasciare solo i post educatividi Alexey Volchanskiy

È tardi )))) soprattutto perché riuscirò a trovare il tempo solo questo fine settimana, si è rivelato improvvisamente molto occupato

Farò alcuni studi questo fine settimana, forse anche qualche video.

 
Vladimir Pastushak:
Si prega di pulire il thread dall'inondazione, lasciare solo i post educatividi Alexey Volchanskiy

Vladimir, se non hai imparato per tutti questi anni, è troppo tardi per iniziare;).

 
fxsaber:

Apparentemente static e const (questo non è OOP) non sono necessari.

Per quanto riguarda l'OOP, è molto interessante come la prossima funzione, che ha un'ampia applicazione pratica (per niente astratta), apparirebbe in stile procedurale?

Ovviamente, qualsiasi OOP può essere riscritta in stile procedurale. Ma mi interessa la pratica. Così ho preso il codice minuscolo di cui sopra, dove anche l'OOP è usato al minimo.

Quindi quanto è più bello/meglio comodo/meglio leggibile/meglio corretto lo stile procedurale rispetto all'OOP in questo esempio? Beh, non per parlare per qualche pagina, ma solo per confrontare il codice sorgente breve procedurale vs OOP. Chiedo agli avversari di OOP di mostrare una masterclass. Questo non è il temuto MT5, ma il buon vecchio MT4.

Stai diventando troppo contorto anche in questo semplice esempio. È sempre più facile riscrivere OOP che capire il codice di qualcun altro.... Cosa volete fare, almeno ditemelo in un chiaro linguaggio umano? Scoprire qual è il cambiamento nella cronologia degli ordini?
 
Vasiliy Sokolov:

Vladimir, se in tutti questi anni non hanno ancora imparato, penso che sia troppo tardi per iniziare;)


Posso chiedere chi sono e cosa non hanno imparato? I moderatori non hanno imparato a pulire o qualcos'altro).

ZS: A proposito, in tutto il thread non ha visto un solo desiderio di coprire qualsiasi argomento, come sempre, il solito rancore. Così ho deciso di registrare video su YouTube da zero su come funziona OOP, almeno sarà di qualche utilità. Comunque, tra un po' il ramo finirà nel branch_sucker.