Intellisense em Funções de Projeto

 

Olá! Podem me ajudar?

Criei um projeto de EA subdividindo as funções em vários arquivos .MQ5 para melhor controle na programação.

Diferente de manter todas as funções num menos .MQ5, ao se digitar o nome da função não vemos o editor "mostrar o nome" da função (ou mais especificamente, Intellisense), o que me obriga muitas vezes a fazer uma busca (Find) para ter o nome correto, incluindo maiúsculas/minúsculas e eventuais "underscore" que utilizo.

Haveria algum meio de se definir a função de forma que ela seja encontrada ao ser referenciada em outro .MQ5 do mesmo Projeto?

Muito agradecida!

 
AliceRioBR:

...

Use Objetos e não terá essa dificuldade.

 
Jonathan Pereira:

Use Objetos e não terá essa dificuldade.

Oi Jonathan, desculpe pela demora e obrigada.

Imagine por exemplo funções que pegam Arrays/Séries para criticas ou recebam variáveis, hora como ponteiros, hora como váriáveis locais, hora como variáveis globais (tudo isso depende de vários contextos).

A questão é que estamos falando de dezenas de funções e criticas e entendo que tais modulos não podem ser definidos como "classes" ou "objetos" - estarei errada?

Poderia me dar um pequeno exemplo?

Agradecida!

 
AliceRioBR:

...

@AliceRioBR o problema que você enfrenta me parece muito mais conceitual, do que qualquer outra coisa. Pois Orientação a objetos é muito mais do que criar uma classe, é um padrão de desenvolvimento.

Orientação a Objetos segue 4 pilares fundamentais.

-Abstração

-Encapsulamento

-Herança

-Polimorfismo

Na imagem vemos uma comparação muito clara entre a programação estruturada e a  programação orientada a objetos no que diz respeito aos dados. Repare que, no paradigma estruturado, temos procedimentos (ou funções) que são aplicados globalmente em nossa aplicação. No caso da orientação a objetos, temos métodos que são aplicados aos dados de cada objeto. Essencialmente, os procedimentos e métodos são iguais, sendo diferenciados apenas pelo seu escopo.


Quando você diz "A questão é que estamos falando de dezenas de funções e criticas e entendo que tais modulos não podem ser definidos como "classes" ou "objetos" - estarei errada?"

Ai eu pergunto, por que você entende isso?

 
Jonathan Pereira:

@AliceRioBR o problema que você enfrenta me parece muito mais conceitual, do que qualquer outra coisa. Pois Orientação a objetos é muito mais do que criar uma classe, é um padrão de desenvolvimento.

Orientação a Objetos segue 4 pilares fundamentais.

-Abstração

-Encapsulamento

-Herança

-Polimorfismo

Na imagem vemos uma comparação muito clara entre a programação estruturada e a  programação orientada a objetos no que diz respeito aos dados. Repare que, no paradigma estruturado, temos procedimentos (ou funções) que são aplicados globalmente em nossa aplicação. No caso da orientação a objetos, temos métodos que são aplicados aos dados de cada objeto. Essencialmente, os procedimentos e métodos são iguais, sendo diferenciados apenas pelo seu escopo.


Quando você diz "A questão é que estamos falando de dezenas de funções e criticas e entendo que tais modulos não podem ser definidos como "classes" ou "objetos" - estarei errada?"

Ai eu pergunto, por que você entende isso?


Excelente resposta Jonathan, muito obrigada!

Entendo que para definir um OBJETO em última análise estou encapsulando uma CLASSE.

Enfim, meu maior problema (e talvez eu não tenha sido muito clara) é que mesmo TUDO estando de forma GLOBAL, várias funções estão em arquivos MQ5 separados e o Intellisense do editor não as vê - apesar de compilar sem problemas. 

