Miért van a Java-ban break meg continue utasítás?
"A programozásban mindennek megvan a maga feladata, ahogy a valós életben is."
Igen erre kérdeztem rá, hogy miért van break meg continue? Egy válasz tényleg jött erre nagyjából, azt le is pontoztátok rendesen. Sértegetés meg egyéb jött rendesen, hogy mekkora hülye vagyok, mert ez nem is működik, meg a kivételekről kiselőadás a fogalmak ismerete nélkül amire hivatkozik, a kivétel=hiba a hiba rossz => kivétel rossz típusú érvelés. Ilyen szinten könnyű válaszolni, csak nem ez volt a kérdés, a programnyelv tudjátok nem valamilyen felsőbb erőtől származik, fel lehet tenni kérdéseket a felépítésével kapcsolatban, akkor is, ha ez néhány okos lelki világát sérti.
A programozásban tetszik-nem tetszik több megoldás van ugyanarra a feladatra, lehet így vagy úgy és minkettőnek van előnye/hátránya, ennél is így van. A goto használata meg azért rossz mert olvashatatlan/javíthatatlan kódot csinál, de nem veszélyes. Megelégszem a válaszokkal köszönöm.
Őszintén szólva a legtöbb válaszoló nagyon tudatlan.
Vannak olyan programozási nyelvek, méghozzá elterjedtek is, ahol kivételeket használnak ciklusvezérlésre.
És igenis vannak olyan esetek, amikor jó ötlet erre kivételeket használni. Láttam már ilyen kódot, és nem lehetett volna jobban megoldani break és continue statementekkel.
Például, teszem azt van egy olyan ciklusod, aminek a magjában stringek feldolgozása történik, egy másik adattípusra való konvertálás után. Például integer típusra. Mondjuk sorszámokat konvertálsz string-ből int-é. Ilyenkor ha hibás string érték érkezik, akkor a konvertálás egy ValueError kivételt dob. De, például a -4 érték valid integer, mégsem valid sorszám, vagyis szintén a ValueError hatáskörébe eső kivétel. Ha mindkét esetet ugyanúgy kell lekezelni, akkor igenis kimondottan jó ötlet a ciklus magjában tesztelni az adott értéket, és ha például negatív szám, akkor ValueError-t dobni.
De gondolom sokan azt sem tudják itt, hogy például Python-ban az iterátorok és generátorok "végjele" mindig egy StopIteration exception... A break működése gyakorlatilag ekvivalens a StopIteration kivétellel, azzal az egy különbséggel, hogy a break-et nem lehet elkapni. A StopIteration gyakorlatilag egy felülbírálható break-nek felel meg.
@01:03: Ez a példa megint más, ebben az esetben jogos a kivétel, mivel ez valóban egy "kivételes/hibás" esetet jelent.
De ez baromi eltér attól, amit a kérdező akar, hogy minden esetben a break helyett kivételeket használjon.
(Látom programozás elméletet nem sokan tanultak itt...)
Viszont ez talán jobban megmagyarázza a dolgot számodra.
Az exception, a continue és a break három különböző funkciót lát el, és különböző tulajdonságokkal bír.
Ha kicsit elvontabban gondolkozol, és a ciklusmagot egy void függvényként fogod fel, akkor a continue a ciklusmag return-je. Ez nem befolyásolja a többi iteráció végrehajtását.
Az cikluson kívül elkapott exception kiléphet a ciklusból a break-hez hasonlóan, de ez a ciklusmagon belül befolyásolható! Azaz, például a ciklusmagon belül keletkező, vagy ott dobott exceptiont a ciklusmagon belül tesztelheted egy adott feltétel szerint, és ez alapján elnyelheted, vagy továbbdobhatod.
A break esetén ez máshogy van. A break ugyanis később újra már nem tesztelhető, vissza nem fordítható semmilyen módon.
Vagyis, ez a 3 feature 3 különböző dologra jó, nem pontosan ugyanazt lehet velük megvalósítani.
És abban azért igazuk volt, hogy break helyett semmiképp nem jó ötlet exceptiont használni. Viszont, ahogy az előző válaszomban prezentáltam, igenis vannak olyan esetek, amikor átlátható, szép megoldást eredményez az exception segítségével történő ciklusvezérlés.
Ez megadja a választ a kérdésere?
"Ez a példa megint más, ebben az esetben jogos a kivétel, mivel ez valóban egy "kivételes/hibás" esetet jelent. "
Az utolsó iteráció is kivételes eset. Ezért használnak Python-ban StopIteration exceptiont az iteráció végjeleként.
Én pont arra akartam rávilágítani, hogy az iteráció tervezett vége (StopIteration) más, mint az idő előtti vége (break). Szerintem egy szépen szervezett kódban a break egyébként szintén kivételes esetet jelent ebből a szempontból, mivel ekkor a ciklus még az iterátor végjele előtt lép ki. Ami meg nekem eléggé kivételes esetnek hangzik. Neked nem?
Pontosan ezt próbálták a többiek is leírni.
Nem ugyan arra való.
"igenis vannak olyan esetek, amikor átlátható, szép megoldást eredményez az exception"
Ezt pedig senki sem tagadta, pusztán az alapfeltevés nem ez volt, amit a kérdező felhozott.
Illetve kérdező közben már odáig is elment, hogy egyszerűen egy érték visszaadásra akarta használni a kivételeket...
1:10
Hát te nagyon el vagy tájolva.
Olvasd már el a kérdést, ami a zöld mezőben fent ki van írva:
"Nem értem miért hagyták ezt benne, ha egyszer fölösleges."
Az? Nem, nem az. Innentől azt se értem, minek írtad a válaszokat.
@01:16: Igen, sok esetben, jól szervezett kódban ez így van.
De ez nem jelenti máris azt, hogy dobjuk ki a break-et, mert "fölösleges", ahogy az ugyebár a kérdésben szerepelt.
Egyetértek, nem felesleges, de ezt ki is fejtettem a válaszomban.
Elsősorban a vastag betűs kérdést vettem alapul, mivel annak az lenne a funkciója, hogy arra válaszoljunk. Az apró betűs rész csak a részletek kifejtésére van ugyebár :) De én ettől még prezentáltam azt is, hogy miért nem felesleges a break. Megmutattam, hogy miben működik másképp a break, mint bármilyen exception. Ha nem lenne a működésben különbség, akkor én is feleslegesnek tartanám a break-et! Mivel lehetne helyette csinálni egy speciális exception osztályt, amit a ciklus statementje implicit "elkap". Ez pontosan ugyanolyan jól olvasható kódot eredményezne, és sebességben sem jelentene semmit, mivel fordításnál ki lehet optimalizálni ugyanarra a megvalósításra, mint amit jelenleg a break használ.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!