"Hej Amigo! Idag ska jag berätta om kodstilar och vikten av kodstil."

"Jag börjar med det som är viktigast.  Java-kod ska vara lätt att läsa.  Det allmänna tillvägagångssättet för koden är detta: koden skrivs en gång men läses hundra gånger."

"Anta att du och 10 andra programmerare skriver en ansökan. Ni arbetar med applikationen i tre år, med mellanliggande utgåvor var tredje månad."

"Så länge?"

"Det här är Java, min unga gräshoppa! "Vad sägs om ett företagssystem som körs på ett dussin servrar och skrivet av 100 personer under mer än 6 år? Det händer också ibland."

"Oj."

"Hur som helst, huvudregeln, huvudkravet för kod är att det måste vara lätt för andra utvecklare att läsa."

"I andra programmeringsspråk arbetar människor ofta som små team med små uppgifter, så de kan ha en annan huvudregel, som "Det fungerar? Utmärkt".

"Under loppet av ett par år kommer alla dina teammedlemmar att göra flera ändringar i koden som du har skrivit. Och varje gång måste de förstå hur koden fungerar."

"Och obegriplig kod som fungerar perfekt är svår att ändra.  De kommer att kassera den och skriva om den på sitt eget sätt.  Så skriv kod som andra kan förstå.  Om du kan förbättra din kod, förbättra den. Om den kan förbättras, då måste det förbättras! "

"Om du skriver kod i 15 minuter och sedan lägger två timmar på att förbättra den, gör du det rätt. Hur mycket tid sparar du på laget?"

"'2 timmar att förstå din kod' x 'de 100 gånger när folk behöver förstå den' = 200 timmar."

"Jag drog de här siffrorna ur luften, men jag vill att du ska förstå problemet och dess omfattning.  Din kod är skapad för att läsas av andra programmerare.  Allt annat är sekundärt."

"Fungerar koden inte korrekt? Vi fixar det. Inte optimerat? Vi optimerar det. Inte dokumenterat? Vi lägger till kommentarer."

" Är koden svår att läsa? Kasta skiten i papperskorgen och skriv allt igen från början! "

"Jag tyckte inte att det var en så stor grej."

"En av anledningarna till att Java är ett ledande programmeringsspråk är att all Java-kod är skriven för att läsas av andra programmerare."

"Låt oss nu gå vidare till den andra frågan: hur gör du din kod så lätt att läsa som möjligt? "

"Vem som helst kan förstå när någon talar bekanta ord på hans eller hennes modersmål. Detsamma gäller här. Koden är lätt att läsa när en programmerare lätt kan gissa:

A)  Vad varje metod gör

B)  Syftet med varje klass

C)  Exakt vad varje variabel lagrar.

Allt detta kommuniceras i namn: klassnamn, metodnamn och variabelnamn. Dessutom finns det stil när det gäller att namnge variabler. Och det finns kodstil."

"Jag är redo att lyssna."

" Programmering bygger på bra engelska!  Ett välskrivet program läser som vanlig teknisk dokumentation. "

" Låt oss börja med namn. "

"Ett metodnamn ska kort beskriva vad metoden gör. Då kan koden läsas som enkel prosa."

Program
public String downloadPhoto(String url)
{
 String resultFileName = TempHelper.createTempFileName();

 Downloader downloader = new SingleFileDownloader(new Url(url));
 downloader.setResultFileName(resultFileName)
 downloader.start();
 while(downloader.isDone())
 {
  Thread.sleep(1000);
 }

 if (downloader.hasError())
  return null;

 return resultFileName;
}

"Så här läses ett sådant program."

Linje 1.

"Metoden heter 'downloadPhoto'. Det verkar som att den laddar ner en fotofil från Internet. Var laddas den ner till? Vi vet inte än. Varifrån? Metoden har en parameter som heter url — det är förmodligen webbadressen till nedladdningen."

Rad 3.

"Variabeln resultFileName deklareras och tilldelas ett värde av TempHelper.createTempFileName();"