Talvez, se eu criasse uma classe (ou um Objeto se preferir) onde todas as funções estivessem presentes, conseguisse vê-las... mas para isso, acho que eu teria que criar uma DLL à parte e só então fazer o #INCLUDE dela.  Isso me traz um problema de manutenção; pelo menos vejo assim pois gostaria que tudo estivesse de forma unida num só projeto.

Obrigada pela ajuda e paciência.

 
AliceRioBR:


Excelente resposta Jonathan, muito obrigada!

Entendo que para definir um OBJETO em última análise estou encapsulando uma CLASSE.

Enfim, meu maior problema (e talvez eu não tenha sido muito clara) é que mesmo TUDO estando de forma GLOBAL, várias funções estão em arquivos MQ5 separados e o Intellisense do editor não as vê - apesar de compilar sem problemas. 

Talvez, se eu criasse uma classe (ou um Objeto se preferir) onde todas as funções estivessem presentes, conseguisse vê-las... mas para isso, acho que eu teria que criar uma DLL à parte e só então fazer o #INCLUDE dela.  Isso me traz um problema de manutenção; pelo menos vejo assim pois gostaria que tudo estivesse de forma unida num só projeto.

Obrigada pela ajuda e paciência.

Pq DLL ??

 
Jonathan Pereira:

Pq DLL ??

Porque meu problema é justamente VER no Intellisense as dezenas de funções que estão em outros MQ5 de um mesmo projeto...

O editor só me mostra as funções que estão no arquivo/módulo específico que estou...

Se eu tentar digitar uma outra função de outro módulo/arquivo, ele simplesmente não me mostra.

 
AliceRioBR:

Porque meu problema é justamente VER no Intellisense as dezenas de funções que estão em outros MQ5 de um mesmo projeto...

O editor só me mostra as funções que estão no arquivo/módulo específico que estou...

Se eu tentar digitar uma outra função de outro módulo/arquivo, ele simplesmente não me mostra.

@AliceRioBR me desculpe mas vc não entendeu e esta bem perdida quando a isso.

vou repostar um trecho da primeira resposta "o problema que você enfrenta me parece muito mais conceitual, do que qualquer outra coisa."

qualquer include pode ser considerado um modulo, agora, criar uma DLL não tem nada haver com o que estamos falando.

Basta vc modelar sua aplicação para que tais "funções" estejam mapeadas. Não sei dizer se é um Bug do editor, mas ele funciona assim, só vai entender métodos de classe, se vc tem um arquivo .mqh com funções soltas no seu namespace ele não reconhece, mesmo que dentro de tais arquivos .mqh vc crie namespaces isso não resolverá, já testei.

Existem vários e vários artigos que exploram o desenvolvimento de aplicações 100% orientado a objetos, no codebase existem vários e vários exemplos de códigos que usam orientação a objetos.

Basta entender o paradigma da orientação a objetos que fica mais claro. Talvez seja o caso de dar alguns passos para trás antes de seguir com o desenvolvimento. Em um sistema orientado a objetos é muito mais simples dar manutenção e manter esse código, uma vez que a reutilização e abstração de código é necessário.

Já desisti de dar manutenção em códigos de amigos e conhecidos por serem verdadeiros frankensteins.


Enfim, espero ter ajudado.

 
Jonathan Pereira:

@AliceRioBR me desculpe mas vc não entendeu e esta bem perdida quando a isso.

vou repostar um trecho da primeira resposta "o problema que você enfrenta me parece muito mais conceitual, do que qualquer outra coisa."

qualquer include pode ser considerado um modulo, agora, criar uma DLL não tem nada haver com o que estamos falando.

Basta vc modelar sua aplicação para que tais "funções" estejam mapeadas. Não sei dizer se é um Bug do editor, mas ele funciona assim, só vai entender métodos de classe, se vc tem um arquivo .mqh com funções soltas no seu namespace ele não reconhece, mesmo que dentro de tais arquivos .mqh vc crie namespaces isso não resolverá, já testei.

Existem vários e vários artigos que exploram o desenvolvimento de aplicações 100% orientado a objetos, no codebase existem vários e vários exemplos de códigos que usam orientação a objetos.

