Kode Workshop Java Strings

I denne Kode Workshop vil vi teste din kunnskap om Java Strings. Innenfor prøvekoden skal strengvariabler behandles i en Java-klasse, som igjen har en indre klasse. For å finne ut hva som vil skje når koden kjøres, må du forstå ikke bare Strings grunnleggende, men også prinsippene for objekter og klasser, samt kontrollstrukturer, inkludert metoder, looper og conditionals..

Når du arbeider gjennom koden, husk at programmereren som skrev den, kan ha feil i logikken. Koden inneholder ikke noen syntaksfeil som vil kaste unntak ved kjøretid, men utfallet kan ikke nødvendigvis være hva programmereren hadde til hensikt. Når du jobber på et hvilket som helst programmeringsprosjekt, er det en stor sjanse for at du vil ende opp med å jobbe med en andres kode, eller kode du skrev deg selv på et tidspunkt tidligere og kan knapt huske. Dessverre har mennesker ikke en tendens til å produsere perfekt kode veldig ofte, så det er viktig å lese med et kritisk øye.


Problemet

Java-koden nedenfor representerer en Java-klassefil med en indre klasse i den. I koden, tekst String variabler gjennomgår flere forskjellige prosesser. Hva skjer når StringFun-konstruktormetoden utføres? Arbeid gjennom koden og noter hva du tror vil bli skrevet ut gjennom systemutgangsprosedyrene i punktene A, B, C, D, E og F, med tanke på at noen av disse kan utføre mer enn en gang. Det kan hende du finner det enklest å bruke blyant og papir for å merke hva som skjer når koden utvikler seg.

 offentlig klasse StringFun public StringFun () String initString = "abcdefghij"; StringWorker strWorker = ny StringWorker (initString); String theStr = strWorker.getText (); System.out.println ("PUNKT A:" + theStr); strWorker.setText (strWorker.multiplyText (1, theStr)); System.out.println ("Punkt B:" + strWorker.getText ()); int endPosn = initString.length () / 2; String endString = (theStr.length ()> endPosn? TheStr.substring (0, endPosn): theStr); System.out.println ("Punkt C:" + endString); String anotherString = endString.concat (strWorker.getText ()); System.out.println ("POINT D:" + anotherString);  offentlig klasse StringWorker private String theText; privat int maxlength; offentlig StringWorker (String initText) theText = initText; maxlength = 5; shortenString (); multiplyText (2, theText); System.out.println ("POINT E:" + theText);  privat void shortenString () hvis (theText.length ()> maxLength) theText.substring (0, maxLength);  offentlig String multiplyText (int multBy, String multText) StringBuilder sBuild = ny StringBuilder (multText); for (int i = 0; i 

Løsningen

Dette er hva som er output når StringFun-konstruktormetoden utføres:

 Punkt F: abcdefghij PUNKT E: abcdefghij PUNKT A: abcdefghij PUNKT F: abcdefghij PUNKT B: abcdefghijabcdefghij PUNKT C: abcde PUNKT D: abcdeabcdefghijabcdefghij

Legg merke til hvilken strengvariabel som skrives ut i hver setning - noen ganger er det instansvariabelen og noen ganger er det en lokal variabel. Hvis dette ikke stemmer overens med det du trodde ville bli levert, ikke bekymre deg. Koden er forsettlig vanskelig. Hvis du fikk utgangen riktig, godt gjort!


Notater og forklaringer

Vedlagte kildefil inneholder den komplette koden med merknader som forklarer hva som skjer under utførelsen. Du kan få bedre innsikt ved å kompilere og kjøre programmet og legge til flere sporopplysninger hvis du finner det som hjelper (legg til kilden Java-klassefilen til et prosjekt og opprett et objekteksemplar av StringFun-klassen for å starte).

La oss gå over noen av problemerne her.

uforanderlighet

I StringWorker-konstruktormetoden kalles "shortenString" -metoden. Selv om denne metoden kaller substringmetoden på instansvariabelen String, endrer den ikke faktisk verdien. I Java er strenger ugjennomtrengelige. Dette betyr at når du endrer en streng, oppretter Java faktisk en ny streng. Substrengmetoden endrer ikke strengen det påkreves, men kopierer innholdet til en ny streng med substringendringen som er brukt, og returnerer denne nye strengverdien. Hvis substring metoden samtale ble endret som følger:

 theText = theText.substring (0, maxLength);

Resultatet vil være annerledes, da instansvariabelen vil bli oppdatert for å inneholde den nye substringen. Som koden står, returnerer metoden "abcde", men gjør ingenting med det.

Parametre og Returnerer

En annen potensielt vanskelig del av koden er "multiplyText" -metoden. Forvirringen her er forårsaket av at metoden har et upassende navn, og det blir ikke brukt på riktig måte. Hvis du, i stedet for å arbeide gjennom metodeinnholdet, tok en intuitiv tolkning av denne metoden, ville du anta at formålet ville være å formere teksten med tallet som er bestått som et heltallsparameter. I virkeligheten legger metoden teksten til seg selv som mange ganger, noe som betyr at det resulterer i enda en "ganger" selv enn du kanskje forventer. Metode navn kan ha stor innvirkning på hvordan brukbar et Java-bibliotek eller -program, som kan variabel og klassenavn.

Metoden "multiplyText" kalles to ganger i koden, en gang i StringFun-konstruktøren og en gang i StringWorker-konstruktøren. I StringWorker-konstruktøren gjør koden ikke noe med den returnerte String, og slik kalles metoden ikke effektivt. Metoden "multiplyText" endrer ikke instansvariabelen String. Den utfører endringer på en passert streng, og returnerer resultatet som en ny streng. Når "multiplyText" -metoden kalles i StringFun-konstruktøren, gjør denne gangen koden noe med resultatet - det setter StringWorker-instansvariabelen til den returnerte String, ved hjelp av "setText" -metoden.

Disse forvirringene er ikke bare en indikator på å bruke en metode uegnet, men et tegn på at metoden selv er sannsynligvis dårlig utformet og oppkalt. Metoden "shortenString" endrer klassens instansvariabel, mens "multiplyText" -metoden ikke har noen innflytelse på instansvariabelen. Enten eller begge disse er hensiktsmessige avhenger av formålet med klassen i søknaden, men navnene deres må reflektere deres formål på en måte som er intuitiv for å forstå.

Hvilken variabel?

Den andre generelle forvirringskilden i koden er at vi har å gjøre med flere forskjellige klasse- og lokale variabler. Hvis du for eksempel ser på delen i StringFun-konstruktøren der vi oppretter en ny lokal variabel kalt "endString", vil du se at den utfører behandling på en variabel som heter "theStr", som ble opprettet noen linjer før. Gitt prosessen som skjer mellom disse to delene, kan du intuitivt forvente at "endString" -delen behandler den nylig endrede StringWorker-objektets instansvariabel i stedet for en tidligere lokal variabel. Koden ser derfor ut til å være intuitiv, men igjen blir slike tolkninger hindret av mangel på kommentarer som indikerer formålet med en av klassene, eller noen av variablene.


Konklusjon

OK, så koden hadde noen triks i den. Dette er imidlertid å gjenspeile virkeligheten av å jobbe på mange Java-prosjekter. Selv med det beste av intensjoner inneholder de fleste koden feil. Programmeringsprosjekter er ofte gjenstand for endringer i plan som til slutt resulterer i villedende logikk, samt variabel- og metodenavn som virker forvirrende. Hvis koden er dårlig kommentert, eller ikke kommenteres i det hele tatt som i eksemplet ovenfor, gjør dette saken enda verre.

Å ha evnen til å lese kode realistisk og bruke praktiske tiltak som sporopplysninger for å se hva som skjer på forskjellige punkter under utførelsen, er en reell ressurs i et hvilket som helst programmeringsprosjekt, som det er å forstå språkstrukturer.