Estilizador
El estilizador le permite adecuar rápidamente el diseño del código fuente al estándar recomendado. Esto hace que el código sea fácil de leer y se vea profesional. Un código formateado correctamente resulta más fácil de leer y analizar en el futuro tanto para su autor, como para otros usuarios. Para iniciar el estilizador, haga clic en " Estilizador" en el menú "Servicio" o "Ctrl+,".
- Los cambios en el formateo del código realizados por el estilizador se puede cancelar. Pulse " Deshacer" en el menú "Editar" o "Ctrl+Z".
- El estilizador ofrece soporte a multitud de estándares para dar forma al código. Podrá cambiar el estilo en los ajustes del editor. Más abajo se describen las reglas de diseño para el estilo recomendado de MetaQuotes.
|
Descripción general
Para dar la forma correcta al código, en el estilizador están previstas las siguientes acciones con el código:
- Reemplazo de líneas especificadas con otras líneas especificadas;
- Alineación de operadores del lenguaje;
- Inserción de comentarios en el encabezamiento del archivo;
- Inserción de comentarios antes de las funciones, estructuras, clases y sus métodos;
- Inserción de comentarios al final del archivo.
El estilizador realiza la siguiente corrección basándose en los tipos de acciones arriba mencionados:
Espacios y líneas vacías
La eliminación de los espacios sobrantes permite hacer el código más compacto, mejorando de esta manera su percepción. Además, el estilizador reemplaza cada símbolo de tabulación con tres espacios para evitar las posibles deformaciones de su formateo al abrirlo en otros programas.
El estilizador elimina los espacios:
- Al final de las líneas;
- Antes del símbolo ";";
- Entre "if" y "(", "while" y "(", "for" y "(", "switch" y "(", "return" y "(".
- Después de ";" dentro de "for()";
- Después de "!";
- Junto a "(" y ")";
- Junto a "<" y ">";
- Junto a "|" y "^";
- Junto a "+", "-", "/" y "%";
- Junto a "[" y "]";
- Junto a "==" y "==";
- Junto a "!=" y "!=";
- Junto a "<=" y ">=";
- Junto a "+=" y "+=";
- Junto a "-=" y "-=";
- Junto a "*=" y "*=";
- Junto a "/=" y "/=";
- Junto a "<<" y ">>";
- Un espacio a la derecha e izquierda de "," y "=".
El estilizador pone:
- Un espacio a la izquierda y a la derecha para "||" y "&&" (resultado: " || " y " && ").
Otras sustituciones:
- En las construcciones del tipo "int* a" los símbolos "*" y "&" se refieren a la variable, y no a su tipo. Por este motivo, esta construcción es reemplazada con "int *a";
- Las líneas en blanco dobles se reemplazan con una línea.
Antes del formateo
|
Después del formateo
|
void myFunction()
{
if (I < 10)
{
printf (Hello\n) ;
if (I < 5 )
{
printf (i<5 !\n) ;
if (i < 3)
{
printf (i<3 !\n) ;
if (i < 2)
{
}
}
}
}
}
|
void myFunction()
{
if(I<10)
{
printf(Hello\n);
if(I<5)
{
printf(i<5 !\n);
if(i<3)
{
printf(i<3 !\n);
if(i<2)
{
}
}
}
}
}
|
El tamaño de tabulación del estilizador siempre es de tres espacios, independientemente de los ajustes del MetaEditor.
|
Excepciones de reemplazos durante el formateo teniendo en cuenta la alineación interlineal
Las reglas de reemplazos especificadas más arriba no se aplican en algunas ocasiones. Esto se implementa así para que las líneas adyacentes no alteren la alineación del autor. El estilizador reconoce la alineación interlineal por la línea adyacente para las siguientes palabras clave y símbolos:
- "//" – símbolos del comentario "C";
- "{" – llave izquierda;
- "}" – llave derecha;
- "return" – operador "return";
- "delete" – operador "delete";
- "=" – símbolo de igualdad;
- ":" – dos puntos;
- "." – punto.
Si durante el análisis de una línea el estilizador encuentra una de las palabras (símbolos) arriba mencionados en la misma posición que en la siguiente línea, o en la anterior, entonces no se realizan los reemplazos en ella.
Formateo de funciones y operadores
- Antes de los símbolos "{" y "}" que abren y cierran una función/operador se ponen dos espacios desde la declaración del tipo de la función/operador.
- Antes de cada línea que se encuentra entre los símbolos "{" y "}" de la función/operador se establecen tres espacios desde el inicio del operador.
- En caso de haber símbolos "{" o "}" no cerrados en un operador con algún texto dentro, estos símbolos y el texto se colocarán en líneas diferentes.
- Además, la alineación se realizará tomando en cuenta el contenido de la línea anterior. Si en la línea anterior un paréntesis no está cerrado o una expresión aritmética no está finalizada, entonces la línea actual comenzará desde la primera posición tras "(" o "=" de la línea anterior.
- La condición "else" siempre se coloca en la misma posición que "if";
Antes del formateo
|
Después del formateo
|
void myFunction() {
int k[10],t=0;
for(int i=0;i<10;i++){
k[i]=i;
t+=i;}
if (button==name) {
bool state=ObjectGetInteger(0,name,OBJPROP_STATE);
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
else {
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
}
|
void myFunction()
{
int k[10],t=0;
for(int i=0;i<10;i++)
{
k[i]=i;
t+=i;
}
if(button==name)
{
bool state=ObjectGetInteger(0,name,OBJPROP_STATE);
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);
}
else
{
ObjectSetInteger(0,name,OBJPROP_STATE,false);
}
}
|
Alineación durante la declaración de estructuras, clases y enumeraciones
En estas expresiones se utiliza la llamada tabulación de dos niveles:
- Antes de la indicación del tipo de miembro/método que se describe, se colocan tres espacios;
- Los nombres de los miembros o métodos de la estructura o clase descritos se indican desde la posición 22 en la línea;
- Los especificadores de acceso a los miembros y métodos ("private", "protected", "private" y "virtual") se alinean según la palabra "class".
Antes del formateo
|
Después del formateo
|
class CTradePad {
private:
int m_rows;
int m_columns;
int m_button_width;
int m_button_height;
int m_top;
int m_left;
int m_left_previous_header;
};
|
class CTradePad
{
private:
int m_rows;
int m_columns;
int m_button_width;
int m_button_height;
int m_top;
int m_left;
int m_left_previous_header;
};
|
Alineación de comentarios
Existen diferencias entre la alineación de los comentarios en las declaraciones y las definiciones:
- Los comentarios del primer nivel en la definición de una función o método se alinean por la izquierda (sin sangría);
- Los comentarios del primer nivel en la declaración se alinean por la tercera posición en la línea;
- Los comentarios de los siguientes niveles se alinean por el nivel correspondiente de los operadores en los que están especificados.
Antes del formateo
|
Después del formateo
|
void myFunction() {
//--- comentario del 1 nivel
int k[10],t=0;
for(int i=0;i<10;i++){
k[i]=i;
t+=i;}
if (button==name) {
bool state=ObjectGetInteger(0,name,OBJPROP_STATE);
//--- comentario del 2 nivel
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
else {
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
}
|
void myFunction()
{
//--- comentario del 1 nivel
int k[10],t=0;
for(int i=0;i<10;i++)
{
k[i]=i;
t+=i;
}
if(button==name)
{
bool state=ObjectGetInteger(0,name,OBJPROP_STATE);
//--- comentario del 2 nivel
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);
}
else
{
ObjectSetInteger(0,name,OBJPROP_STATE,false);
}
}
|
class CTradePad
{
private:
int m_rows;
//--- número de filas
int m_columns;
//--- número de columnas
int m_button_width;
//--- ancho de celda
};
|
class CTradePad
{
private:
int m_rows;
//--- número de filas
int m_columns;
//--- número de columnas
int m_button_width;
//--- ancho de celda
};
|
Insertar comentarios
El comentario de este tipo se inserta en el encabezado del archivo en caso de que no haya:
//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright © 2009, CompanyName.|
//| http://www.companyname.net |
//+------------------------------------------------------------------+
|
Los comentarios de este tipo se insertan antes de las funciones, clases, estructuras, etcétera, en caso de que no haya:
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
|
Al final del archivo se inserta el comentario interceptado del siguiente tipo:
//+------------------------------------------------------------------+
|