StyleGuide

Aus GameBrowser - Wiki

Wechseln zu:Navigation, Suche

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:

  1. <Smartpointer><Name><Pointer>

Member variablen bekommen ein m Prefix

Jede member variable bekommt ein m voran gestellt. Beispiele:

  1. std::string mMyString;
  2. int mLives;
  3. long mMoney;


Beispiele:


Klasse in einem Smartpointer als Member:

  1. SomeSmartPointer<StringTable> stringTable;

Integerarray als lokale Variable:

  1. int values[100];

Floatpointer als Globale Variable:

  1. float* value;


Lokale unsigned int Variable:

  1. unsigned int value;

Klassen und Strukturen Definitionen:

  1. class StringTable {
  2. };
  3.  
  4. struct File {
  5. };

Bei Klassen immer 2 bis 3 Dateien benuzten.

Definition von Enumerationen:

  1. struct EnumerationsName {
  2. 	enum Enumeration {
  3. 		Value1,
  4. 		Value2
  5. 	};
  6. };

Sollten enums die Möglichkeit besitzen in einen String oder von einem String geparst zu werden so sollte dies eingehalten werden:

  1. struct EnumerationsName {
  2. 	enum Enumeration {
  3. 		Value1,
  4. 		Value2
  5. 	};
  6.  
  7. 	static bool tryParse(const std::string& string, Enumeration& outEnum) {
  8. 		if(string == "Value1")
  9. 			outEnum = Value1;
  10. 		else if(string == "Value2")
  11. 			outEnum = Value2;
  12. 		else
  13. 			return false;
  14. 		return true;
  15. 	}
  16.  
  17. 	static std::string toString(Enumeration enumeration) const {
  18. 		switch(enumeration) {
  19. 			case Value1: return "Value1";
  20. 			case Value2: return "Value2";
  21. 			default: return ""; // Wenn möglich ausweichwert wählen
  22. 		}
  23. 	}
  24. };

Benamung von Methoden:

Immer lcc für Funktionsnamen (Beispiel: updateGame)


Getter/Setter welche nur einen Wert zurück liefern oder annehmen:

  1. std::string getName() const {
  2. 	return name;
  3. }
  4.  
  5. void setName(const std::string& name) {
  6. 	this.name = name;
  7. }

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:

  1. std::string getName(int index) {
  2. 	checkRange(index);
  3. 	return name[index];
  4. }
  5.  
  6. void setName(const std::string& name, int index) {
  7. 	checkRange(index);
  8. 	this.name[index] = name;
  9. }

Scopes:

Anfang eines Scopes in eine neue Zeile, es sei denn es handelt sich um einfache getter/setter in einer Klassen/Strukturdekleration.

  1. class Foo {
  2. ..
  3. 	void setName(const std::string& name) { this.name = name; }
  4. 	void bar();
  5. };
  6.  
  7. ..
  8. void Foo::bar() {
  9. 	if(name == "Foo") {
  10. 		...
  11. 	}
  12. }

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.

  1. #include "../StringTable/StringTable.h"
  2.  
  3. GameServerData* data = new GameServerData("./Data/game.xml");

Windowseigene Funktionen sollten gemieden werden. Falls doch welche im Gebrauch sind, dann nur mit entsprechenden defines.

  1. #ifdef _WINDOWS
  2. #include <windows.h>
  3. #else
  4. #include <sys/time.h>
  5. #endif
  6.  
  7. int main() {
  8. 	float time = 0.0f;
  9. 	//random Code
  10.  
  11. #ifdef _WINDOWS
  12. 	time = GetTickCount()/1000.0f; //GetTickCount: Returns time since systemstart in milli(!)seconds
  13. #else
  14. 	timeval tmp;
  15. 	gettimeofday(&tmp, NULL);      //gettimeofday: Returns time since epoch in mikro(!)seconds
  16. 	time = tmp.tv_sec + (tmp.tv_usec / 1000000.0f)
  17. #endif
  18.  
  19. 	//do_something
  20. }

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.

Navigation
Media
Werkzeuge