Inspringen
Wat veel mensen vergeten bij programmeren is dat de layout net zo belangrijk is als de inhoud van de code. Het is leuk dat een programma iets moois doet, als niemand incluis jezelf er later nog iets van snapt is het waardeloos. Belangrijkste manier om overzichtelijke code te schrijven is goede indentering. Lees bijvoorbeeld:
Fout
1
2
3
4
5
6
7
8
9
10
| if(ConditionA == true && ConditionB == false) { switch(ConditionC) { case A: printf("Tis A!"); break; case B: printf("Tis B!"); break; } } else { printf("Tis foutgelopen!"); } |
Tegenover:
Goed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| if(ConditionA == true && ConditionB == false) { switch(ConditionC) { case A: printf("Tis A!"); break; case B: printf("Tis B!"); break; } } else { printf("Tis foutgelopen!"); } |
De control flow van de tweede variant is een stuk sneller te analyseren, wat je helpt bij debuggen en wat ons helpt bij het begrijpen van jouw code. Er zijn meerdere manieren van indenteren:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| // Inspringen achter nest if(Condition) { // Do something } // Inspringen op blok if(Condition) { // Do something } // Inspringen achter code if(Condition) { // Do something } |
Dit zijn de 3 meest gebruikte indenteringsvormen, en ondanks dat de 3e de compactste is kun je die het beste niet gebruiken: vooral achter lange if- en while-statements zie je de accolade nogal eens over het hoofd. De eerste 2 zijn een kwestie van smaak, net zoals of je inspringt met 2 of 4 spaties. Andere aantallen spaties worden zelden gebruikt.
Wat je ook kiest: wees consequent!!! Niets is zo irritant lezen als opeenvolgende stukken code met andere indenteringsmethodes...
Ook bij het schrijven van functies met veel parameters en/of baseclasses moet je je indenteringen in de gaten houden, bijvoorbeeld een constructor als deze:
1
2
3
4
5
6
7
8
| MyClass::MyClass(const MyClass &p_Parent, int p_ClassIndex, const String &p_Name) :MyBaseClass(p_Parent, p_ClassIndex), m_Name(p_Name) { // Constructor code } |
Dit soort dingen moet je een beetje een eigen stijl in ontdekken, zolang het maar overzichtelijk en consequent is gaat het meestal wel goed.
Naamgeving
De naamgeving binnen code is een heel belangrijk element van de onderhoudbaarheid van je code. De beste code kan nog erger dan bij slechte indentering vernaggelt worden door onduidelijke variabelen. Stel je het volgende stukje code voor:
1
2
3
4
5
6
7
| void doshitinthebushwithparams(int* p, char* a3, const char zz[]) { int a1, a6, z3, g4[mycusval]; char* foep, noep, a2, zoep; // Etc. } |
De parameternamen zijn onleesbaar, de lokale variabelen zijn onleesbaar, je hebt geen idee wat waarvoor bestaat, van welk type het is, en tot overmaat van ramp sta je een half uur op de functienaam te staren voor je doorhebt wat er staat. Dat moet beter kunnen
Eerste gouden regel: computers hebben tegenwoordig honderden megabytes geheugen, geen kilobytes meer zoals vroeger. De compilers gaan dus echt niet crashen als je langere namen gebruikt dan 3 bytes, dus gebruik die faciliteiten en maak duidelijke namen voor alles!!!
Functienamen worden door vrijwel iedereen hetzelfde geschreven, namelijk CamelCased. Dit houdt in dat je alle woorden zonder interpunctie aan mekaar plakt en ieder woord begint met een hoofdletter. In het voorbeeld hierboven dus:
1
| void DoShitInTheBushWithParams(...) |
Wat al een stuk duidelijker is dan de eerste versie
1
2
3
4
5
6
7
8
9
10
| class MyClass { private int isNoValue; public MyClass () { this.isNoValue = null; } public void doNothing () { } } |
Vooral door C en C++ programmeurs worden een hoop verschillende prefixen (voorvoegsels) gehanteerd om de code leesbaar te houden. De beroemdste is de zogenaamde Hungarian notation, en daar de hele Win32 API van Microsoft deze gebruikt kun je hem maar beter kennen
1
2
3
4
5
6
7
8
| int DrawTextEx( HDC hdc, // handle to DC LPTSTR lpchText, // text to draw int cchText, // length of text to draw LPRECT lprc, // rectangle coordinates UINT dwDTFormat, // formatting options LPDRAWTEXTPARAMS lpDTParams // more formatting options ); |
We negeren even de datatypes en kijken puur naar de variabelenamen. Hungarian is erop gebaseerd dat je het type in kleine letters als prefix hanteert voor de naam, waardoor je in code nooit meer onduidelijkheid hebt over wat een variabele nu ook alweer was. Zie in dit voorbeeld uitgeschreven:
1
2
3
4
5
6
| hdc = Handle to Device Context lpchText = Long Pointer to CHaracters cchText = Count of CHaracters lprc = Long Pointer to ReCtangle dwDTFormat = DWord lpDTParams = Long Pointer |
Zoals je ziet gebruikt Microsoft hier en daar zelfs de typeaanduiding als afdoende beschrijving (lprc en hdc). Dit is an sich sloppy Hungarian notation maar als je Microsoft heet kun je alles maken. Zolang het maar duidelijk is en dat is het in ieder geval
Een beknopt overzicht van Hungarian prefixes:
1
2
3
4
5
6
| BOOL fFlag; // f = Flag oftewel een boolean char bVariable; // b = Byte oftewel een char DWORD dwValue; // dw = Double Word oftewel een long HWND hMainWindow; // h = Handle (Windows datatype) int iNumber; // i = Integer void* pvData; // p = pointer (in dit geval een Pointer to Void) |
Hungarian is een mooi concept, maar de oplettende lezer zal er al een wazigheidje in ontdekt hebben: het schrijft voor dat je volledig beschrijvende namen gebruikt. En zoals je zag valt Microsoft vervolgens al voor de verleiding om de hele naam maar weg te laten als de type-prefix al duidelijk genoeg is. En dat is het andersom nog vaker: als je je af gaat vragen of de variabele Naam van het type integer of string is ben je fout bezig
Sommige programmeurs kiezen er daarom voor om het hele concept Hungarian overboord te gooien in ruil voor een ander mechanisme dat andere onduidelijkheden vermijd: die met scopes. Want dat mijn variabele Index een int is geloof ik wel, maar was het nu een global, een member, een parameter of een lokale variabele?
Zie het volgende extreem gezochte stukje code om het nut te illustreren van deze methode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| const int c_Index = 684; int g_Index = 0; class MyClass { private: int m_Index; public: int SwapIndexesTotallyAround(int p_Index) { int l_Index; l_Index = m_Index; m_Index = g_Index; if(p_Index > 684) g_Index = p_Index; else g_Index = c_Index; } } |
Ondanks dat het extreem gezocht is is dit begrijpelijk, en wel doordat we van iedere variabele een aanduiding geven waar ie vandaan komt en waar ie staat. Het volgende lijstje illustreert alle prefixes:
1
2
3
4
5
6
7
| l_Local m_Member p_Parameter c_Constant g_Global t_Type e_Enumerate |
De laatste 2 behoeven wat verdere uitleg, en wel met dit stukje code:
1
2
3
4
5
6
7
8
9
| typedef unsigned char t_Byte; // Een typeaanduiding typedef enum { e_OtUnary, e_OtBinary, e_OtTernary } t_OperatorType; } |
Bij enums kies ik er in dit geval zelfs voor om de hoofdletters van de typenaam in de enumerate te gebruiken om verwarren tussen meerdere verschillende enums (denk aan opslagformaat Binary bijvoorbeeld!) te voorkomen.
De laatste gouden tip
Voorkom debug hell tussen scopes en plaats al je lokale variabelen aan het *BEGIN* van de functie en zet er *EEN* per regel. Ja dit kost een hoop ruimte, maar houdt je code zoveel meer manageable. Dit houdt dus ook in dat je geen for(int i = ...) mag doen maar die i (of liever l_Index) aan het begin van de functie definieert. Hiermee voorkom je de volgende perfect compilerende crime:
1
2
3
4
| for(int i = 0; i != 30; i++) for(int i = 0; i != 20; i++) for(int i = 0; i != 10; i++) // Do something until the end of days |
Om een letterlijke quote te geven over het gebruik van de Hungarian notatie in .Net
Bron.
- Do not use Hungarian notation for field names. Good names describe semantics, not type.
- Do not apply a prefix to field names or static field names. Specifically, do not apply a prefix to a field name to distinguish between static and nonstatic fields. For example, applying a g_ or s_ prefix is incorrect.
In deze URL staan verder ook alle aanbevelingen van Microsoft over de notatie in .Net.
Gebaseerd op dit artikelen van Microsoft is op ASPAlliance nog een artikel over notaties verschenen, namelijk http://aspalliance.com/Ambrose/Articles/Hungarian.aspx.
Voor de duidelijkheid; bovenstaande adviezen gelden voor .Net.
[ Voor 3% gewijzigd door gorgi_19 op 21-06-2003 00:50 ]
Digitaal onderwijsmateriaal, leermateriaal voor hbo
Zelf vind ik het gebruik van de input/output markers in de naamgeving van variables handig, bijv. o voor output en i voor input (doh!) dus: oFontManagerObj, iLineObj. Natuurlijk gebruik je hier mogelijk de object en integer prefix, maar zelf vind ik het ook handig als je in één opslag ziet wat je met de variable doet etc. Waarschijnlijk verklaren jullie me voor gek....
Overigens vind ik spatie tussen ( ) i.e. if ( LineManagerSingleton->GetLineInfo( iIndex != null ) { ... } ook makkelijk.
[ Voor 3% gewijzigd door alienfruit op 21-06-2003 03:20 ]
Nee. MS schrijft voor dat je alleen caMel casing gebruikt bij parameters en locals/private membervariables. Methods moeten pascal casing.C# programmeurs zijn over het algemeen gewend om methodes en variabelen met een kleine letter te beginnen om het onderscheid te maken met classes e.d.
Voor de complete docs omtrent naamgeving in .net:
http://msdn.microsoft.com...cpconnamingguidelines.asp
[ Voor 91% gewijzigd door EfBe op 21-06-2003 10:15 ]
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Dit is niet camelCased, maar PascalCased.curry684 schreef op 21 juni 2003 @ 00:40:
Functienamen worden door vrijwel iedereen hetzelfde geschreven, namelijk CamelCased. Dit houdt in dat je alle woorden zonder interpunctie aan mekaar plakt en ieder woord begint met een hoofdletter.
Camel:
1
| void doShitInTheBush() |
Pascal:
1
| void DoShitInTheBush() |
Zoals EfBe al zegt, Java - programmeurs wel; C# programmeurs niet.Wat al een stuk duidelijker is dan de eerste versieJava en C# programmeurs zijn over het algemeen gewend om methodes en variabelen met een kleine letter te beginnen om het onderscheid te maken met classes e.d., bijv.:
In C# gebruik ik Pascal casing voor m'n methods, Camel Casing voor parameters.
Private members prefix ik met een underscore, public members en properties worden ge-Pascal cased.
https://fgheysels.github.io/
Anoniem: 4283
Deze guidelines zijn gebaseerd op de naamgeving van MS, alleen zijn ze wat uitgebreider beschreven incl. voorbeelden, etc.
Hopelijk heb je er iets aan
Verder lijkt het me nuttig om de tekst op te splitsen per taal. Aangezien voor elke taal specifieke naamgeving bestaat kan het heel verwarrend zijn als deze tussen elkaar doorlopen.
[ Voor 32% gewijzigd door Anoniem: 4283 op 21-06-2003 10:34 ]
EfBe/whoami: oeps CamelCased fout overgetypt uit drm z'n eerste versie
KoenM:linken we mee
alienfruit: ja die I/O prefix is wel heel exotisch en daarmee denk ik niet 'passend' in een globale FAQ
Als de tekst volledig moet zijn, dan mis ik de veelgebruikte C++ conventie om niet-type-identifiers (functies, variablen, etcetera) in kleine letters te schrijven, met underscores tussen de afzonderlijke woorden ("op_deze_manier"). Zoals genoemd is de term camelCase verkeerd gebruikt; een kameel heeft tenslotte alleen bulten in het midden en geen op z'n hoofd.
Verder vind ik de laatste gouden tip een beetje onzinnig (of op z'n minst te betwisten). Ik heb juist liever meerdere scopes in een functie, waarbinnen variabelen gedeclareerd worden, zodat tenminste duidelijk is wanneer die variabelen gebruikt worden. Ik wordt er niet vrolijk van als een beetje complexe functie begint met een stuk of tien variabeledeclaraties, terwijl maar enkele variabelen tegelijk in gebruik zijn. Zeker variabelen die binnen een lusje gebruikt worden, horen wat mij betreft binnen de scope van die lus. Declaraties staan dan wel bij voorkeur aan het begin van de scope (om dezelfde reden). Ook heb ik problemen met het gebruik van 'l_Index' in plaats van gewoon n, m, i of j als loopvariabelen; ik vind het eerste absoluut niet duidelijker of praktischer.
Zo valt er nog wel meer op aanconventies aangeraden, anderzijds wordt er een breed overzicht gegeven van de mogelijkheden. Wat is nu de bedoeling? Er zijn al genoeg bestaande style guides; het lijkt me niet de bedoeling er nog een toe te voegen. Verder lijkt het me ook niet de bedoeling dat we er inhoudelijk over gaan discussiëren, want iedereen heeft toch zijn eigen afwegingen en voorkeuren.
Misschien is het dus verstandiger om wat algemene regels te geven (consistentie is belangrijk) en alleen de meest standaard regels te vermelden (bijvoorbeeld: indenten is hoe dan ook belangrijk, maar hoe je de accolades doet mag je verder zelf weten). Dan kunnen we mensen die onleesbare code plaatsen tenminste met recht doorverwijzen naar de FAQ, waar duidelijk staat hoe het wel moet. Dingen als Hungarian notatie mogen er wat mij betreft dan dus wel uit, want die zijn veel te veel afhankelijk van persoonlijke voorkeur. Wel lijkt het me prettig om de conventies per taal samen te vatten, want voor Java bestaan bijvoorbeeld veel strictere conventies dan voor C/C++.
[ Voor 3% gewijzigd door Soultaker op 21-06-2003 16:56 ]
Er staan meerdere manieren genoemd, dus een overzicht van de gangbare handzame manieren.Soultaker schreef op 21 June 2003 @ 12:17:
Is het doel van de FAQ om een overzicht te geven van alle mogelijke manieren, of om een specifieke richtlijn aan te bieden?
Ik dacht dat je wel vaker code van mij had gezienZelf vind ik het inspringen met accolades en al (eerste voorbeeld) erg lelijk en onduidelijk en daarbij is het de minst gebruikte methode (ik ben 'm tot nu toe precies één keer tegengekomen, in een stuk Java code, dat overigens verder netjes was, terwijl ik toch Java/C/C++ code uit honderden verschillenden bronnen heb gelezen).
Voeger we toe.Als de tekst volledig moet zijn, dan mis ik de veelgebruikte C++ conventie om niet-type-identifiers (functies, variablen, etcetera) in kleine letters te schrijven, met underscores tussen de afzonderlijke woorden ("op_deze_manier").
Was al gemeld en aangekondigd dat het gecorrigeerd ging wordenZoals genoemd is de term camelCase verkeerd gebruikt; een kameel heeft tenslotte alleen bulten in het midden en geen op z' te merken en dat is ook gelijk mijn grote probleem met de FAQ zoals 'ie nu is: enerzijds worden bepaalde n hoofd.
Zolang je idd maar aan het begin van de scope blijft worden de meeste problemen voorkomen (vooral de bug die ik noem met de dubbele i in for's is erg common). Ik plaats persoonlijk alleen declaraties in een 'tussenscope' als er constructors aan vast zitten omdat dat rechtsstreeks de performance beinvloed. Loopvariabelen van 1 letter vanaf 'i' zijn een ancient gebruik (Fortran schreef het geloof ik voor) en lijkt me daarmee niet iets dat we in 2003 nieuwe programmeurs nog uit moeten leggen. Dat ik het zelf als old-schooler hier en daar in quicktestjes ook nog gebruik is een 2eVerder vind ik de laatste gouden tip een beetje onzinnig (of op z'n minst te betwisten). Ik heb juist liever meerdere scopes in een functie, waarbinnen variabelen gedeclareerd worden, zodat tenminste duidelijk is wanneer die variabelen gebruikt worden. Ik wordt er niet vrolijk van als een beetje complexe functie begint met een stuk of tien variabeledeclaraties, terwijl maar enkele variabelen tegelijk in gebruik zijn. Zeker variabelen die binnen een lusje gebruikt worden, horen wat mij betreft binnen de scope van die lus. Declaraties staan dan wel bij voorkeur aan het begin van de scope (om dezelfde reden). Ook heb ik problemen met het gebruik van 'l_Index' in plaats van gewoon n, m, i of j als loopvariabelen; ik vind het eerste absoluut niet duidelijker of praktischer.
Wat min of meer is wat ik doe: ik geef de gangbare methodes aan en vertel er de voor- en nadelen over. Accolades achter de conditional zijn een bekende bron van problemen en wil ik daarmee expliciet afraden. Hoe je het verder doet zal me worst wezen, zolang je maar consequent bent.Misschien is het dus verstandiger om wat algemene regels te geven (consistentie is belangrijk) en alleen de meest standaard regels te vermelden (bijvoorbeeld: indenten is hoe dan ook belangrijk, maar hoe je de accolades doet mag je verder zelf weten).
Hungarian is nu eenmaal een standaard die bij Informatica ook onderwezen wordt, en daarmee imho benodigde kennis over naamgeving. Dat er meer language-dependence in mag zitten ben ik mee akkoord, ga ik kijken hoe we dat gaan doen.Dan kunnen we mensen die onleesbare code plaatsen tenminste met recht doorverwijzen naar de FAQ, waar duidelijk staat hoe het wel moet. Dingen als Hungarian notatie mogen er wat mij betreft dan dus wel uit, want die zijn veel te veel afhankelijk van persoonlijke voorkeur. Wel lijkt het me prettig om de conventies per taal samen te vatten, want voor Java bestaan bijvoorbeeld veel strictere conventies dan voor C/C++.
Kewl geschreven, maar wat staat er eigenlijk?Soultaker schreef op 21 June 2003 @ 12:17:
een kameel heeft tenslotte alleen bulten in het midden en geen op z' te merken en dat is ook gelijk mijn grote probleem met de FAQ zoals 'ie nu is: enerzijds worden bepaalde n hoofd.
Verder ben ik het grotendeels wel eens met je opmerkingen
Ow, ik heb het nooit gehad bij mijn informatica opleiding hoor.curry684 schreef op 21 June 2003 @ 12:30:
Hungarian is nu eenmaal een standaard die bij Informatica ook onderwezen wordt, en daarmee imho benodigde kennis over naamgeving.
[ Voor 27% gewijzigd door ACM op 21-06-2003 12:33 ]
Hehe, ik zag het ook pas toen 'ie gequote werd. Er is een stukje tekst tussengekomen bij het intensief copy-pasten op een computer waar ik niet op gewend ben te werken.
Hmz, ik kan me niet herinneren dat ooit hier op GoT gezien te hebben, maar misschien lees ik er onbewust overheen. Ik snap niet hoe je op die manier scopes uit elkaar kun houden, bv:curry684 schreef op 21 June 2003 @ 12:30 over het inspringen van accolades:
Ik dacht dat je wel vaker code van mij had gezienIk gebruik het al 4 jaar consequent (deed vroeger ook braces niet mee inspringen) en heb meerdere mensen over zien stappen omdat ze het overzichtelijker vonden. Het is voor zover ik weet de op die andere 2 na populairste methode (maar ik kan zo snel ook geen 4e bedenken
). Ik heb echter genoeg topics gezien met bugs omdat men de accolade achter de regel plaatste (of juist daar vergat) en daardoor scopes verkeerd afsloten.
1
2
3
4
5
6
7
8
9
10
| { hallo dit is; een statements; } { en nog wat; meer; } |
Versus:
1
2
3
4
5
6
7
8
9
10
| { hallo dit is; een statements; } { en nog wat; meer; } |
Op de tweede manier steken de accolades (die het begin en eind van een scope markeren) mijns inziens veel duidelijker af, omdat de kolom waar ze in staan verder helemaal leeg is.
[ Voor 67% gewijzigd door Soultaker op 21-06-2003 17:03 ]
Hoewel ik geen Java programmeer vind ik deze pdf wel aardig: http://www.ambysoft.com/javaCodingStandards.pdf
Deze gaat een stuk verder dan de standards op http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html
huh? Ik = 5e jaars Informatica op de TU/e, maar OF ik heb liggen slapen, OF ik ben het vergeten, OF ik heb het nooit gehad.curry684 schreef op 21 June 2003 @ 12:34:
ACM: Eindhoven HBO en TU komt het voor zover ik weet wel langs.
Maar ja, wij kregen dan ook voornamelijk les mbv de GCL

More than meets the eye
There is no I in TEAM... but there is ME
system specs
- Naast 2 of 4 spaties (ik ben ook wel 3 en 8 tegengekomen) is het ook mogelijk om tabs te gebruiken. Dit heeft als voordeel dat het een paar byte scheelt (joepie
- Het stuk over de hungarian notatie vind ik relatief veel aandacht krijgen, terwijl dat in de praktijk niet zo erg veel voorkomt (meer), MS heeft het er met .NET uitgegooid, het komt dus alleen nog maar voor bij oude C++ code.
- Er bestaan ook talen waarbij de indenting op een verplichte manier moet, bijvoorbeeld Miranda en (??) Ruby. Aan de ene kant heeft dit voordelen: je indenting moet gewoon goed zijn, maar aan de andere kant: bij verkeerde indenting krijg je bugs en het is een beetje betuttend.
- Ik mis eigenlijk de belangrijkste regel: Als je een bestaand stuk code aanpast maak dan altijd gebruik van de aanwezige indenting/naamgeving!
Die paar bytes kunnen mij echt geen barst schelenCubicQ schreef op 21 June 2003 @ 20:27:
- Naast 2 of 4 spaties (ik ben ook wel 3 en 8 tegengekomen) is het ook mogelijk om tabs te gebruiken. Dit heeft als voordeel dat het een paar byte scheelt (joepie) en dat iedereen zelf in z'n editor kan bepalen hoe dat eruit komt te zien. Nadelen kan ik eigenlijk niet verzinnen op het ogenblik, maar eigenlijk gebruik ik ze nooit, wel gek eigenlijk..
Dit is ook zo in haskell, en daar werkt het erg prettig: niet alleen verplicht het je om goede indenting te hanteren, maar het maakt ook accolades en puntkomma's overbodig. Code wordt daar een stuk compacter en overzichtelijker van.- Er bestaan ook talen waarbij de indenting op een verplichte manier moet, bijvoorbeeld Miranda en (??) Ruby. Aan de ene kant heeft dit voordelen: je indenting moet gewoon goed zijn, maar aan de andere kant: bij verkeerde indenting krijg je bugs en het is een beetje betuttend.
Pas de replâtrage, la structure est pourrie.
* Robtimus gebruikt debug statements zonder enige vorm van indentatie om ze duidelijk herkenbaar te maken
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Nadeel is simpelCubicQ schreef op 21 juni 2003 @ 20:27:
- Naast 2 of 4 spaties (ik ben ook wel 3 en 8 tegengekomen) is het ook mogelijk om tabs te gebruiken. Dit heeft als voordeel dat het een paar byte scheelt (joepie) en dat iedereen zelf in z'n editor kan bepalen hoe dat eruit komt te zien. Nadelen kan ik eigenlijk niet verzinnen op het ogenblik, maar eigenlijk gebruik ik ze nooit, wel gek eigenlijk..
Als de een met een tabstop van 4 werkt en alles daarin uitlijnt en de ander bekijkt dat met een tabstop van 8 wil dat er nog wel eens ranzig uitzien
Magoed, ik gebruik eigenlijk altijd wel tabs. Meestal weegt dat nadeel wel op tegen de voordelen. 't Is vooral ook veel minder typewerk.
[ Voor 3% gewijzigd door ACM op 21-06-2003 20:46 ]
Coding style vind ik iets wat vrij persoonlijk kan zijn, natuurlijk niet wanneer je in een groepsproject werkt oid maar als je zelf wat gaat coden hou je dan aan je eigen regels, bvb een tab ipv spaties wat ik ook gebruik trouwens, of accolades op een aparte regel wanneer het om start brackets gaat als bij een if.
1
2
3
4
5
6
7
8
9
10
11
12
13
| bool smallerThenTen(int eenCijfer){ if (eenCijfer < 10){ return true; } else { return false; } } |
K'denk dat de belangrijkste tip al is: consequent blijven en niet wisselen bij elke nieuwe functie of variable die je declareert.
Een vaste manier om te documenteren kan trouwens ook van pas komen (ook om automatisch documentatie te laten genereren)
1
2
3
4
5
6
7
| /** * @return void * @param int Param1 het eerste getal van de som * @param int Param2 het tweede getal van de som * @param desc een functie die 2 getallen optelt en de som afdrukt */ void eenFunctie(int Param1, String Param2){} |
Hoewel die functie zuigende namen heeft kan je adhv de enkele regels documentatie snel weten wat ze doet.
If it ain't broken it doesn't have enough features
More than meets the eye
There is no I in TEAM... but there is ME
system specs
en net daarna :curry684 schreef op 21 June 2003 @ 00:40:
De eerste 2 zijn een kwestie van smaak, net zoals of je inspringt met 2 of 4 spaties. Andere aantallen spaties worden zelden gebruikt.
waar je dus keihard met 3 spaties inspringt. In mijn omgeving wordt 3 spaties meer gebruikt dan 2 of 4 spaties.Java:
1 2 3 4 5 6 7 8 9 10 class MyClass { private int isNoValue; public MyClass () { this.isNoValue = null; } public void doNothing () { } }
Ter illustratie 2 topics:Soultaker schreef op 21 June 2003 @ 16:57:
Hmz, ik kan me niet herinneren dat ooit hier op GoT gezien te hebben, maar misschien lees ik er onbewust overheen. Ik snap niet hoe je op die manier scopes uit elkaar kun houden, bv:
[rml]curry684 in "[ C++] Bitmaps, GIFS, of Metafiles invoeg"[/rml]
[rml]curry684 in "[ alg] waarom i als in i++"[/rml]
Nadelen:CubicQ schreef op 21 June 2003 @ 20:27:
Een paar losse opmerkingen:
- Naast 2 of 4 spaties (ik ben ook wel 3 en 8 tegengekomen) is het ook mogelijk om tabs te gebruiken. Dit heeft als voordeel dat het een paar byte scheelt (joepie) en dat iedereen zelf in z'n editor kan bepalen hoe dat eruit komt te zien. Nadelen kan ik eigenlijk niet verzinnen op het ogenblik, maar eigenlijk gebruik ik ze nooit, wel gek eigenlijk..
• Gebruik per ongeluk spaties en tabs door mekaar als leading indents en laadt het vervolgens in een andere editor... YAY wat een rotzooi
• IE heeft als default tab-size 8, dus je code wordt al snel troep op het web.
Wellicht snij ik 'm wat weg, ik wist niet dat MS het zo strikt afgezworen had (alhoewel de Win32 API het tot in lengte van dagen zal gebruiken)- Het stuk over de hungarian notatie vind ik relatief veel aandacht krijgen, terwijl dat in de praktijk niet zo erg veel voorkomt (meer), MS heeft het er met .NET uitgegooid, het komt dus alleen nog maar voor bij oude C++ code.
Nee die staat er in onder de vermelding: wat je ook doet wees altijd consequent!!! Dat betekent dus ook tov de omliggende code- Ik mis eigenlijk de belangrijkste regel: Als je een bestaand stuk code aanpast maak dan altijd gebruik van de aanwezige indenting/naamgeving!
LOL betrapt, dat was het enige stukje code dat ik uit drm's vorige FAQ had gekopieerdwindancer schreef op 21 June 2003 @ 22:51:
Eerst zeg je :
[...]
en net daarna :
[...]
waar je dus keihard met 3 spaties inspringt. In mijn omgeving wordt 3 spaties meer gebruikt dan 2 of 4 spaties.
Ik vind het erg slordig om te zeggen dat de open accolade aan het einde van de regel zetten 'niet goed' is, terwijl dat toch heel duidelijk een persoonlijke mening is. Laat die sneer gewoon, of bespreek alle voor en nadelen van de verschillende systemen..
Wees gewoon subjectief, en kom daar voor uit, maar probeer niet objectief te zijn en dan toch zo je eigen mening als richtlijn aan te dragen..
[ Voor 11% gewijzigd door terrapin op 22-06-2003 00:13 ]
The higher that the monkey can climb, The more he shows his tail
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Uiteraard is het beter om het zelf meteen goed te doen. Maar als je aan een stuk slecht ge-indente code van iemand anders moet verder gaan is dit tooltje de oplossing.
Bovendien wordt het gebruik van de K&R stijl (accolade aan eind regel) voorgeschreven in de Sun Java code conventions, dus dat zou je als argument kunnen hanteren om in Java de K&R stijl te gebruiken.terrapin schreef op 22 juni 2003 @ 00:10:
Ik vind het erg slordig om te zeggen dat de open accolade aan het einde van de regel zetten 'niet goed' is, terwijl dat toch heel duidelijk een persoonlijke mening is. Laat die sneer gewoon, of bespreek alle voor en nadelen van de verschillende systemen..
Over "de laatste gouden tip": ik prefereer de lokale variabelen te declareren aan het begin van het block waarin ze gebruikt worden en dat is dus niet altijd aan het begin van de functie. Reden daarvoor is dat het duidelijker is bij welk gedeelte van de functie de variabelen gebruikt worden.
Veel mensen die variabelen aan het begin van een functie declareren doen dat uit gewoonte, omdat ze dat moesten in C of VB. In moderne talen hoeft dat niet meer en je ziet mensen die meteen beginnen met talen waarbij dat niet meer hoeft het ook niet doen. Er valt veel voor te zeggen om variabelen aan het begin van de SCOPE te declareren waarin ze gebruikt worden. Ik probeer dat altijd zo veel mogelijk te doen, dit ivm het feit dat je weet waar een variabele is gedeclareerd. Ik zie nog wel eens code waarbij bv membervariables tussen de methods zijn gedeclareerd. (of onderaan). Dit bevordert het interpretatieproces tijdens het lezen in zn geheel niet, integendeel.Over "de laatste gouden tip": ik prefereer de lokale variabelen te declareren aan het begin van het block waarin ze gebruikt worden en dat is dus niet altijd aan het begin van de functie. Reden daarvoor is dat het duidelijker is bij welk gedeelte van de functie de variabelen gebruikt worden.
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Yups, idd, ik ook.EfBe schreef op 22 June 2003 @ 13:38:
Ik probeer dat altijd zo veel mogelijk te doen, dit ivm het feit dat je weet waar een variabele is gedeclareerd.
Een uitzondering is bij mij de while/for/etc loop.
Dan wil ik het nog wel es zo doen, hoewel het eigenlijk op hetzelfde neerkomt:
1
2
3
4
5
6
7
8
9
10
11
12
13
| void functietje() { // Begin functiescope code(); code1(); int voorInDeWhile = 0; while(true) { doeIets(); doeIetsMet(voorInDeWhile); } } |
De enige reden dat ik het dan zo doe is dat het de nodige declaraties scheel.
(hoewel de compiler in principe die beslissing ook voor me zou kunnen nemen, expliciet is het toch handiger
Het enige wat verandert is dat alles een eindje opschuift, toch?ACM schreef op 21 June 2003 @ 20:45:
Nadeel is simpel
Als de een met een tabstop van 4 werkt en alles daarin uitlijnt en de ander bekijkt dat met een tabstop van 8 wil dat er nog wel eens ranzig uitzien
1
2
3
4
| void bla() { code } |
wordt dan
1
2
3
4
| void bla() { code } |
Pas als je spaties en tabs door elkaar gaat gebruiken gaat het mis (maar ja, d'r staat ook niet voor niets: wees consequent
1
2
3
4
| void bla(int arg1, int arg2) { } |
wordt dan
1
2
3
4
| void bla(int arg1, int arg2) { } |
Maar ja, argumenten moeten dan natuurlijk ook gewoon maar op 1 regel gehouden worden (om maar even onsubtiel een nieuw discussiepunt dat nog niet genoemd was te openen
Ik zou dat dan iig wat explicieter opnemen. Consequent zijn kan ook opgevat worden als: consequent ten opzichte van je eigen regels (en dus consequent afwijken van wat er al staat).curry684 schreef op 21 June 2003 @ 23:56:
Nee die staat er in onder de vermelding: wat je ook doet wees altijd consequent!!! Dat betekent dus ook tov de omliggende code
Verder ook nog niet genoemd: regels niet langer laten zijn dan X tekens (nog een reden om geen tabs te gebruiken, dan kan je dit niet afdwingen). Vroeger was X natuurlijk 80, persoonlijk vind ik dat dat tegenwoordig wel wat hoger mag. Je hebt niet voor niets 1600x1200