Så detta måste vara den lokala sökvägen till filen där vi sparar vår nedladdade fil.

"Namnet 'TempHelper' säger oss ingenting. Suffixet 'Hjälpare' säger att detta är en slags verktygsklass som inte innehåller viktig affärslogik, utan snarare används för att förenkla rutinuppgifter som förekommer ofta."

"Metodnamnet 'createTempFileName' indikerar att den här metoden skapar och returnerar namnet på en temporär fil (temp-fil). En temporär fil är en temporär fil som skapas ett tag och sedan vanligtvis raderas när programmet stängs. "

Rad 5.

"Ett SingleFileDownloader-objekt skapas och tilldelas variabelnedladdaren."

Detta är objektet som kommer att ladda ner vår fil från Internet.

"Ett SingleFileDownloader-objekt tilldelas variabeln nedladdare. Av namnet kan vi anta att programmet har flera typer av nedladdningsklasser. En är skriven för att ladda ner enstaka filer, och vi kan förmodligen förvänta oss att stöta på andra nedladdare i koden för grupper. av filer med namn som: MultiFileDownloader, FileGroupDownloader eller DirectoryDownloader"

Rad 6.

"Vi ställer in nedladdningsobjektets resultFileName-egenskap lika med värdet på variabeln resultFileName. Med andra ord talar vi om för laddaren var den nedladdade filen ska sparas. Som du kan förvänta dig. Så, vi förutsäger i princip koden!"

Rad 7.

"Vi kallar startmetoden. Nedladdningen startar. Det är vettigt. Jag undrar hur nedladdningen går till: i delar, på en separat tråd eller hela grejen här? Om vi ​​laddar ner det hela här kan det ta en lång tid och får konsekvenser."

Rad 8-11.

"Ah. Här ser vi standardloopen skriven av någon som väntar på att en nedladdning ska slutföras. Downloder-objektet har en done-egenskap, som returneras av metoden isDone(). Eftersom metoden heter isDone(), snarare än getDone( ), drar vi slutsatsen att variabeln done är en boolesk eller kanske en boolesk."

Rad 13-14.

"Om ett fel uppstår under nedladdningen så returnerar metoden downloadPhoto null. Det är bra att den hanterar fel. Det är dåligt att det bara returnerar null - det är inte klart vad felet är. Det vore bättre att kasta ett undantag med information om felet."

Linje 16.

"Vi returnerar sökvägen till den lokala filen som innehåller den nedladdade filen."

"Oj!"

"Det här programmets kod gör att det är helt klart vad det gör. Du kan till och med göra gissningar om hur programmet är organiserat och vilka andra klasser/metoder vi kommer att hitta."

"Nu förstår jag hur viktiga namn är."

"Mer om namn. Du kan ofta gissa vilka metoder ett objekt/klass har. Till exempel, om ett objekt är en samling, så kommer det med största sannolikhet att ha en size() eller count() metod för att få antalet element. Även , kommer den förmodligen att ha en add() eller insert() metod. Element hämtas från samlingsklasser med metoderna get/getItem/getElement."

"Om en variabel kallas i, j eller k, så är det troligen en loopräknare."

"Om en variabel kallas m eller n, så är det troligen storleken på en array/samling."

"Om en variabel kallas namn, är det troligen en sträng som innehåller någons namn."

"Om en klass heter FileInputStream, så är den samtidigt en fil och en indataström."

"Ju mer kod du ser, desto lättare är det att läsa andras kod."

"Men ibland finns det kod som är väldigt svår att läsa. I det här fallet kommer här ett mycket praktiskt råd:"

Dricks
Skriv kod som om den skulle underhållas av en våldsam psykopat som vet var du bor .

"Det är roligt och inte roligt på samma gång."

"Nu lite om stilarna som används för att namnge variabler."

"Java-utvecklare försöker ge mycket informativa namn till variabler och metoder. Som ett resultat består namn ofta av flera ord. Det finns fyra stilar för versaler av sammansatta namn."