Basta entender o paradigma da orientação a objetos que fica mais claro. Talvez seja o caso de dar alguns passos para trás antes de seguir com o desenvolvimento. Em um sistema orientado a objetos é muito mais simples dar manutenção e manter esse código, uma vez que a reutilização e abstração de código é necessário.

Já desisti de dar manutenção em códigos de amigos e conhecidos por serem verdadeiros frankensteins.


Enfim, espero ter ajudado.

Entendi.

E sim, entendo que utilizar OBJETOS (definido-os e apagando-os) deixa até a memória mais enxuta. Mas será um trabalho do cão, na medida que as funções são usadas em vários locais do programa e em outras funções - na verdade um código bastante enxuto que tem por base utilizar o mínimo de funções altamente parametrizadas, justamente para servirem a diversos propósitos.

E voltamos ao que eu disse sobre CLASSE, ou seja, criar classes de funções "genéricas" - mas não creio que isso auxilie no Intellisense do editor.

Enfim, muito obrigada pela ajuda.

 
AliceRioBR:

Porque meu problema é justamente VER no Intellisense as dezenas de funções que estão em outros MQ5 de um mesmo projeto...

O editor só me mostra as funções que estão no arquivo/módulo específico que estou...

Se eu tentar digitar uma outra função de outro módulo/arquivo, ele simplesmente não me mostra.

Sou programador desde criança. Uma coisa em aprendi... Um IDE tem que se adaptar a você, e não você ao IDE...


Experimente usar o Microsoft Visual Studio Code.

É perfeito?  NÃO.

Pode dar merda? SIM.

É melhor que o MetaEditor? SEM DÚVIDA.

Tem que ser um programador bom pra configurar e usar? SIM!

Depois de experimentar o VSC, você voltaria a programar no MetaEditor?  JAMAIS!

É difícil configurar essa po***?  SIM!

Vale a pena? SIM!!!

------

Exemplo besta:   CTRL-Click no Nome do #include ou da Função referenciada, e ele te leva/abre o arquivo referenciado...

------


Desde JUL/2018 uso o VSC...  segue meu post sobre como consegui...

https://www.mql5.com/en/blogs/post/719548

How to Code & Compile MQL5 in Visual Studio - A Complete Guide
How to Code & Compile MQL5 in Visual Studio - A Complete Guide
  • 2018.07.17
  • www.mql5.com
Well, we are talking here about the Open Source project from Microsoft called Visual Studio Code. It is completely FREE for personal and commercial use. Download it from here: code.visualstudio.com. Install it - the process is plain simple and common. Then, launch it. VSC will automatically launch a web page with initial tutorials, it is a good...
 
Flavio Jarabeck:

Sou programador desde criança. Uma coisa em aprendi... Um IDE tem que se adaptar a você, e não você ao IDE...

....

Eu uso o VsCode desde julho de 2015, e realmente é sem duvidas o melhor "editor de texto" que eu ja usei, no inicio era cheio de buracos mas em pouco tempo evoluiu absurdamente, a ideia de ter os complementos programáveis em NodeJs tornou o que é hoje, eu uso para tudo, PLSQL, SQL(MySQL, Postrgress, SAP-HANA, Oracle), Java, JavaScript, Pyrhon.
Mas para MQL eu ja tentei e não consegui completamente, por apenas um motivo, a falta de poder debugar, se desse eu só usaria ele para programar em MQL, eu ja ate havia feito os procedimentos que vc fela no seu post para poder compilar e navegar entre os modulos, mas debugar com print me deixa doido. Embora seja necessário as vezes no MetaEditor, enfim, hoje eu faço assim, programo no VsCode e debugo pelo MetaEditor. Com a experiencia a gente consegue ir programando sem ter que rodar, porem as vezes surgem umas situações que o debug salva a "vida".


Ontem eu havia visto esse seu post, MUITO BOM por sinal, ia inclusive sugerir.