Moin ihr Brotfische da draußen,
dieses Tutorial richtet sich an Neulinge, Fortgeschrittene und "alte Hasen" :D. Mein Ziel ist es, Euch für gutgeschriebenen Code zu sensibilisieren. Was ich damit meine? Nein, ich meine nicht den Inhalt, es geht in diesem Tutorial ausschließlich um Äußerlichkeiten. Ich hoffe die Beispiele sind anschaulich gewählt und erläutern die Sachverhalte angemessen. Für Kritik bin jederzeit zu haben. Auf geht's!
Formatierung / Einrückung:
Jeder kennt das Problem, man beginnt zu Scripten und schreibt viele Zeilen an Code, vergisst aber diese korrekt einzurücken. Als kleines worst-Case Beispiel:
dcmd_setlevel(playerid,params[])
{
new pID, Level;
if(sscanf(params, "ud",pID,Level))return SendClientMessage(playerid,0xFF0000FF,"Benutze: /setlevel [ID][Level]!"); //Falls nur /setlevel eingegeben wurde
if (pID == INVALID_PLAYER_ID)return SendClientMessage(playerid,0xFF0000FF,"Spielerid ist nicht vorhanden!");
// Falls eine falsche ID angegeben wurde, wird 0 returnt ;)
if(Spieler[playerid][AdminLevel] > 3) // Hier wird abgefragt ob das Level des Spielers der den Befehl eingegeben hat größer als 3 ist.
{
new adminstring[128],levelsetter[MAX_PLAYER_NAME], playername[MAX_PLAYER_NAME];
GetPlayerName(pID,playername,sizeof playername);
format(adminstring,sizeof(adminstring),"Admins/%s.sav",playername);
GetPlayerName(playerid,levelsetter,sizeof(levelsetter));
Spieler[pID][AdminLevel] = Level; //Hier wird die Levelvariable mit dem neu eingegebenen Level überschrieben
dini_IntSet(adminstring,"AdminLevel",Level); // Und hier das neue Level in der Datei gespeichert.
format(adminstring,sizeof(adminstring),"%s hat dein Level auf %d gesetzt!",levelsetter, Level);
SendClientMessage(pID,0x33FF33FF, adminstring);
}
else return SendClientMessage(playerid, 0xFF0000FF, "Dein Level reicht nicht aus!");
// Falls das Level nicht ausreicht wird dieser Text gesendet.
return 1;
}
dcmd_setlevel(playerid,params[])
{
new pID, Level;
if(sscanf(params, "ud",pID,Level))return SendClientMessage(playerid,0xFF0000FF,"Benutze: /setlevel [ID][Level]!"); //Falls nur /setlevel eingegeben wurde
if (pID == INVALID_PLAYER_ID)return SendClientMessage(playerid,0xFF0000FF,"Spielerid ist nicht vorhanden!");
// Falls eine falsche ID angegeben wurde, wird 0 returnt ;)
if(Spieler[playerid][AdminLevel] > 3) // Hier wird abgefragt ob das Level des Spielers der den Befehl eingegeben hat größer als 3 ist.
{
new adminstring[128],levelsetter[MAX_PLAYER_NAME], playername[MAX_PLAYER_NAME];
GetPlayerName(pID,playername,sizeof playername);
format(adminstring,sizeof(adminstring),"Admins/%s.sav",playername);
GetPlayerName(playerid,levelsetter,sizeof(levelsetter));
Spieler[pID][AdminLevel] = Level; //Hier wird die Levelvariable mit dem neu eingegebenen Level überschrieben
dini_IntSet(adminstring,"AdminLevel",Level); // Und hier das neue Level in der Datei gespeichert.
format(adminstring,sizeof(adminstring),"%s hat dein Level auf %d gesetzt!",levelsetter, Level);
SendClientMessage(pID,0x33FF33FF, adminstring);
}
else return SendClientMessage(playerid, 0xFF0000FF, "Dein Level reicht nicht aus!");
// Falls das Level nicht ausreicht wird dieser Text gesendet.
return 1;
}
Viel übersichtlicher oder? Das Einrücken des Codes ist entweder über die Leertaste oder die Tab-Taste möglich. Eine Einrückungstiefe von 2-3 Zeichen verhindert zudem, dass Euer Code außerhalb des Schirms landet. Gute Editoren wie z.B. Notepad++ oder ähnliche ermöglichen dies einzustellen und evtl. auch den Code automatisch einzurücken.
Klammern:
Wie kommen Klammerfehler zustande? Ein kleines Beispiel:
CMD:test(playerid, params[])
{
if(IsPlayerAdmin(playerid)
{
if(IsPlayerInAnyVehicle(playerid)
{
if(IsPlayerNPC(playerid)
{
}}
return 0;
}
Bei nur unzureichender Einrückung und schlechter Platzierung der Klammern vergisst man schnell eine Klammer. Es wäre allerdings auch so möglich:
CMD:test(playerid, params[])
{
if(IsPlayerAdmin(playerid){
if(IsPlayerInAnyVehicle(playerid){
if(IsPlayerNPC(playerid){
}
}
}
return 0;
}
Letztlich ist es eine Geschmackssache, ob man die Klammern in eine neue Zeile schreibt oder noch in dieselbe.
Redundanz im Code vermeiden:
Was meine ich mit Redundanz im Code? Ganz einfach: Wiederholungen! Gewisse Codesegmente wiederholen sich und können z.B. in Funktionen ausgelagert werden. Anstatt jedes Mal folgendes zu schreiben, wenn man den Spielernamen benötigt:
new name[MAX_PLAYER_NAME]
GetPlayerName(playerid, name, sizeof(name));
folgendes Redundanzen zu vermeiden:
GetPlayerName(playerid){
new pName[MAX_PLAYER_NAME];
GetPlayerName(playerid, pName, sizeof(pName));
return pName;
}
Gleichwohl kann man nun an zentraler Stelle Änderungen an dieser Abfrage vornehmen, ohne, dass man alle im Code vorkommenden Segmente per Hand verändern muss.
Kommentare / Dokumentation:
Am wichtigsten sind jedoch Kommentare! Wieso? Code wird sehr viel häufiger nur gelesen als editiert. Auch wenn ihr nur alleine scriptet, wäre es doch möglich, dass Ihr es verkaufen oder veröffentlichen möchtet. Stellt euch vor, Ihr veröffentlicht Euer Script auf Breadfish, allerdings ohne Kommentare. Vermutlich wäre euer Thread nach kurzer Zeit voll mit Supportanfragen. Nochmals ein "kleines" Beispiel aus einem meiner Skripte:
CMD:verkaufen(playerid,params[])
Ohne Kommentare geht hier nix mehr Ihr seht, ich weiß wovon ich rede. Nehmt euch lieber die Zeit und fügt ein, was getan wird, und warum es getan wird. Es wird euch viel Zeit ersparen, solltet ihr jemals eine längere Pause eingelegt haben oder euren Code z.B. hier im Forum zu posten, weil Ihr HIlfe benötigt.
Ich hoffe ich konnte Euch einige Gedanken näher bringen. Lasst es euch nicht nehmen, Eure eigenen Ansichten Kund zu tun.