Code Conventions - Groep1Games/Gobling GitHub Wiki

Hoe bepaal je de naam?
Bij Classes:
Code Conventie
public class Enemy De naam van je Class is altijd in het engels en begint met een hoofdletter
public class EnemyShip Als je Class naam uit meerdere woorden bestaat: gebruik PascalCasing
public class EnemyShip Een Class is altijd een 'object'. Bijvoorbeeld een Wapen, Tafel, TargetFollower
Variables
Code Conventie
private int _speed De naam van je variabele is altijd in het engels en begint met een underscore, gevolgd door een kleine letter
private int _scrollSpeed Als de naam van je variabele uit meerdere woorden bestaat: gebruik camelCasing
[SerializeField] private int scrollSpeed Private serialized fields hebben geen underscore
public const string HowToPlay = "howToPlay"; Een constant schrijf je d.mv. PascalCasing en begint met een hoofdletter
public int Speed { get; } = 5; Properties (getters/setters) starten met een hoofdletter.
Functions / methods
Code Conventie
Run(); De naam van je method is altijd in het engels en begint (in C#) met een hoofdletter
RunFast(); Als de naam van je method uit meerdere woorden bestaat: gebruik PascalCasing
Shoot(); De naam van je method is een werkwoord: Shoot, Drive, Walk, Run, FollowTarget, etc.
Enums
Code Conventie
public enum BlendTypes De naam van je Enum is altijd in het engels en begint met een hoofdletter
public enum BlendTypes Als de naam van je Enum uit meerdere woorden bestaat: gebruik PascalCasing
ForceIds De naam van je Enum laat altijd goed zien dat het een verzameling 'types' is (EnemyTypes, WeaponIds, etc.).
Namespaces
Code Conventie
namespace StateMachine De naam van je namespace is altijd in het engels en begint met een hoofdletter
namespace StateMachine Als de naam van je namespace uit meerdere woorden bestaat: gebruik PascalCasing
BaseClasses
Code Conventie
public class Weapon Een baseclass heeft altijd de naam van het basisobject (wapen, bullet, state, menu, etc.)

Organisatie van de Class

Hieronder zie je de volgorde hoe wij onze code structureren. Dit helpt bij de leesbaarheid van onze classes. Deze punten geven van boven naar beneden aan waar je variables, methods en properties (getter/setters) zouden moeten staan.

1. Class variables (Velden)

  • Public variables:
    • Begin met publieke velden. Het liefste zien we geen publieke variabelen voor goede encapsulation
  • Serialized private variables:
    • Geserializeerde private velden, aanpasbaar in de Unity Editor.
  • Private variables:
    • Interne statusvariabelen van de class.

2. Properties (Getters/Setters)

  • Public properties:
    • Publieke getters en setters voor gecontroleerde toegang tot de class variables.

3. Unity lifecycle methods

  • Plaats Unity-specifieke levenscyclusmethoden in de volgorde waarin Unity ze aanroept:
    • Awake()
    • Start()
    • Update()
    • Anderen (FixedUpdate, LateUpdate, enz.)

4. Public methods

  • Methoden die kunnen worden aangeroepen door andere klassen.

5. Interface Implementaties

  • Implementaties van methoden die gedefinieerd zijn in interfaces waar de klasse zich aan houdt.

6. Protected methods

  • Methoden toegankelijk binnen de Class en zijn subclasses.

7. Private methods

  • Methoden voor intern gebruik in de klasse.

8. Statische methods en Variabelen

  • Statische methoden en variabelen, gegroepeerd naar hun toegankelijkheid (public, protected, private).

9. Coroutines

  • Groepeer coroutines (IEnumerator methoden voor gebruik met StartCoroutine) (public, protected, private).

Aanvullende Richtlijnen

  • Consistentie: Behoud consistentie in het gehele project.
  • Leesbaarheid: Prioriteer de leesbaarheid en onderhoudbaarheid van de code.
  • Refactoring: Refactor grote klassen naar kleinere, meer gefocuste componenten.

Declarations (het aanmaken van je variabelen)

Plaatsing

Declareer je variabelen alleen aan het begin van een block. Wacht niet met het declareren van je variabelen totdat je ze gaat gebruiken. Dit maakt je code verwarrend en niet overzichtelijk.

public void myMethod(){
	int int1;     	// beginning of method block
	if (condition){
    		int int2; 	// beginning of "if" block
    		...
	}
}

Gebruik van var

Gebruik 'var' inplaats van een Type als de rechterkant van je code duidelijk laat zien wat de type is.

var name = "OperationStarfall";
var strength = 255;

Aantal declaraties per regel

Zet 1 declaratie per lijn regel.

Goed voorbeeld:
var level = 5;
var size = 3;

Gebruik referenties

Gebruik lokale variabelen om referenties aan te maken naar complexe object benamingen. Dit verbetert de leesbaarheid van je code + je maakt minder fouten in je code.

Slecht voorbeeld:
int l = gameTower[i].bullet.Count;
for (int i = 0; i < l; i++){
	if(gameTower[i].bullet[j].position.x > stageWidth || gameTower[i].bullet[j].position.y > stageHeight ){
		Destroy(gameTower[i].bullet[j].gameObject);
	}
}
Goed voorbeeld:
Bullet currentBullet;
int l = gameTower[i].bullet.Count;
for (int i = 0; i < l; i++){
	currentBullet = gameTower[i].bullet[j];
	if(currentBullet.position.x > stageWidth || currentBullet.position.y > stageHeight )
		Destroy(currentBullet.gameObject);
	}
}

