Programmēšana

Java ir goto

Ir kāds vecs programmētāja joks, kas izsakās apmēram šādi: Viens programmētājs dusmās saka otrajam programmētājam: "Ej uz elli!" Otrais programmētājs acīmredzami atbildīgi atbild: "Ugh, tu izmantoji goto!" Šī nerdija humora būtība ir tāda, ka daudziem programmētājiem "goto" lietošana ir gandrīz vissliktākais pārkāpums, ko var izdarīt.

Ir vairāki iemesli, kāpēc programmatūras izstrādātāji to uzskata par tik zemu. Edsgera W. Dijkstra raksts “Case Against the GO TO Statement” ir samērā agrs traktāts par GOTO ļaunprātīgas izmantošanas ļaunumiem. Šajā rakstā Dijkstra paziņo: "[es pārliecinājos], ka paziņojums" iet uz paziņojumu "ir jāatceļ no visām" augstākā līmeņa "programmēšanas valodām." Dijkstras Go To Statement, kas tiek uzskatīts par kaitīgu, vēstule ne tikai izvilka goto paziņojumu, bet arī aizsāka populāru datorzinātņu tendenci izmantot frāzi "uzskatīts par kaitīgu" (lai gan šie divi vārdi pirms tam acīmredzot tika izmantoti ārpus programmēšanas).

Daudzus programmētājus kopš Dijkstra ir nomocījušas dažas uzturēšanas problēmas, kas saistītas ar goto paziņojumu izmantošanu noteiktās valodās. Citi programmētāji ir dzirdējuši šos stāstus vai tik ļoti ir sadūšojušies, ka "Tu nedrīksti izmantot goto", ka viņiem nav nepieciešams no savas puses piedzīvot tā trūkumus, lai uzskatītu, ka viņiem nevajadzētu izmantot GOTO.

Lai gan šķiet, ka goto paziņojumam ir kopumā slikta reputācija, tas nav bez tā atbalstītājiem. Frenks Rubins uzrakstīja atbildi uz Dijkstra Pāriet uz paziņojumu, kas uzskatīts par kaitīgu (1968. gada marts) sauca GOTO, kas tiek uzskatīts par kaitīgu, tiek uzskatīts par kaitīgu (1987. gada marts). Šajā vēstulē Rubins rakstīja par Dijkstras vēstules ietekmi uz programmētājiem tik dramatiski, ka "priekšstats, ka GOT0 ir kaitīgs, tiek pieņemts gandrīz vispārīgi, bez šaubām un šaubām". Par šo novērojumu Rubins rakstīja: "Tas ir nodarījis neaprēķināmu kaitējumu programmēšanas jomai, kas ir zaudējusi efektīvu rīku. Tas ir tāpat kā miesnieki, kas aizliedz nažus, jo darbinieki dažreiz sevi sagriež." Ņemiet vērā, ka Dižkstra uz Rubina vēstuli atbildēja ar sarunu Par nedaudz vilšanos. Cunningham & Cunningham Wiki lapa Go To saka par goto paziņojumu: "Māceklis to izmanto bez domāšanas. Braucējs izvairās no tā, nedomājot. Kapteinis to izmanto pārdomāti."

Ir daudz citu resursu, kas aptver goto paziņojuma izmantošanas plusus un mīnusus. Es nedomāju šīs debates atkārtot šeit, izņemot īsu izklāstu par jau apspriesto strīdu agrīno vēsturi. Esmu dzirdējis dažus Java izstrādātājus, kuri apgalvo, ka Java nav goto paziņojuma, un to es vēlos apspriest atlikušajā šī emuāra ziņojuma daļā.

Java rezervē "goto" kā rezervētu atslēgvārdu. Tomēr tas ir neizmantots atslēgvārds. Tas nozīmē, ka, lai arī atslēgvārds faktiski nedara neko produktīvu, tas ir arī vārds, kuru nevar izmantot kodā mainīgo vai citu konstrukciju nosaukumiem. Piemēram, šāds kods netiks apkopots:

iepakojums dustin.piemēri; / ** * Klase, kas demonstrē Java goto līdzīgo funkcionalitāti. * / public class JavaGotoFunctionality {/ ** * Galvenā izpildāmā funkcija. * * @param arguments Komandrindas argumenti: neviens nav paredzēts. * / public static void main (pēdējie String [] argumenti) {final String goto = "Ej gulēt!"; }} 

