Conversando sobre a OLP no salão - página 6

 
George Merts:

Isto (e tudo começando com o sublinhado) é uma função protegida da classe.

Bem, eles estão fundidos em um só!

Há apenas uma função - Comparar(), mas temos que realizar uma comparação pela chave que está sendo passada. Correspondentemente, uma das funções particulares de proteção é escolhida. É por isso que eles são protegidos (protegidos), para que o usuário não possa acessá-los - eles são chamados apenas de Compare() e isto é indicado sublinhando.

Esta também é uma das regras de projeto de código - uma função que começa com um sublinhado não se destina a ser chamada pelos usuários, ela serve apenas a certas tarefas da classe. O acesso a ele é restrito.

Mas por que tais truques de circo quando é muito mais fácil fazer tudo com clássicos. Use as funções de envoltório e colchetes para esconder variáveis e funções aninhadas e impedir o acesso a elas e você ficará feliz. Você só vai confundir a si mesmo e aos outros com esses protetóides.

 
Andrei:

Mas por que tais truques circenses quando tudo é muito mais fácil de fazer via clássicos. Use as funções de invólucro e os suportes encaracolados para esconder variáveis e funções aninhadas e impedir o acesso a elas e você ficará feliz. Você só vai confundir a si mesmo e aos outros com esses protexteds...

Eu não entendo... Protegido é um modificador de acesso para uma função. Ou seja, é utilizada uma função protetora, que só pode ser acessada a partir de uma função de uma classe ou de seu descendente. Além disso, para mim pessoalmente, o que ressalta é que existem algumas suposições implícitas que devem ser levadas em consideração ao utilizá-lo.

Dennis Kirichenko observou corretamente - você poderia escrever tudo em uma função Comparar(). Mas então seriam duas dúzias de telas, seria irrealista olhar através delas e mais difícil de modificar do que agora.

Eu deixei apenas o seletor de chaves na função Comparar(), enquanto o código que faz a comparação de chaves particulares é colocado em funções separadas. Como estas funções são altamente específicas do contexto, elas são declaradas na seção protegida da classe, para que possam ser acessadas exclusivamente de outra função da classe ou descendente. E também para me lembrar que estas funções se destinam a realizar uma tarefa estreita específica dentro de outra função - eu as inicio com um sublinhado. Se eu me deparar com tal função no futuro - verei imediatamente que há suposições implícitas que precisam ser levadas em consideração ao chamá-la.

Parece que você (vamos nos referir a "você") não sabe bem o que são modificadores de acesso e por que eles são necessários.

 
George Merts:

Eu não entendo... Protegido é um modificador de acesso para uma função. Ou seja, é utilizada uma função protetora, que só pode ser acessada a partir de uma função de uma classe ou de seu descendente. Além disso, o símbolo do sublinhado para mim pessoalmente significa que há algumas suposições implícitas a serem consideradas ao utilizá-lo.

Bem, você pode restringir o acesso a uma função de maneira clássica, sem qualquer OOP.
 
Artyom Trishkin:

Mas sem insultos pessoais...

Por favor, limpe o fio da inundação, deixe apenas os postos educacionais deAlexey Volchanskiy
 
Andrei:
Bem, você pode limitar o acesso à função por meios clássicos, sem qualquer OOP.

Como ?

Aqui está a tarefa - fazer com que no futuro, ao modificar o código, seja impossível levar e usar uma determinada função "em qualquer lugar". Como fazê-lo sem a restrição OOP deacesso ao espaço de classe com a ajuda de modificadores público-privados protegidos?

 

Aparentemente estáticas e constantes (isto não é OOP) não são necessárias.

Quanto ao OOP, muito interessante, como seria a seguinte função, que tem ampla aplicação prática (não é nada abstrata), em estilo processual?

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Organização de um ciclo de transbordo de pedidos

fxsaber, 2017.10.18 12:29

Versão sem referência à história.
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);
}

Esta versão é especialmente relevante para o MT5 no VPS, pois o MT5 é muito lento e computacionalmente caro com a História.

Obviamente, qualquer OOP pode ser reescrito em estilo processual. Mas é a prática que me interessa. Assim, eu levei o código acima, onde o OOP também é usado ao mínimo.

Então, quanto mais agradável/muito conveniente/muito legível/muito correto é o estilo de procedimento em comparação com o OOP neste exemplo? Bem, não para falar por algumas páginas, mas apenas para comparar o procedimento de código fonte curto com o OOP. Peço aos oponentes do OOP que mostrem uma classe mestra. Este não é o temido MT5, mas o bom e velho MT4.

 
Vladimir Pastushak:
Por favor, limpe esta linha das inundações, deixe apenas os postos educacionais deAlexey Volchanskiy

É tarde )))) especialmente porque só conseguirei encontrar tempo neste fim de semana, de repente acabou ficando muito ocupado

Fará alguns estudos neste fim de semana, talvez alguns vídeos também.

 
Vladimir Pastushak:
Por favor, limpe o fio da inundação, deixe apenas os postos educacionais deAlexey Volchanskiy

Vladimir, se você não aprendeu por todos estes anos, é tarde demais para começar;).

 
fxsaber:

Aparentemente estáticas e constantes (isto não é OOP) não são necessárias.

Quanto ao OOP, é muito interessante como o seguinte, que tem ampla aplicação prática (não abstrata de forma alguma), funcionaria em estilo processual?

Obviamente, qualquer OOP pode ser reescrito em estilo processual. Mas eu estou interessado na prática. Assim, eu levei o código acima, onde o OOP também é usado ao mínimo.

Então, quanto mais agradável/muito conveniente/muito legível/muito correto é o estilo de procedimento em comparação com o OOP neste exemplo? Bem, não para falar por algumas páginas, mas apenas para comparar o procedimento de código fonte curto com o OOP. Peço aos oponentes do OOP que mostrem uma aula magistral. Este não é o temido MT5, mas o bom e velho MT4.

Você está ficando muito enrolado mesmo neste simples exemplo. É sempre mais fácil reescrever o OOP do que entender o código de outra pessoa.... O que você quer fazer, ao menos me diga em linguagem humana simples? Descubra qual é a mudança no histórico do pedido?
 
Vasiliy Sokolov:

Vladimir, se durante todos estes anos ainda não aprenderam, acho que é tarde demais para começar;)


Posso perguntar quem são e o que não aprenderam? Os moderadores não aprenderam a limpar ou outra coisa qualquer ).

ZS: A propósito, em toda a linha não houve um único desejo de cobertura de qualquer tópico, como sempre, o rancor habitual. Então decidi gravar vídeos no YouTube do zero sobre como funciona o OOP, pelo menos ele será de alguma utilidade. De qualquer forma, dentro de algum tempo o ramo acabará na sucursal.