StyleGuide
Aus GameBrowser - Wiki
Inhaltsverzeichnis |
Code Styleguide
Allgemeines
Alle funktionen und Kommentare und Klassennamen müssen in Englisch verfasst werden. Dieser Guide definiert die Richtlinien für den Code, für das GameBrowser Projekt.
Code Style: Eclipse+CDT
Einfach die Datei Datei:GameBrowserCodeStyle.xml runterladen und in Eclipse unter Window -> Preferences im Tree C/C++ -> Code Style auswählen und dorrten auf Import klicken und die XML auswählen.
Variablennamen:
Alle variablen in lcc (Beispiel: myTestVar)
Werden gebildet aus verschiedenen Komponenten:
<Smartpointer><Name><Pointer>
Member variablen bekommen ein m Prefix
Jede member variable bekommt ein m voran gestellt. Beispiele:
std::string mMyString;
int mLives;
long mMoney;
Beispiele:
Klasse in einem Smartpointer als Member:
SomeSmartPointer<StringTable> stringTable;
Integerarray als lokale Variable:
int values[100];
Floatpointer als Globale Variable:
float* value;
Lokale unsigned int Variable:
unsigned int value;
Klassen und Strukturen Definitionen:
class StringTable {
};
struct File {
};
Bei Klassen immer 2 bis 3 Dateien benuzten.
- KlassenName.h
- Hier nur die Klassendefinition
- KlassenName.cpp
- Hier werden Member Funktionen definiert (außer setter und getter welche im Header stehen können)
- KlassenName.inl
- Hier werden Template Funktionen definiert
Definition von Enumerationen:
struct EnumerationsName {
enum Enumeration {
Value1,
Value2
};
};
Sollten enums die Möglichkeit besitzen in einen String oder von einem String geparst zu werden so sollte dies eingehalten werden:
struct EnumerationsName {
enum Enumeration {
Value1,
Value2
};
static bool tryParse(const std::string& string, Enumeration& outEnum) {
if(string == "Value1")
outEnum = Value1;
else if(string == "Value2")
outEnum = Value2;
elsereturn false;
return true;
}static std::string toString(Enumeration enumeration) const {
switch(enumeration) {
case Value1: return "Value1";
case Value2: return "Value2";
default: return ""; // Wenn möglich ausweichwert wählen
}}};
Benamung von Methoden:
Immer lcc für Funktionsnamen (Beispiel: updateGame)
Getter/Setter welche nur einen Wert zurück liefern oder annehmen:
std::string getName() const {
return name;
}void setName(const std::string& name) {
this.name = name;
}
Können auch als inline in einer Klassen oder Strukturdekleration geschrieben werden.
Getter/Setter die mehr tun als nur einen simplen Wert zurück zu liefern:
std::string getName(int index) {
checkRange(index);
return name[index];
}void setName(const std::string& name, int index) {
checkRange(index);
this.name[index] = name;
}
Scopes:
Anfang eines Scopes in eine neue Zeile, es sei denn es handelt sich um einfache getter/setter in einer Klassen/Strukturdekleration.
class Foo {
..
void setName(const std::string& name) { this.name = name; }
void bar();
};
..
void Foo::bar() {
if(name == "Foo") {
...
}}
Einrückungen:
Klassen
class MoneyMan { public: MoneyMan(); ~MoneyMan(); void giveMeSomeMoney(); private: int mMyMoney; };
Switch
switch(test) { case 1: hallo(); break; case 2: hallo2(); break; default: test(); break; }
Ausnahme einzeilige Switch blöcke:
switch(enumeration) { case Value1: return "Value1"; case Value2: return "Value2"; default: return ""; }
Plattformunabhängiges Programmieren:
Backslashes werden abgeschafft. In Dateinamen sind nur Slashes gültig.
#include "../StringTable/StringTable.h"GameServerData* data = new GameServerData("./Data/game.xml");
Windowseigene Funktionen sollten gemieden werden. Falls doch welche im Gebrauch sind, dann nur mit entsprechenden defines.
#ifdef _WINDOWS#include <windows.h>#else#include <sys/time.h>#endifint main() {
float time = 0.0f;
//random Code#ifdef _WINDOWStime = GetTickCount()/1000.0f; //GetTickCount: Returns time since systemstart in milli(!)seconds
#elsetimeval tmp;gettimeofday(&tmp, NULL); //gettimeofday: Returns time since epoch in mikro(!)seconds
time = tmp.tv_sec + (tmp.tv_usec / 1000000.0f)
#endif//do_something}
Wie man sieht, wird die Lesbarkeit des Codes beeinträchtigt und die Funktionen liefern unterschiedliche Genauigkeiten zurück. Daher werden alle gebeten, dies auf ein Minimum zu beschränken und soweit es geht auf systemunabhängige Funktionen zurückzugreifen.