Kezdőoldal » Számítástechnika » Programozás » Mennyire "clean", ha a for...

Mennyire "clean", ha a for ciklus feltételénél nem a ciklusváltozót, hanem egy másik változót vizsgálok (elsősorban C#, de bármilyen nyelven érdekel)?

Figyelt kérdés

Kell nekem egy ciklus, mindegy milyen, akár do-while is jó :D. Egy változó, aminek mindenképp csökkentem az értékét (ideiglenes tömböket vizsgálok hátulról előre) és egy, aminek akkor növelem, ha az ideiglenes tömb adott indexen levő eleme érvényes érték volt és hozzáadtam a másik gyűjteményhez. Viszont ez utóbbi változó értéke kell, hogy meghatározza, meddig fut a ciklus.

Szóval előre nem tudom, hányszor fog lefutni, de:

- két változót is használok voltaképp "számlálóként",

- az egyiknek el kell érnie az adott értéket, addig fut a ciklus.


For-ciklussal oldottam meg, eléggé alternatív módon:


int k = 1;

for (int j = temp.Length - 1; k <= WhichLott; j--)

{

if (temp[j] != "")

{

lotNums.Add(int.Parse(temp[j]));

k++;

}

}



A j-nek itt csak annyi az értelme, hogy léptet, de legalább a ciklusfejben teszi ezt és nem kell külön.



2019. jún. 19. 20:16
1 2
 1/14 anonim ***** válasza:
40%
Horror kategória, ráadásul teljesen indokolatlan is.
2019. jún. 19. 20:28
Hasznos számodra ez a válasz?
 2/14 anonim ***** válasza:
100%

Az a probléma vele, hogy a ciklusmagban lévő IF szerkezetben megadott kifejezés lehet, hogy soha nem lesz igaz, ami miatt beállhatna egy végtelen ciklus... hacsak nem rontanád tovább a helyzetet azzal, hogy a j változód átmehet negatívba, ami miatt IndexOutOfRangeException kivétel miatt meghal a programod (megmentve a gépet a végtelen ciklustól).


Ha nagyon ezt akarod, vedd be legalább a for ciklus feltételébe, hogy a j 0-nál kisebb lehetőleg ne legyen.

2019. jún. 19. 20:44
Hasznos számodra ez a válasz?
 3/14 A kérdező kommentje:

Előbb elszáll az int.Parse() metódus miatt, mert "előrébb" nemcsak szám van benne. Teljesen máshogy kellene vizsgálnom, ha ezt is figyelembe szeretném venni, bár tervben van az is.


Gondolom így is szörnyű:


for (int j = temp.Length - 1; j >= 0 && j - lotNums.Count > WhichLott; j--)

{

if (temp[j] != "")

{

lotNums.Add(int.Parse(temp[j]));

}

}


Első, kérlek, kicsit finomabban!

Tanulni szeretnék! Ha mindig optimális, átlátható, "clean" kódokat tudnék írni, akkor nem itt kérdeznék, hanem többszázezret keresnék valahol máshol. Sajnos kezdőknél benne van a baromság lehetősége.... Gondolom nemcsak kezdőknél.

2019. jún. 19. 20:53
 4/14 anonim ***** válasza:
Ebből a kódrészletből többet nem lehet kihozni, mert nem ismerjük a teljes kódot és hogy annak mit kellene csinálnia.
2019. jún. 19. 21:02
Hasznos számodra ez a válasz?
 5/14 A kérdező kommentje:

Most a konkrét kérdésem, hogy mennyire "clean" ilyen módon variálni a for-ciklussal? Legalábbis a második példámat tekintve.

Tehát a for és a while egybegyúrása voltaképpen.


Az egyik bizonyos tesztben láttam több ilyet is.

2019. jún. 19. 21:06
 6/14 anonim ***** válasza:

int k = 0;

int j = temp.Length;

while(k <= WhichLott)

{

if(temp[j] != "")

{

lotNums.Add(int.Parse(temp[j]));

j--;

k++;

}

}


Ez sokkal jobban kifejezi a működést. Hogy mennyire clean azt mindenki döntse el maga. De pl. 'temp', 'k' és 'j' változónevek ordítóan nem 'clean'-ek.


For ciklusnál érdemes kerülni a ciklusmagban a ciklusváltozó módosítását.

2019. jún. 19. 23:12
Hasznos számodra ez a válasz?
 7/14 anonim ***** válasza:
100%

Pont ezt akartam mondani mint az előző.

Már ott nem clean a dolog hogy k-nak nevezel el valamit.


A clean code arról szól, hogy úgy tudom felolvasni a kódodat, mint egy verset. Na most ezt nem tudom. Fogalmam sincs mi az a lotNums lista. Csak tippre mondanám: lottó számok? Akkor legyen az a neve hogy: lotteryNumbers


ez a WhichLott ez egyenesen hátborzongató, fogalmam sincs hogy miért reprezentál egy integert.


a "" helyett használd inkább a string.Empty property-t.



Gondolom kezdő vagy még, ne add fel, de ez még messze van a clean code-tól. Nem lehet minden esetben elkerülni természetesen, de az egymásba ágyazott ciklusokat, if statementeket is kerülni kéne. Itt úgy lehetett volna megoldani hogy:


if (temp[j] == string.Empty)

continue;


lotteryNumbers.Add(Convert.ToInt32(temp[j]));

k++;


Nem látom a kódodat, de gyanítom hogy a WhichLott rossz naming convencióval van ellátva.


Ha egy szimpla helyi változót deklarálsz, akkor camelCase-t kell használni.


Ha egy privát változót deklarálsz, akkor alulvonás _camelCase-t kell használni.


Ha pedig property-t használsz, akkor meg PascalCase-t.


További produktív programozást kívánok, gyakorolj sokat. Ellenőrizd a kódot, és próbáld meg úgy felolvasni mint egy verset. :)