Gebruik van ternary operator

Gebruik een ternary operator om een if else statement op 1 regel te schrijven.

Slecht voorbeeld:
Color targetColor;
if (isSelected)
{
    targetColor = Color.red;
}
else
{
    targetColor = Color.white;
}
Goed voorbeeld:
var targetColor = isSelected ? Color.red : Color.white;

Wat is de vorm van een statement

if, if-else, if-else-if-else statement

De if-else heeft de volgende vorm:

if(condition)
{
  	statements;
}
 
if(condition)
{
  	statements;
}
else
{
  	statements;
}
 
if(condition)
{
  	statements;
}
else if (condition)
{
  	statements;
}
else if (condition)
{
  	statements;
}
Extra:

Gebruik altijd brackets {} in je if-else statements. Dit maakt je if-else statement een stuk leesbaarder dan bijvoorbeeld onderstaand voorbeeld. Hier zijn de brackets weggelaten. Dit kan als de statement maar uit 1 regel bestaat. Maar het is niet goed leesbaar voor andere developers.

if (condition)
statement;

for Statements

De for statement heeft de volgende vorm:

for (initialization;condition;update)
{
  	statements;
}

Tip: Probeer altijd een lokale variable aan te maken waarin je het aantal loops zet (vooral als je bijvoorbeeld met array.length/list.Count werkt). Anders moet je applicatie steeds opnieuw in het geheugen berekenen hoeveel de lengte is. Hierdoor wordt je performance een stuk beter.

Goed voorbeeld:
int l = bullets.Count;
for (int i = 0;i < l;i++)
{
  	statements;
}
Slecht voorbeeld:
for (int i = 0;i < bullets.Count;i++)
{
  	statements;
}

Tip: Voeg altijd een ‘break;’ toe aan je loop op het moment dat je hebt gevonden wat je zoekt. Voorbeeld:

int l = names.Count;
for (int i = 0;i < l;i++){
if(names[i] == searchValue){
	…..
	break;
}
}

Alles is standaard private

Variabelen zijn ALTIJD private. Als je andere Classes toegang wilt geven tot de variabelen dan maak je gebruik van getters&setters (zie onderaan deze pagina voor een voorbeeld). Functies zijn standaard private. Sommige maak je public op het moment dat je zeker weet dat andere Classes erbij moeten mogen. Hierdoor krijgen Classes een nette API. Ook voorkom je zo dat niet elke Class elkaars gegevens mag aanpassen.