Vraag Wat is een ideale variabele naamgevingsconventie voor lusvariabelen? [Gesloten]


Als je een schrijft eenvoudig kleine lus, wat moeten noem je de teller?

Geef voorbeeldlussen!


39
2017-09-19 10:55


oorsprong


antwoorden:


Ik gebruik altijd een zinvolle naam tenzij het een single-level lus is en de variabele geen andere betekenis heeft dan "het aantal keren dat ik deze lus heb doorgemaakt", in welk geval ik gebruik i.

Bij gebruik van betekenisvolle namen:

  • de code is begrijpelijker voor collega's die je code lezen,
  • het is gemakkelijker om fouten in de luslogica te vinden, en
  • tekstzoekopdrachten voor de variabelenaam om relevante stukjes code terug te zetten die op dezelfde gegevens werken, zijn betrouwbaarder.

Voorbeeld - spot de bug

Het kan lastig zijn om de bug in deze geneste lus te vinden met behulp van losse letters:

int values[MAX_ROWS][MAX_COLS];

int sum_of_all_values()
{
    int i, j, total;

    total = 0;
    for (i = 0; i < MAX_COLS; i++)
        for (j = 0; j < MAX_ROWS; j++)
             total += values[i][j];
    return total;
}

overwegende dat het gemakkelijker is om betekenisvolle namen te gebruiken:

int values[MAX_ROWS][MAX_COLS];

int sum_of_all_values()
{
    int row_num, col_num, total;

    total = 0;
    for (row_num = 0; row_num < MAX_COLS; row_num++)
        for (col_num = 0; col_num < MAX_ROWS; col_num++)
             total += values[row_num][col_num];
    return total;
}

Waarom row_num? - afgewezen alternatieven

In antwoord op enkele andere antwoorden en opmerkingen zijn dit enkele alternatieve suggesties voor gebruik row_num en col_num en waarom ik ervoor kies om ze niet te gebruiken:

  • r en c: Dit is iets beter dan i en j. Ik zou alleen overwegen om ze te gebruiken als de standaard van mijn organisatie voor variabelen van een enkele letter gehele getallen zijn, en ook altijd de eerste letter van de equivalente beschrijvende naam te zijn. Het systeem zou vallen als ik twee variabelen had in de functie waarvan de naam begon met "r", en de leesbaarheid zou eronder lijden, zelfs als andere objecten die met "r" begonnen overal in de code verschenen.
  • rr en cc: Dit lijkt mij raar, maar ik ben niet gewend aan een variabele stijl met dubbele letters. Als het de standaard in mijn organisatie was, stel ik me voor dat het iets beter zou zijn dan r en c.
  • row en col: Op het eerste gezicht lijkt dit beknopter dan row_num en col_num, en net zo beschrijvend. Ik verwacht echter dat naakte zelfstandige naamwoorden zoals "rij" en "kolom" verwijzen naar structuren, objecten of verwijzingen naar deze. Als row kan betekenen een van beide de rijstructuur zelf, of een rijnummer, dan zal verwarring ontstaan.
  • iRow en iCol: Dit geeft sindsdien extra informatie door i kan betekenen dat het een lusteller is terwijl Row en Col vertel je wat het telt. Ik geef er echter de voorkeur aan de code bijna in het Engels te kunnen lezen:
    • row_num < MAX_COLS luidt als "de rij nummerber is minder dan de maximum (aantal) colUMNs";
    • iRow < MAX_COLS in het beste geval leest als "de integer lusteller voor de rij is minder dan de maximum (aantal) colUMNs".
    • Het kan een persoonlijke zaak zijn, maar ik geef de voorkeur aan de eerste lezing.

Een alternatief voor row_num Ik zou accepteren is row_idx: het woord 'index' verwijst op unieke wijze naar een arraypositie, tenzij het domein van de toepassing zich in het ontwerp van de database-engine, financiële markten of iets dergelijks bevindt.

Mijn voorbeeld hierboven is zo klein als ik het kon maken, en als zodanig zien sommige mensen misschien het nut niet om de variabelen beschrijvend te benoemen, omdat ze de hele functie in één keer in hun hoofd kunnen houden. In echte code zouden de functies echter groter zijn en de logica complexer, zodat fatsoenlijke namen belangrijker worden om de leesbaarheid te bevorderen en bugs te voorkomen.

Samengevat, mijn doel met alle variabele naamgeving (niet alleen loops) is om te zijn helemaal ondubbelzinnig. Als iemand leest een gedeelte van mijn code en kan niet onmiddellijk berekenen waar een variabele voor is, dan heb ik gefaald.


36
2017-09-19 11:38



