Spagetti-etenemisen välttäminen
Milloin nimetyt siirtymät auttavat tai haittaavat.
Spagetti-etenemisen välttäminen on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä on spagettimainen suorituspolku
"Spagettimainen suorituspolku" kuvaa koodia, jonka suoritus hyppii niin paljon paikasta toiseen, että sitä on vaikea seurata kuin toisiinsa takertuneita nuudeleita.
Liian monet yhteen kasatut breakit, continuet ja labelit voivat aiheuttaa tällaisen sekasotkun.
Tässä oppitunnissa näytetään, miten suorauksen ohjausta käytetään harkitusti, jotta silmukat pysyvät selkeinä.
Labelit ovat tehokkaita mutta riskialttiita
Nimetyt break- ja continue-lauseet ovat hyödyllisiä työkaluja, mutta niiden avulla koodi voi hypätä usean silmukan yli.
Jos niitä käytetään kaikkialla, lukija joutuu seuraamaan monia mahdollisia suorituspolkuja samanaikaisesti.
Tavoitteena ei ole välttää labeleita kokonaan, vaan käyttää niitä vain silloin, kun ne aidosti yksinkertaistavat logiikkaa.
Sotkuinen esimerkki
Tässä silmukassa yhdistyvät nimetty continue, nimetty break ja tavallinen break samassa kohdassa.
Koodi toimii, mutta suorituspolun seuraaminen vaatii todella paljon vaivaa. Se on varoitusmerkki.
public class Main {
public static void main(String[] args) {
outer:
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (j == 1) continue outer;
if (i == 2) break outer;
if (i + j == 3) break;
System.out.println(i + "," + j);
}
}
}
}Jäsentäminen metodin avulla
Usein siistein ratkaisu on siirtää sisempi silmukka omaan metodiinsa ja käyttää return-lausetta.
Metodista palaaminen lopettaa suorituksen siististi ilman yhtäkään labelia.
public class Main {
static int findFirst(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] nums = {5, 8, 3, 9};
System.out.println(findFirst(nums, 3));
}
}Miksi return on selkeämpi
Edellä olevassa metodissa return i; lopettaa haun heti, kun vastaavuus löytyy.
Siinä ei ole labeleita, lippumuuttujia eikä seurattavaa sisäkkäistä breakia.
Sisäkkäisissä hauissa metodin erottaminen omaksi kokonaisuudekseen ja returnin käyttäminen on yleensä selkeämpää kuin nimetty break.
Suosikaa selkeitä ehtoja
Joskus breakia tai continuea ei tarvita lainkaan. Hyvin kirjoitettu silmukan ehto voi ilmaista saman asian.
Tässä lopetamme luonnollisesti, kun arvo löytyy, ilman breakia.
public class Main {
public static void main(String[] args) {
int[] nums = {2, 4, 6, 8};
int i = 0;
boolean found = false;
while (i < nums.length && !found) {
if (nums[i] == 6) {
found = true;
} else {
i++;
}
}
System.out.println(found ? "Found at " + i : "Missing");
}
}Jatkaminen suojausehtojen avulla
Tavallinen continue voi itse asiassa vähentää sisäkkäisyyttä. Ohittakaa tarpeettomat alkiot heti, jolloin päälogiikka pysyy suorana.
Näin vältätte syvän if-lauseiden pyramidin.
public class Main {
public static void main(String[] args) {
String[] names = {"Ann", "", "Bob", ""};
for (String name : names) {
if (name.isEmpty()) {
continue;
}
System.out.println("Hello, " + name);
}
}
}Milloin nimetty break on perusteltu
Labeleita ei ole kielletty. Yksi nimetty break aidossa sisäkkäisessä haussa voi olla selkein vaihtoehto.
Ratkaiseva kysymys on rehellisyys: tekeekö label tarkoituksesta ilmeisen vai kätkeekö se sekavan rakenteen?
Yksi tarkoituksellinen label on parempi kuin kolme lippumuuttujaa.
public class Main {
public static void main(String[] args) {
int[][] grid = {{1, 2}, {3, 4}};
scan:
for (int[] row : grid) {
for (int v : row) {
if (v == 3) {
System.out.println("Found 3");
break scan;
}
}
}
}
}Vältä syvää sisäkkäisyyttä
Spagettimainen koodi syntyy usein silmukoista, jotka on sisäkkäistetty neljälle tai viidelle tasolle.
Jos päädytte niin syvälle, pohtikaa, voisiko apumetodi, erilainen tietorakenne tai stream purkaa logiikan sisäkkäisyyttä.
Vähän sisäkkäisyyttä sisältävää koodia on helpompi hahmottaa kuin nokkelia hyppäyksiä.
Yksinkertainen tarkistuslista
Ennen labelin lisäämistä kysykää: Voiko tämän tehdä metodilla, jossa on return? Voiko selkeä silmukan ehto hoitaa tämän? Voiko suojausehdon continue hoitaa tämän?
Jos voi, suosikaa niitä. Jos label on silti yksinkertaisin ratkaisu, käyttäkää sitä ja nimetkää se hyvin.
Luettavuus ensin
Ohjausvirta on selkeyden, ei nokkeluuden työkalu. Paras silmukka on sellainen, jonka työtoveri ymmärtää yhdellä silmäyksellä.
Pidä hypyt vähäisinä, nimeä labelit kuvaavasti ja siirrä koodi metodeihin, kun sisäkkäisyys kasvaa.
Kun toimit näin, ohjausvirtasi pysyy siistinä eikä muutu koskaan spagetiksi.
Pikatarkistus
Valitse useimmissa tapauksissa siistein tapa poistua sisäkkäisestä hausta.
Kertaus
Spagettimainen ohjausvirta syntyy liian monista toisiinsa kietoutuvista hypyistä. Vältä sitä suosimalla metodeja, joissa on return, selkeitä silmukan ehtoja ja suojausehdoissa käytettävä continue-komento.
Käytä nimettyä break- tai continue-lauseketta vain silloin, kun se todella selkeyttää sisäkkäistä hakua, ja nimeä labelit aina hyvin.
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”Spagetti-etenemisen välttäminen” ilmainen?
Kyllä – oppitunnin ”Spagetti-etenemisen välttäminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Spagetti-etenemisen välttäminen”?
Milloin nimetyt siirtymät auttavat tai haittaavat. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Spagetti-etenemisen välttäminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- break ja continue
- Nimetty break
- Nimetty continue
- Spagetti-etenemisen välttäminen