Uma pergunta para os especialistas do OOP. - página 4

 
Igor Makanu:

Os modificadores de direitos de acesso permitem detectar erros no momento da compilação

Em geral, tudo isso não complica o trabalho com as aulas, não o utilize, escreva tudo em público: e então será mais fácil trabalhar com eles.

SZZY: Muitas frases bonitas sobre OOP, encapsulamento e herança... Tudo isso é bom, mas a vantagem mais importante do OOP sobre outros estilos de programação é o armazenamento de todos os dados (campos de classe) e funções de trabalho com esses dados (métodos de classe) em um só lugar (classe) - em livro é o encapsulamento. Além disso, o uso do OOP depende da tarefa, se a tarefa permitir escalar classes, será necessária uma hierarquia e haverá classes base e seus descendentes - se usá-lo, depende de você

Todas as propriedades dos objetos também podem ser "encapsuladas" em uma matriz. Lá você também pode especificar as relações entre objetos através de propriedades específicas do ponteiro. Há ali uma ordem, pois cada propriedade é indexada e seu valor é armazenado em uma célula específica. Os objetos em si são encapsulados no núcleo. O acesso é mais simples - por número de objeto e número de propriedade. As transições entre objetos de um mesmo controle são feitas por meio de pontos de propriedades.
 
Реter Konow:
Você também pode "encapsular" todas as propriedades de um objeto em uma matriz. Você também pode especificar as relações entre objetos através de propriedades específicas do ponteiro. Há ali uma ordem, pois cada propriedade é indexada e seu valor é armazenado em uma célula específica. Os objetos em si são encapsulados no núcleo. O acesso é mais simples - por número de objeto e número de propriedade. As transições entre objetos de um mesmo controle são feitas por meio de pontos de propriedades.

isto não é conveniente em primeiro lugar!

Além disso, você já escreveu acima sobre a legibilidade do código (assim como acima você mencionou velocidade - velocidade de execução, depende de algo mais, não do estilo de programação)

em geral, como em qualquer outro lugar - você não saberá até tentar, começar a escrever em estilo OOP, você terá ações específicas e perguntas específicas, um exemplo já está neste tópico

Se estamos falando de IA, você também precisa separar os dados do trabalho com eles, com o OOP será mais fácil de fazê-lo

SZZ: O que é melhor no OOP? Por exemplo, há diferentes tipos de dados, deixe que sejam configurações de Expert Advisor em MQL, e estas configurações têm repetições em blocos. Pegamos um bloco de configurações e descrevemos campos de classe para passar estas configurações para uma classe, é mais fácil criar um construtor com parâmetros, e depois escrever métodos que funcionam com estas configurações EA. Tendo feito tudo isso, criamos um array de instâncias de classe, ou mesmo apenas algumas instâncias da classe ("variáveis tipo classe") e pronto - o problema é resolvido escrevendo uma classe, não criando vários arrays, criando métodos para identificar cada array, criando um grupo de funções que, além de fazer alterações nos arrays, não são suficientes para estragar dados que não devem ser processados nesta chamada....

ZZZY: imho, OOP é apenas conveniente, há uma certa lenda de que não há necessidade de usar OOP se não houver herança... sem comentários, vai ser um argumento de espuma sem mim

 
Igor Makanu:

isto não é conveniente em primeiro lugar!

Além disso, você já escreveu acima sobre a legibilidade do código (assim como acima você mencionou velocidade - velocidade de execução, depende de algo mais, não do estilo de programação)

em geral, como em qualquer outro lugar - você não saberá até tentar, começar a escrever em estilo OOP, você terá ações específicas e perguntas específicas, um exemplo já está neste tópico

Se estamos falando de IA, você também precisa separar os dados do trabalho com eles, com o OOP será mais fácil de fazê-lo

SZZ: O que é melhor no OOP? Por exemplo, temos diferentes tipos de dados, deixamos que sejam configurações de Expert Advisor em MQL, e estas configurações têm repetições em blocos. Pegamos um bloco de configurações e descrevemos campos de classe para passar estas configurações para uma classe, é mais fácil criar um construtor com parâmetros, e então escrever métodos que funcionam com estas configurações EA. Tendo feito tudo isso, criamos ou um array de instâncias de classe, ou mesmo apenas algumas instâncias da classe ("variáveis tipo classe") e pronto - o problema é resolvido escrevendo uma classe, não criando vários arrays, criando métodos para identificar cada array, criando um grupo de funções que, além de fazer alterações nos arrays, não são suficientes para estragar dados que não devem ser processados nesta chamada....

ZZZY: imho, OOP é apenas conveniente, há uma certa lenda de que não há necessidade de usar OOP se não houver herança... sem comentários, vai ser um argumento de espuma sem mim

Confortável ou não, questão subjetiva. Eu prefiro um layout tabular dos dados. Outros o preferem sob a forma de um cacho de uvas ou de uma árvore. Outros preferem-no como um cacho de uvas ou uma árvore. Mas, vou pensar seriamente em suas palavras e tentarei aprender os princípios básicos do trabalho com dados no OOP.
 
