[Alg] Nieuwe FAQ Naamgeving / Indenteringen

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

Topicstarter
Hieronder volgt een stuk nieuwe FAQ, in een losse post zodat drm makkelijk kan copy/pasten (en goede stijl in editen ;) ). Iedereen is welkom om commentaar te leveren en vragen te stellen!

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

Topicstarter

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
C++:
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
C++:
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:
C++:
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:
C++:
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:
C++:
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:
C++:
1
void DoShitInTheBushWithParams(...)

Wat al een stuk duidelijker is dan de eerste versie :D Java 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.:
Java:
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 :D Zie een praktijkvoorbeeld:
C:
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:
code:
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 :P

Een beknopt overzicht van Hungarian prefixes:
code:
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 :P

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:
C++:
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:
code:
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:
C++:
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:
C++:
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

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:03

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 wil nog een kleine aanvulling geven op de Hungarian notatie.
Om een letterlijke quote te geven over het gebruik van de Hungarian notatie in .Net
  • 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.
Bron.

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


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 14:29

alienfruit

the alien you never expected

Komt er ook nog een FAQ, duidelijk commentaar schrijven <g>
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 ]


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
erm, sinds wanneer is gnu bracing 'goed' ? (de braces inspringen).
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.
Nee. MS schrijft voor dat je alleen caMel casing gebruikt bij parameters en locals/private membervariables. Methods moeten pascal casing.

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


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:47
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.
Dit is niet camelCased, maar PascalCased.

Camel:
code:
1
void doShitInTheBush()

Pascal:
code:
1
void DoShitInTheBush()

:P
Wat al een stuk duidelijker is dan de eerste versie :D Java 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.:
Zoals EfBe al zegt, Java - programmeurs wel; C# programmeurs niet.


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/


Acties:
  • 0 Henk 'm!

Anoniem: 4283

Misschien is de link in mijn sig handig?
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 ]


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

Topicstarter
Gorgi/whoami: nemen we mee :)
EfBe/whoami: oeps CamelCased fout overgetypt uit drm z'n eerste versie :P
KoenM:linken we mee
alienfruit: ja die I/O prefix is wel heel exotisch en daarmee denk ik niet 'passend' in een globale FAQ :) De spaties rond de haakjes doet iedere programmeur anders, daar kan ik binnen m'n directe omgeving zo 10 verschillende varianten van geven. Ga ik dus niets over 'voorschrijven'. :+

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01-07 14:32
Is het doel van de FAQ om een overzicht te geven van alle mogelijke manieren, of om een specifieke richtlijn aan te bieden? Zelf 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). Het lijkt me dat 'ie ten onrechte als voorbeeld aangehaald wordt, omdat daarmee gesuggereerd wordt dat het een gebruikelijke notatie is.

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 ]


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

Topicstarter
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?
Er staan meerdere manieren genoemd, dus een overzicht van de gangbare handzame manieren.
Zelf 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).
Ik dacht dat je wel vaker code van mij had gezien :P Ik 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.
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").
Voeger we toe.
Zoals 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. ;)
Was al gemeld en aangekondigd dat het gecorrigeerd ging worden :D
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.
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 2e :)
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).
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.
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++.
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.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

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. ;)
Kewl geschreven, maar wat staat er eigenlijk? :+

Verder ben ik het grotendeels wel eens met je opmerkingen :)
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.
Ow, ik heb het nooit gehad bij mijn informatica opleiding hoor.

[ Voor 27% gewijzigd door ACM op 21-06-2003 12:33 ]


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

Topicstarter
ACM: Eindhoven HBO en TU komt het voor zover ik weet wel langs. :)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Welke TU? Iig niet de TUDelft of het moet recentelijk veranderd zijn :)

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 14:29

alienfruit

the alien you never expected

ACM: TU Eindhoven :p

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01-07 14:32
ACM schreef op 21 June 2003 @ 12:31:
Kewl geschreven, maar wat staat er eigenlijk? :+
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. :P
curry684 schreef op 21 June 2003 @ 12:30 over het inspringen van accolades:
Ik dacht dat je wel vaker code van mij had gezien :P Ik 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.
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:
code:
1
2
3
4
5
6
7
8
9
10
{
hallo dit is;

een statements;
}
{
en nog wat;

meer;
}

Versus:
code:
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 ]


Acties:
  • 0 Henk 'm!

  • sjokki
  • Registratie: Juli 2002
  • Niet online
Over wat precies CamelCase is is niet iedereen het eens. Op http://c2.com/cgi/wiki?CapitalizationRules staan verschillende meningen daarover. En uiteindelijk heeft iedereeen gelijk.

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

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16:11

Robtimus

me Robtimus no like you

curry684 schreef op 21 June 2003 @ 12:34:
ACM: Eindhoven HBO en TU komt het voor zover ik weet wel langs. :)
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.

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


Acties:
  • 0 Henk 'm!

  • CubicQ
  • Registratie: September 1999
  • Nu online
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..
- 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!

Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
CubicQ 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..
Die paar bytes kunnen mij echt geen barst schelen :). Het nadeel van tabs is dat ze op verschillende platforms/in verschillende editors anders gerenderd worden, waardoor je code er niet overal hetzelfde uitziet. Bij sommige talen/situaties kan het zelfs twijfel doen ontstaan over de betekenis van je programma.
- 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.
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.

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16:11

