-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCoding Guidelines Backend
156 lines (137 loc) · 5.57 KB
/
Coding Guidelines Backend
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
Coding Guidelines Backend:
- Konstanten und Enumerationen werden nur in Großbuchstaben benannt und mit Unterstrich unterteilt
- const int DAS_IST_EINE_KONSTANTE = 0;
- enum DAS_IST_EINE_ENUMERATION {
}
- Variablen beginnen immer mit einem kleinen Buchstaben und folgen zusätzlich dem Camel-Case Prinzip:
- int dasIstEinBeispielFürEinenKorrektenVariablenNamen = 0;
- Grundsätzlich darauf achten möglichst in kurzen zusammenhängenden Worten zu erklären was es für eine Variable ist
- int beispielKorrekterVariablenName = 0;
- Klassen und Funktionen beginnen immer mit einem großen Buchstaben und folgen zusätzlich dem Camel-Case Prinzip
- class DasHausKlasse { }
- public void RechneWert();
- Getter Funktionen sollten immer mit Get anfangen
- int GetAmount();
- String GetText();
- Setter Funktionen sollten immer mit Set anfangen
- void SetZahl(int zahl);
- void SetText(string text);
- Asynchrone Funktionen sollten immer mit Async enden
- async Task SetZahlAsync(int zahl);
- async Task SetTextAsync(string text);
- Funktionen die einen boolschen Rückgabewert besitzen sollten immer mit Is anfangen
- bool IsValid();
- async Task<bool> IsCalculationErrorAsync();
- Interfaces beginnen immer mit einem großen I im namen und erweitern, wenn möglich, einen Klassennamen
- interface IApfel { }
- class Apfel : IApfel { }
- Data-Transfer-Object-Klassen enden immer mit Dto bzw. CreateDto im Namen und werden zusammen innerhalb einer gemeinsamen Datei deklariert
- class ApfelDto { }
- class ApfelCreateDto { }
- Repository-Namen setzen sich aus dem Name der Model-Klasse + Repository zusammen
- class ApfelRepository { }
- Services Namen setzen sich aus dem Name der Model-Klasse + Service zusammen
- class ApfelService { }
- Controller Namen setzen sich zusammen aus Name der Model-Klasse + Controller
- class ApfelController { }
- Kommentare werden immer dann definiert wenn irgendetwas einer zusätzlichen Erklärung Bedarf
// Als Faustformel dürft ihr das euch in die Lage des aus eurer Einschätzung nach unwissendsten Teammembers versetzen
- weil nicht trivial
- /// <summary>
/// die dauer des events in x.y stunden
/// </summary>
public float Duration { get; set; }
- weil komplex im Umfang bzw. Logik
- /// <summary>
/// Getter für event mit allen includes anhand id
/// </summary>
/// <param name="id">id</param>
/// <returns>event</returns>
Task<Event> GetEventByIdWithAllIncludesAsync(long id);
- Test Namen setzen sich zusammen aus Name der zu testenden Klasse + Tests
- class ApfelTests { }
- Testmethodennamen setzen sich zusammen aus dem Namen der zu prüfenden Methode + Prüfungsinhalt + erwartetes Ergebnis
- public async void GetByZipcodeAsync_SearchWithExistingZipcode_ReturnsSingleAddress();
- public void Registration_CorrectData_AssertPassed();
- Tests setzen sich zusammen aus einem
- Arrange Bereich für das Definieren der Mocks und Testdaten
- einem Act Bereich, wo tatsächlich die Tests ausgeführt werden
- und einem Assert Bereich, wo die Ergebnisse abgeglichen werden
- Grundsätzlich ist nach jeder geschlossenen geschweiften Klammer eines Statements eine zusätzliche Leerzeile einzuhalten
- if (a > b) {
DoSomething();
}
b += 2;
...
- while (a < b) {
DoSomething();
}
b += 2;
- Grundsätzlich ist jede zusätzliche Logikebene durch einen Tabulator abzugrenzen und sicherzustellen das die schließenden geschweiften Klammern auf der selben Höhe liegen wie das statement
- if (a < b) {
if (b > c) {
while (d < c) {
DoSomething();
}
}
for (int i = 0; i < 5; i++) {
DoSomethingElse();
}
}
- Grundsätzlich sollte immer erst dann eine lokale Variable angelegt werden, wenn mind. 2x auf diesen Wert zugegriffen wird
- int a = 3;
if (a + b > 4) {
DoSomething();
}
int c = a + b;
- Exceptions sollten immer so stark typisiert gefangen werden wie möglich und nicht einfach nur anhand von catch (Exception e)
- try {
kritischerCode();
}
catch (SpecificExceptionVariant1 e) {
DoSomething();
}
catch (SpecificExceptionVariant2 e) {
DoSomethingElse();
}
- Lambda Expressions welche mehr als eine Zeile code beinhalten sollten immer durch einen Zeilenumbruch eingeleitet werden
- x.ForEach(
(x) =>
{
x.Enabled = false;
x.Failed = true;
}
);
- Linq expressions sollten immer nach jedem neuen Methodenaufruf eine neue Zeile einleiten
- return Entities
.Include(x => x.Apfel)
.ThenInclude(y => y.Birnen)
.ToListAsync();
- Grundsätzlich sollten zuerst
alle Enumerationen,
dann Konstanten,
dann public Variablen,
dann private Variablen,
dann konstruktoren,
dann public Properties,
dann public Methoden
und danach alle private Methoden deklariert werden
und bei Properties / Methoden darauf achten das sie durch eine Leerzeile von einander getrennt sind
- public class Apfel {
enum WOCHENTAG {
MONTAG,
DIENSTAG
}
public const int KONSTANTE = 1;
public int zahl = 3;
private string text = string.empty;
public Apfel(string text) {
this.text = text;
}
public string Text { get; set; }
public int Zahl { get; set; }
public void DoSomething() { };
public void DoSomethingElse() { };
private void DoNothing() { };
private int GetNothing() { };
}