1) Små bokstäver  – Alla ord skrivs med små bokstäver. Till exempel:

'Grönt hus'  blir 'växthus'

"Hollywoodgirl"  blir  "hollywoodgirl"

Denna stil används för paketnamn.

2) Versaler  – Alla ord skrivs med stora bokstäver och separeras med ett understreck. Till exempel:

'Maxvärde'  blir MAX_VALUE

"Cat count"  blir CAT_COUNT

"Denna stil används för namn på konstanter (slutliga statiska fält)."

3) CamelCase  – Alla ord är skrivna med små bokstäver, förutom att den första bokstaven i varje ord är versal. Till exempel:

'Green House'  blir  'GreenHouse'

"Hollywood girl"  blir "HollywoodGirl"

Denna stil används för namn på klasser och gränssnitt.

4) Lägre CamelCase (blandade bokstäver)  – Alla ord är skrivna med små bokstäver, förutom den första bokstaven i varje ord utom den första är versal. Till exempel:

"Get width" blir "getWidth"

'Get Hollywood girl name' blir  'getHollywoodGirlName'

"Denna stil används för namn på variabler och metoder."

"Så, det finns inte för många regler."

1)  Allt är skrivet i Lower CamelCase.

2)  Namn på klasser och gränssnitt är alltid versaler.

3)  Paketnamnen är alltid gemener.

4)  Konstanter är alltid versaler.

"Det finns ett par nyanser, men i allmänhet är det vad det är."

"Nu om metoder.  "Metodnamn börjar nästan alltid med ett verb! 'count' är ett dåligt namn på en metod. Det är bättre att kalla det getCount(). En metod utför någon åtgärd på objektet:  startDownload , interrupt  , sleep  , loadPirateMusic ."

"Som du redan vet finns det getters och seters för att arbeta med ett objekts egenskaper/fält:  getName / setName , getCount / setCount , etc."

"Det enda undantaget är för booleaner. För booleaner använder getternamn 'is', inte 'get', t.ex. isDone, isEmpty. På så sätt är det närmare vanligt tal."

"Vad sägs om att jobba två timmar om dagen istället för åtta? Frestad?"

"Ja!"

"Som du borde vara. För en junior Java-utvecklare är grundkravet en utmärkt förståelse för grunderna i Java, dvs Java Core."

"Jag har en annan fråga. Varför har vi dessa olika metoder för att få fram antalet element?"

Klass Metod/egenskap för att få antalet element
Sträng längd ()
Array längd
ArrayList storlek ()
Trådgrupp aktivt antal ()

"För det första uppfanns Java för mer än 20 år sedan, innan krav som setCount / getCount hade fastställts, och det fanns ett vanligt tillvägagångssätt från C-språket för att 'göra det så kort som möjligt'."

"För det andra spelar semantik en roll här. När vi talar om en array talar vi om dess längd. När vi talar om en samling talar vi om dess storlek."

"Vilken intressant lektion."

"Jag skulle vilja berätta mer, men jag är rädd att du inte kommer ihåg allt på en gång. Det är bättre att dela ut det till dig i små portioner."

"Men jag vill beröra stilen när det gäller användningen av lockiga parenteser: {}. Det finns två tillvägagångssätt:"

1)  Fästet går på en ny linje varje gång

2)  Öppningsfästet går i slutet av föregående rad, medan stängningsfästet går på en ny linje. Denna stil kallas "egyptiska hängslen".

"Ärligt talat får du välja hur du ska koda. Många använder en öppningsstag på samma rad. Många sätter den på en ny rad. Det är som debatten om vilken ände av ägget som ska brytas: den lilla änden eller den stora slutet."

"Det enda jag kan rekommendera är att hålla fast vid vilken stil som helst som används i projektet du arbetar med. Ändra inte någon annans kod för att matcha din föredragna stil.  Människor är ofullkomliga. Jag berättar detta för dig som doktor Bilaabo. "

"Tack för den intressanta lektionen, Bilaabo. Jag ska gå och reflektera över vad du har sagt."