Styler
Der Styler bringt das Design des Quellcodes schnell in Einklang mit dem empfohlenen Standard. Dadurch sieht der Code professionell und leicht lesbar aus. Ein gut gestalteter Code ist in Zukunft viel einfacher zu analysieren, sowohl für den Autor als auch für andere Benutzer. Um Styler zu starten, klicken Sie auf Styler im Menü Extras oder drücken Sie Strg+,.
- Änderungen im Code-Design von Styler können rückgängig gemacht werden. Tippen Sie auf Rückgängig im Menü Bearbeiten oder Strg+Z drücken.
- Der Styler unterstützt eine Vielzahl von Kodierungsstandards. Der Stil kann in den Editoreinstellungen geändert werden. Die Gestaltungsregeln für den empfohlenen MetaQuotes-Stil werden im Folgenden ausführlich beschrieben.
|
Allgemein
Die folgenden Arten von Aktionen stehen zur Verfügung, um den Code im Styler korrekt zu formatieren:
- Ersetzen bestimmter Zeilen durch bestimmte Zeilen;
- Ausrichten der Operatoren der Sprache;
- Einfügen von Kommentaren in einen Datei-Header;
- Einfügen von Kommentaren vor Funktionen, Strukturen, Klassen und deren Methoden;
- Einfügen von Kommentaren am Ende einer Datei.
Basierend auf den oben genannten Arten von Aktionen nimmt Styler die folgende Anpassung vor:
Leerzeichen und leere Zeilen
Das Entfernen unnötiger Leerzeichen ermöglicht es Ihnen, einen Code kompakter zu gestalten und seine Wahrnehmung zu verbessern. Außerdem ersetzt Styler jedes Tabulatorzeichen durch drei Leerzeichen, um mögliche Verzerrungen seiner Formatierung beim Öffnen in Programmen von Drittanbietern zu vermeiden.
Styler entfernt Leerzeichen:
- Am Ende der Zeilen;
- Vor ";";
- Zwischen "if" und "(", "while" und "(", "for" und "(", "switch" und "(", "return" und "(".
- Nach ";" innerhalb "for()";
- Nach "!";
- Nahe "(" und ")";
- Nahe "<" und ">";
- Nahe "|" und "^";
- Nahe "+", "-", "/" und "%";
- Nahe "[" und "]";
- Nahe "==" und "==";
- Nahe "!=" und "!=";
- Nahe "<=" und ">=";
- Nahe "+=" und "+=";
- Nahe "-=" und "-=";
- Nahe "*=" und "*=";
- Nahe "/=" und "/=";
- Nahe "<<" und ">>";
- Ein Leerzeichen rechts und links von "," und "=".
Styler setzt:
- Ein Leerzeichen rechts und links von "||" und "&&" (Ergebnis: " || " und " && ").
Andere Ersetzungen:
- Bei der Konstruktion von Typen wie "int* a". Die Zeichen "*" und "&" beziehen sich auf eine Variable und nicht auf einen Typ, so dass das ersetzt wird durch "int *a";
- Doppelte Leerzeilen werden durch eine ersetzt.
Vor der Formatierung
|
Nach der Formatierung
|
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)
{
}
}
}
}
}
|
Der Tabulator des Stylers verwendet immer 3 Leerzeichen unabhängig von den Einstellungen des MetaEditor.
|
Ausschließen von Ersetzungen beim Formatieren unter Berücksichtigung der Ausrichtung mehrerer Zeilen
Die oben angegeben Ersatzregeln werden in manchen Fällen nicht verwendet. Das ist notwendig, um Verletzungen des Copyrights durch benachbarte Zeilen zu vermeiden. Der Styler erkennt die Ausrichtung mehrerer Zeilen in der nächsten Zeile durch folgende Schlüsselworte und Symbole:
- "//" – Symbol eines Kommentars in C;
- "{" – eröffnende geschweifte Klammer;
- "}" – schließende geschweifte Klammer;
- "return" – "return" Operator;
- "delete" – "delete" Operator;
- "=" – Gleichheitssymbol;
- ":" – Doppelpunkt;
- "." – Punkt.
Wenn der Styler während der Analyse eines der oben erwähnten Wörter oder Symbole an den gleichen Positionen wie in der vorherigen Zeile findet, werden die Ersetzungen nicht durchgeführt.
Formatierungsfunktionen und Operatoren
- Zwei Leerzeichen einer Deklaration eines Typs einer Funktion oder eines Operators werden vor den Symbolen "{" und "}" gesetzt, die eine Funktion oder einen Operator öffnen der schließen.
- Drei Leerzeichen werden zu Anfang jeder Zeile zwischen den Klammern "{" und "}" platziert.
- Falls es unverschlossene Klammern "{" or "}" bei Anweisungen mit einem Text gibt, werden diese Klammern in verschiedene Zeilen platziert.
- Die Ausrichtung berücksichtigt auch den Inhalt der vorherigen Zeile. Wenn die vorherige Zeile eine nicht geschlossene Klammer oder einen unvollendeten arithmetischen Ausdruck enthält, beginnt die aktuelle Zeile mit der ersten Position nach "(" oder "=" der vorerigen Zeile.
- Die Bedingung "else" wird immer an der gleichen Position wie das "if" gesetzt.
Vor der Formatierung
|
Nach der Formatierung
|
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);
}
}
|
Die Ausrichtung beim Deklarieren von Strukturen, Klassen und Enumerationen
Für solche Ausdrücke werden auch die sogenannte zweistufige Tabellierung verwendet:
- Drei Leerzeichen werden vor ein Typ eines beschriebenen Mitglieds oder Methode eingefügt.
- Namen der beschriebenen Struktur oder Klassenmitglieder oder Methoden werden ab der 22. Stelle einer Zeile angezeigt;
- Bezeichner der Mitglieder und Methoden ("private", "protected", "private" und "virtual") werden alle gemäß dem Wort "class" ausgerichtet.
Vor der Formatierung
|
Nach der Formatierung
|
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;
};
|
Ausrichtung von Kommentaren
Kommentare sind in Deklarationen und Definitionen unterschiedlich ausgerichtet:
- Kommentare der ersten Ebene in einer Funktions- oder Methodendefinition sind nach links ausgerichtet (ohne Einrückung);
- Kommentare der ersten Ebene in einer Deklaration werden an der dritten Position in einer Zeile ausgerichtet.
- Kommentare der folgenden Ebenen werden gleichmäßig auf die entsprechende Ebene der Operatoren ausgerichtet, in denen sie angegeben sind.
Vor der Formatierung
|
Nach der Formatierung
|
void myFunction() {
//--- 1st level comment
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);
//--- 2nd level comment
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
else {
ObjectSetInteger(0,name,OBJPROP_STATE,false);}
}
|
void myFunction()
{
//--- 1st level comment
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);
//--- 2nd level comment
if(!state)
ObjectSetInteger(0,name,OBJPROP_STATE,false);
}
else
{
ObjectSetInteger(0,name,OBJPROP_STATE,false);
}
}
|
class CTradePad
{
private:
int m_rows;
//--- number of lines
int m_columns;
//--- number of columns
int m_button_width;
//--- cell width
};
|
class CTradePad
{
private:
int m_rows;
//--- number of lines
int m_columns;
//--- number of columns
int m_button_width;
//--- cell width
};
|
Einfügen von Kommentaren
Ein Kommentar der folgenden Form wird eingefügt, wenn er zu Beginne einer Datei fehlt:
//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright © 2009, CompanyName.|
//| http://www.companyname.net |
//+------------------------------------------------------------------+
|
Kommentar der folgenden Form werden vor Funktionen, Klassen, Strukturen etc. eingefügt, wen sie fehlen:
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
|
Eine abschließende Kommentarzeile wird am Ende einer Datei eingefügt:
//+------------------------------------------------------------------+
|