Реter Konow:
Confortável ou não, questão subjetiva. Eu prefiro um layout tabular dos dados. Outros o preferem sob a forma de um cacho de uvas ou de uma árvore. Outros preferem-no como um cacho de uvas ou uma árvore. Mas, vou pensar seriamente em suas palavras e tentar compreender os princípios básicos do trabalho com dados no OOP.
Já lhe disse uma vez que uma série de ponteiros para conjuntos de ponteiros é uma tabela bidimensional. Uma lista é filas, as listas que se encontram na primeira são colunas. Eles podem ter suas próprias listas. E assim por diante até que o sol se ponha. Esta é a hierarquia que você está procurando. E é realizado por apenas uma classe.
 
Реter Konow:

No OOP, um "objeto" é uma referência a uma classe na qual seus campos (propriedades) são declarados. Entendo um objeto como um conjunto de propriedades numeradas, cada uma das quais é uma célula em uma matriz. Essa é a diferença.

Peter, você precisa entender claramente que quando a própria classe é definida, nenhuma memória é alocada, mesmo que haja instâncias de outras classes dentro da classe como suas propriedades. Portanto, não pode haver nenhuma referência à classe, mas apenas ao objeto de classe. A memória é alocada quando uma instância (objeto) de uma classe é declarada (criada).

HH ou seja, se houver uma classe no programa, mas nenhuma instância dela, o compilador ignorará (não notará) essa classe.

Há uma exceção. A memória pode ser alocada quando a classe é definida para métodos e parâmetros estáticos, se houver.
 
Artyom Trishkin:
Uma vez eu lhe disse que uma série de ponteiros para conjuntos de ponteiros é uma tabela bidimensional. Uma lista é filas, as listas que se encontram na primeira são colunas. Eles podem ter suas próprias listas. E assim por diante até que o sol se ponha. Esta é a hierarquia que você está procurando. E é realizado por apenas uma classe.

Em teoria, sim. Mas é necessário organizar de tal forma que as transições entre elos hierárquicos (condicionalmente - indução e dedução, ou seja, do particular para o geral e de volta) sejam realizadas como uma cadeia. Ou seja, a ordem dos ponteiros deve ser estruturada de forma especial para permitir o movimento em qualquer direção (direita), sem "voltas" e "saltos" excessivos no laço. Portanto, um simples layout de tabela dos ponteiros provavelmente não funcionará.

Adicionado:

Mas pode funcionar. Eu ainda não sei.

 
Igor Makanu:

Precisamos colocar estas perguntas em prática, caso contrário não poderemos ver o que é conveniente e o que parece inconveniente )))).

Aqui está um exemplo trivial, que é usado em MQL cento e cinqüenta vezes - determinação de uma nova barra:

OK, este é um código de trabalho, mas e se eu precisar definir uma nova barra para 2 TFs? E se eu quiser usar todas as TFs do terminal?

seria assim no OOP:

e tudo que tenho que fazer agora é declarar várias instâncias da classeCNewbar - como? até mesmo para uma matriz, até mesmo para várias variáveis, mas tenho protegido os dados contra mudanças acidentais com o OOP

Eu já resolvi este problema publicamente. A idéia era criar uma tabela com todos os símbolos e todos os períodos de tempo e fazer um loop através dela, fixando os eventos de uma nova barra. Após a primeira chamada de qualquer função deste evento, sua bandeira é apagada da mesa. Não posso julgar como é muito mais complicado do que no OOP. Mas, na verdade, uma solução bastante simples e conveniente.

 
Nikolai Semko:
Peter, você tem que entender claramente que a própria classe não tem memória alocada, mesmo que haja instâncias de outras classes dentro da classe como suas propriedades. Portanto, não pode haver nenhuma referência à classe, mas apenas ao objeto de classe. A memória é alocada quando uma instância (objeto) de uma classe é declarada (criada).
HH ou seja, se houver uma classe no programa, mas nenhuma instância dela, o compilador ignorará (não notará) esta classe.
Eu não sabia sobre isso. Interessante. O problema é até que ponto a utilização do OOP permitirá o fácil manuseio de todos os dados hierárquicos em loops. São os loops que são os principais mecanismos de qualquer motor. Quanto melhores os laços funcionarem - mais dados você pode escavar e mais trabalho você pode fazer.
 
Quando um objeto de classe é criado, além de alocar memória para todas as propriedades (variáveis) da classe, um dos construtores é iniciado (pode haver mais de um). Os construtores podem ser não paramétricos (padrão), paramétricos (quando alguns parâmetros são especificados ao criar uma instância de uma classe, ou um construtor de cópia, quando outra instância da classe é especificada como um parâmetro de uma instância da classe.
 
Реter Konow:
Em teoria, sim. Mas é necessário organizar de tal forma que as transições entre elos hierárquicos (condicionalmente - indução e dedução, ou seja, do particular para o geral e de volta) sejam realizadas como uma cadeia. Ou seja, a ordem dos ponteiros deve ser estruturada de forma especial para permitir o movimento em qualquer direção (direita), sem "voltas" e "saltos" excessivos no laço. Portanto, um simples layout de tabela de indicadores provavelmente não funcionará.
Todas as listas já são dotadas de uma busca binária. Isto significa filtrar pela propriedade pesquisada, em vez de passar por ela uma a uma. Como resultado, obtemos o índice do item que estamos procurando.
Razão: