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 metStartCoroutine
) (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.