1) Voor normale kleine lusjes in de oude stijl - i, j, k - Als u meer dan 3 geneste lussen nodig heeft, betekent dit dat het algoritme erg specifiek en complex is, dus u moet overwegen de code te refactoren.

Java Voorbeeld:

for(int i = 0; i < ElementsList.size(); i++) {
  Element element = ElementsList.get(i);
  someProcessing(element);
  ....
}

2) Voor de nieuwe stijl gebruiken java-lussen for(Element element: ElementsList) het is beter om een ​​normale gemiddelde naam te gebruiken

Java Voorbeeld:

for(Element element: ElementsList) {
  someProcessing(element);
  ....
}

3) Als het mogelijk is met de taal die u gebruikt, converteert u de lus naar iterator

Java Iterator Voorbeeld: Klik hier


35
2017-09-19 11:06



Voorbeelden: . . . In Java


Niet-iteratieve loops:


Niet-geneste lussen: . . . De index is een waarde.

. . . gebruik makend van  i, zoals je zou doen in Algebra, is de meest gebruikelijke praktijk . . .

for (int i = 0; i < LOOP_LENGTH; i++) {

    // LOOP_BODY
}


Geneste lussen: . . . Onderscheidende indices zorgen voor begrip.

. . . een beschrijvend achtervoegsel gebruiken . . .

for (int iRow = 0; iRow < ROWS; iRow++) {

    for (int iColumn = 0; iColumn < COLUMNS; iColumn++) {

        // LOOP_BODY
    }
}


foreach lussen: . . . Een Object heeft een naam nodig.

. . . een beschrijvende naam gebruiken. . .

for (Object something : somethings) {

    // LOOP_BODY
}


Iterative Loops:


for lussen: . . . Iterators verwijzen naar objecten. Een Iterator het is geen van beide; een index, noch een indice.

. . . iter  verklaart een doel van Iterators af . . .

for (Iterator iter = collection.iterator(); iter.hasNext(); /* N/A */) {

    Object object = iter.next();

    // LOOP_BODY
}


while lussen: . . . Beperk de reikwijdte van de Iterator.

. . . commentaar geven op het doel van de lus . . .

/* LOOP_DESCRIPTION */ {

    Iterator iter = collection.iterator();

    while (iter.hasNext()) {

        // LOOP_BODY
    }
}

Dit laatste voorbeeld leest slecht zonder opmerkingen en moedigt hen daardoor aan. Het is mogelijk uitgebreid, maar nuttig in bereikbeperkende lussen in C.


12
2017-09-19 10:55



Mijn ervaring is dat de meeste mensen enkele letters gebruiken, bijvoorbeeld: i, j, k, ... of x, y, of r, c (voor rij / kolom) of w, h (voor breedte / hoogte) , enz.

Maar ik heb lang geleden een geweldig alternatief geleerd en heb het sindsdien altijd gebruikt: dubbele lettervariabelen.

// recommended style              ●    // "typical" single-letter style
                                  ●
for (ii=0; ii<10; ++ii) {         ●    for (i=0; i<10; ++i) {
    for (jj=0; jj<10; ++jj) {     ●        for (j=0; j<10; ++j) {
        mm[ii][jj] = ii * jj;     ●             m[i][j] = i * j;
    }                             ●        }
}                                 ●    }

In het geval dat het voordeel niet meteen duidelijk is: het doorzoeken van code voor een enkele letter zal veel dingen vinden zijn niet waar je naar op zoek bent. De brief i komt vaak voor in code waar het niet de variabele is waarnaar u op zoek bent.


9
2017-09-19 10:59



Probeer de variabele altijd een betekenisvolle en contextuele naam te geven.

Als je niet kunt beslissen, gebruik dan "index", al was het maar zodat iemand anders (misschien jij!) Er gemakkelijker op kan klikken om later te refactoren.

Paul Stephenson Zie dit antwoord voor een voorbeeld.


8
2017-09-20 17:22



ik gebruik ik, j, k (of r & c voor rij-kolom lusvorming). Als je nodig hebt meer dan drie loopvariabelen in een methode, de methode is waarschijnlijk te lang en ingewikkeld en uw code waarschijnlijk profiteer van het splitsen van de methode naar meer methoden en naamgeving hen naar behoren.


6
2017-09-19 11:05



i

als ik een geneste lus heb, dan ook j.

Deze conventie is zo gewoon dat het lukt om een ​​variabele tegen te komen i in een blok code dat je niet kunt zien, begin je het nog steeds direct te herkennen voor wat het is.


5
2017-09-19 23:19



Ik gebruik i, ii, iii, iv, v ... Nochtans nooit hoger dan iii.


5
2017-09-19 11:00