Ja mēģinu apkopot šo kodu, redzu tādu kļūdu, kāda parādīta nākamajā ekrāna momentuzņēmumā.

Kļūdas ziņojums “paredzams” ar rādītāju vietā pirms “goto” dod pieredzējušam Java izstrādātājam pietiekami daudz pavediena, lai ātri saprastu, ka “goto” lietošanā ir kaut kas nepareizs. Tomēr tas var nebūt tik acīmredzams kādam jaunam Java lietotājam.

Es parasti neizmantoju goto konstrukciju, bet es arī atzīstu, ka ir situācijas, kurās tā izmantošana padara kodu vieglāk lasāmu un izmanto mazāk trakus apietus nekā tā neizmantošana. Java valodā tas ir arī realizēts, un tiek sniegts atbalsts dažām visbiežāk sastopamajām situācijām, kurās goto paziņojums būtu visnoderīgākais un, visticamāk, faktiski būtu vēlams alternatīvām. Acīmredzamākie to piemēri ir marķēti pārtraukums un marķēti Turpināt paziņojumi. Tie tiek apspriesti un parādīti Java apmācību sadaļā Branching Statement.

Spēja iezīmēt konkrētu paziņojumu un pēc tam iegūt pārtraukums vai Turpināt attiecas uz šo paziņojumu, nevis uz tā vistiešāko paziņojumu (kā bez etiķetes pārtraukums vai Turpināt dara) ir īpaši noderīgs gadījumos, kad ligzdotajām cilpām citādi būtu nepieciešams vairāk koda un sarežģītāks kods, lai veiktu vienu un to pašu. Es atklāju, ka es bieži varu pārveidot savas datu struktūras un kodu, lai izvairītos no šādām situācijām, taču tas ne vienmēr ir praktiski.

Vēl viens labs resurss, kas saistīts ar Java goto veida funkcionalitātes izmantošanu, ir 2000. gada 13. jūnija JDC Tech Tip Goto paziņojumi un Java programmēšana. Kā norādīts šajā padomā, etiķetes faktiski var izmantot jebkuram blokam, un tās nav ierobežotas pārtraukums un Turpināt. Tomēr mana pieredze ir tāda, ka šī pieeja ir nepieciešama ārpus pārtraukums un Turpināt ir daudz retāk sastopama.

Viens svarīgs novērojums par etiķetēm ir tāds, ka koda izpilde burtiski neatgriežas pie šīs etiķetes, kad salauzt somelabel tiek izpildīts. Tā vietā izpildes plūsma iet uz priekšrakstu tūlīt pēc marķētā paziņojuma. Piemēram, ja man būtu ārējs priekš cilpa ar nosaukumu "dustin:", tad pārtraukums tam faktiski iet uz pirmo izpildāmo paziņojumu pēc šī apzīmējuma beigām priekš cilpa. Citiem vārdiem sakot, tas darbojas vairāk kā komanda "aiziet paziņojumu pēc etiķetētā paziņojuma".

Es nesniedzu neviena piemēra, kā izmantot šos marķētos pārtraukums vai marķēti Turpināt paziņojumus, jo tiešsaistē ir daudz labu piemēru. Konkrēti, jau minētie divi resursi (Java Tutorials Branching Statements un Goto Statements un Java Programming Tech Tip) ietver vienkāršus ilustratīvus piemērus.

Jo vairāk es strādāju programmatūras izstrādes nozarē, jo pārliecinātāk pārliecinos, ka programmatūras izstrādē ir maz absolūtu un ka ekstrēmistu pozīcijas vienā vai otrā brīdī gandrīz vienmēr būs nepareizas. Es parasti atturos no goto vai goto līdzīgā koda izmantošanas, taču ir gadījumi, kad tas ir labākais kods šim darbam. Kaut arī Java nav tieša goto atbalsta, tas nodrošina goto līdzīgu atbalstu, kas apmierina lielāko daļu manu salīdzinoši reti nepieciešamo šāda atbalsta.

Šo stāstu "Java's goto" sākotnēji publicēja JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found