Väldigt lång nästlad while() if()

Permalänk
Medlem

Väldigt lång nästlad while() if()

Behöver kod, som i stort sett följer samma mönster, men det går inte med en vanlig loop eftersom koden nästlar sig om och om igen. Språket är php men principen borde vara liknande i de flesta språk så jag har skrivit ett par exemepel pseudokod för att visa hur jag menar ...

for() { for() { for() { for() { for() { for() { for() { for() { for() { for() { } } } } } } } } } }

while() { do something A; if() { do something 1; while() { do something B; if() { do something 2; while() { do something C; if() { do something 3; while() { do something D; if() { do something 4; while() { do something E; } do something 5; while() { do something F; ... if() { do something 19; while() do something T; } ... } } } } } } } } } }

Går det att skriva vettigare kod än så?

Visa signatur

mobo Asus M4A88TD-M EVO/USB3 cpu 1100T kylare Noctua NH-D14
gpu RX 460 passive ram 16GB DDR3 1600MHz ssd Samsung 850 EVO 250GB
psu Corsair AX 850 skärmar 3 * 40" NEC P401

Permalänk

Går det inte att dela upp koden i ett par funktioner istället?

Permalänk
Medlem

Jag tror att problemet här angrips på en för låg nivå.

Vad är det du egentligen vill göra?

Rekursiva anrop? Felhantering?

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Medlem

På jobbet drabbades vi av buffer overflow...

Det var för många nästlade IFsatser som var orsaken....ca 250st om jag inte minns fel...

Visa signatur

Har varit på detta forum på tok för länge...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av UndCon
På jobbet drabbades vi av buffer overflow...

Det var för många nästlade IFsatser som var orsaken....ca 250st om jag inte minns fel...

Jisses! Anställ mig som konsult, jag vet hur man kan undvika att nästa 250 if-satser åtminstone..

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Låter ju iaf för mig som du borde skriva rekursivt..

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

"Iteration is human, recursion is divine."

Permalänk
Citat:

Ursprungligen inskrivet av Wishie
"Iteration is human, recursion is divine."

En variant som vår ryske lärare i Uppsala körde med:

"Iteration for human, recursion for God"

Visa signatur

www.uu.se - some kind of university | www.hirr.org.uk - ain't no mountain high enough | www.bajenfans.se

Permalänk
Medlem

Tack för hjälpen, hade inte hört talas om rekursiva funktioner förut, men det var väldigt praktiskt

Visa signatur

mobo Asus M4A88TD-M EVO/USB3 cpu 1100T kylare Noctua NH-D14
gpu RX 460 passive ram 16GB DDR3 1600MHz ssd Samsung 850 EVO 250GB
psu Corsair AX 850 skärmar 3 * 40" NEC P401

Permalänk

Genom att vända på vilkor och returnera tidigt går det ofta att platta till spjutspetskod.

Ett mycker konstruerat exempel följer

while (a == 2) { if (c > 3) { while (d < 10) { d = foo(); } if (d % 2 == 0) { --c; if (c % 7 == 0) { a = 5; } } } else { ++c; } }

Genom att ändra på villkoret för första if-satsen försvinner en hel nivå.

while (a == 2) { if (c <= 3) { ++c; continue; } while (d < 10) { d = foo(); } if (d % 2 == 0) { --c; if (c % 7 == 0) { a = d; } } }

Visa signatur
Permalänk
Medlem

Re: Väldigt lång nästlad while() if()

Citat:

Ursprungligen inskrivet av Andre_H
Går det att skriva vettigare kod än så?

Ja. Men det är ju väldigt svårt att säga generellt. Har du fått ett upplägg som ser ut sådär råder jag dig att försöka tänka över vad egentligen målet är. Dela upp din stora funktion i mindre funktioner. Det kommer fortfarande att vara nästlat, men mycket mer lättläst och dessutom kanske du kommer på att du kan lösa det på något annat sätt när du väl håller på.