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

Trädvy Permalänk
Medlem
Plats
Östersund
Registrerad
Aug 2007

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å?

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

Trädvy Permalänk
Medlem
Plats
Söder
Registrerad
Jun 2008

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

Trädvy Permalänk
Medlem
Registrerad
Dec 2004

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?

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

Trädvy Permalänk
Medlem
Registrerad
Jul 2001

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...

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

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
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..

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008

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

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

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2005

"Iteration is human, recursion is divine."

Trädvy Permalänk
Medlem
Plats
Tokyo
Registrerad
Nov 2002
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"

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

Trädvy Permalänk
Medlem
Plats
Östersund
Registrerad
Aug 2007

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

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

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Okt 2008

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; } } }

Trädvy Permalänk
Medlem
Registrerad
Jan 2006

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å.