Robtimus

me Robtimus no like you

In Python moet je ook verplicht indenteren, en hoewel het beter leesbare code oplevert zit er een vrij groot nadeel aan: debug statements (print bv) zijn moeilijker te herkennen, en de kans is groter dat je er per ongeluk een laat staan tenzij je ze mbv commentaar oid aanduidt.

* 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


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

CubicQ 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..
Nadeel is simpel :P
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 :o

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 ]


Acties:
  • 0 Henk 'm!

  • Apache
  • Registratie: Juli 2000
  • Laatst online: 25-06 14:00

Apache

amateur software devver

Tja, coding style en naamgeving, imo best om een mooi overzicht van te maken en gebruikers zelf te laten beslissen waar ze voor gaan.

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.

code:
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)

code:
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


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16:11

Robtimus

me Robtimus no like you

Wel 1 iets: gebruik voor indentatie geen spaties en tabs door elkaar, ervan uitgaande dat een tab x (meestal 8) karakters inneemt. Dit kan bij een andere tabinstelling de indentatie (qua uiterlijk) totaal ver****ken. Zelf gebruik ik dus totaal geen tabs in source code.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • windancer
  • Registratie: Maart 2000
  • Laatst online: 03-07 15:12
Eerst zeg je :
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.
en net daarna :
Java:
1
2
3
4
5
6
7
8
9
10
class MyClass { 
   private int   isNoValue; 
    
   public MyClass () { 
       this.isNoValue = null; 
   } 
    
   public void doNothing () { 
   } 
}
waar je dus keihard met 3 spaties inspringt. In mijn omgeving wordt 3 spaties meer gebruikt dan 2 of 4 spaties.

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

Topicstarter
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:
Ter illustratie 2 topics:
[rml]curry684 in "[ C++] Bitmaps, GIFS, of Metafiles invoeg"[/rml]
[rml]curry684 in "[ alg] waarom i als in i++"[/rml]

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

Topicstarter
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..
Nadelen:
• Gebruik per ongeluk spaties en tabs door mekaar als leading indents en laadt het vervolgens in een andere editor... YAY wat een rotzooi :) Om die reden zet ik in iedere code-editor die ik ken altijd direct 'Replace tabs with spaces' aan.
• IE heeft als default tab-size 8, dus je code wordt al snel troep op het web.
- 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.
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)
- Ik mis eigenlijk de belangrijkste regel: Als je een bestaand stuk code aanpast maak dan altijd gebruik van de aanwezige indenting/naamgeving!
Nee die staat er in onder de vermelding: wat je ook doet wees altijd consequent!!! Dat betekent dus ook tov de omliggende code :)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

Topicstarter
windancer 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.
LOL betrapt, dat was het enige stukje code dat ik uit drm's vorige FAQ had gekopieerd :)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • terrapin
  • Registratie: Februari 2002
  • Niet online
Je moet wat duidelijker maken dat het je eigen mening is wat betreft het inspringen, want een consensus zal je toch nooit bereiken.

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


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Nou ik heb liever dat die faq objectief is en niet een uitgesproken resultaat van subjectiviteit.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 01-07 14:52
Voor consequent indenten is er een tool genaamd 'indent'. Ik ken het alleen onder linux, maar het zal vast wel naar meer OSen geport zijn.
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.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Een aantal IDE's kunnen het ook de code (opnieuw) automatisch indenten, iig alle recente Java IDE's die ik kortgeleden gebruikt heb :)

Acties:
  • 0 Henk 'm!

  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 28-05 10:31
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..
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.

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.

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
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.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

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.
Yups, idd, ik ook.

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:
Java:
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 :) )

Acties:
  • 0 Henk 'm!

  • CubicQ
  • Registratie: September 1999
  • Nu online
ACM schreef op 21 June 2003 @ 20:45:
Nadeel is simpel :P
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 :o
Het enige wat verandert is dat alles een eindje opschuift, toch?
code:
1
2
3
4
void bla()
{
    code
}

wordt dan
code:
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 :)). Of bedoel je bijvoorbeeld als je je argumenten op meerdere regels neerzet?
code:
1
2
3
4
void bla(int arg1,
         int arg2)
{
}

wordt dan
code:
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 :))
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 :)
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).

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 :), de tijd van 80x24 of 80x50 is imho voorbij. Zelf gebruik ik meestal iets als 130 ofzo, veel langer wordt wel een beetje onoverzichtelijk. Wat wel weer een beetje een nadeel is is dat als je je code op courier 8pt uitprint regels afgebroken gaan worden... (ik heb net even in m'n afstudeerverslag getest: boven de 86 tekens wordt het afgebroken). Je kan dan de marges gaan verkleinen (staan met 1.5" en 1" wel vrij ruim) of een nog kleiner lettertype gaan gebruiken (lijkt me niet echt handig), maar ook dat houdt natuurlijk een keer op.
Pagina: 1