2019. jún. 19. 23:50
Hasznos számodra ez a válasz?
 8/14 A kérdező kommentje:

Az property.


A string.Empty miért jobb?

2019. jún. 20. 05:03
 9/14 anonim ***** válasza:

#8 Egyrészt, mert ha van egy expliciten erre kitalált property az osztályon, akkor célszerű azt használni, másrészt mikroszkopikus mértékben hatékonyabb, mert nem példányosít egy új objektumot (a "" literál meg igen).


Amúgy a kód "clean"-ségére nem mennék rá, viszont funkcionálisan erősen problémás. Egy ciklusra fontos, hogy megfogalmazható legyen egy ún. terminálófüggvény, ami vagy része a kódnak, vagy csak absztrakt módon megfogalmazható rá. A terminálófüggvény lényege, hogy valamilyen számértékkel rendelkezik a ciklus elején, a ciklus futása során az értéke biztosan csökken, és soha nem nő, és ha 0-hoz ér, a ciklus végetér. Ez az absztrakt programkonstrukció igazából egy egyszerű szempontot formalizál: A ciklusod biztosan fejeződjön be valamikor. Ne legyenek végtelen ciklusok. Jelen esetben, mivel a k változó csak eg ybizonyos feltétel mellett nő, és ez a feltétel nem feltétlenül fog teljesülni, a ciklus a végtelenségig futhatna.


Mindezen felül a ciklusnak biztonságosnak is kell lennie, soha nem szabad megtörténnie, hogy a cikluson belül valamilyen változó olyan értéket vesz fel, ami hibára vezet. Jelen esetben a j változó nem mehet 0 alá, tehát a ciklus fejlécében ki kell kötnöd, hogy a j érétke nagyobb kell legyen 0-nál. Ez önmagában megoldja az előző problémát is, mert a j értéke minden lépésben csökken, tehát elkerülhetetlenül el fog érni a ciklus a végére. Ha neked az a célod, hogy pontosan WhichLott darab számot válassz ki, akkor el kell gondolkoznod: Gaarntálni tudod, hogy mindig lesz ennyi kiválasztható szám? Ha nem, akkor le kell kezelni azt az esetet is, hogy nem találsz elegendő mennyiségű számot, például a ciklus lefutása után ellenőrizheted k érétkét, hogy megegyezik-e a WhichLot értékével. Ha igen, akkor találtál k darab számot, ha nem, akkor nem.


+1 int.Parse helyett a TryParse-t használd, az nem fog elszállni, ha nem számot kap.

2019. jún. 20. 06:39
Hasznos számodra ez a válasz?
 10/14 A kérdező kommentje:

A suliban, ahova járok, nem fogunk tudni mindenbe ilyen részletességgel belemenni. Jó a tanár, de az idő igen kevés. :(

Fogalmam sincs, honnan tanuljam meg ezeket az alapelveket. :(


A kommentembe tett kódban már van terminálófüggvény. Vagy mindenképp a while kellene?


Mindenképp 5 vagy 6 számot kell megkapjon a lista, ezt az értéket tartalmazza a property.

Ha többet vagy kevesebbet kapna, ugyan nem száll el (azt hiszem, eléggé rugalmasra írtam a kód további részét), de nem lesz értelme a továbbiakban.



Ez az Empty property nekem bonyolultnak és kevésbé átláthatónak tűnik, de megszokás kérdése.


Más téma, de ha már optimalizálás, tényleg nem jó for ciklusoknál a tömbök/string Length property-jét használni, hanem azt érdemes kiszervezni külön változóba? Azt hallottam, hogy nem túl optimális, ha a ciklus minden forduláskor lekéri a Length property értékét.

Tehát array.Length helyett létrehozunk egy length nevű int változót.

2019. jún. 20. 07:33
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!