JavaRush /Java Blog /Random-TK /Umumy programmirleme stili boýunça gollanma
pandaFromMinsk
Dereje
Минск

Umumy programmirleme stili boýunça gollanma

Toparda çap edildi
Bu makala "Ösen Java" akademiki kursynyň bir bölegidir. Bu kurs Java aýratynlyklaryny nädip netijeli ulanmalydygyny öwrenmek üçin döredildi. Bu material obýekt döretmek, bäsdeşlik, seriallaşdyrmak, şöhlelendirmek we ş.m. ýaly “ösen” mowzuklary öz içine alýar, bu kurs Java usullaryny nädip özleşdirmelidigini öwreder. Jikme- jiklikler .
Mazmuny
1. Giriş 2. Üýtgeýän çäkler 3. Klass meýdanlary we ýerli üýtgeýjiler 4. Usul argumentleri we ýerli üýtgeýjiler 5. Boks we guty gutusy 6. interfeýsler 7. setirler 8. atlandyryş konwensiýalary 9. standart kitaphanalar 10. üýtgewsizlik 11. synag 12. Indiki. .. 13. Çeşme koduny göçürip alyň
1. Tanyşdyryş
Gollanmanyň bu bölüminde Java-da gowy programmirleme stiliniň we täsirli dizaýnyň umumy ýörelgelerini ara alyp maslahatlaşmagy dowam etdireris. Bu ýörelgeleriň käbirini gollanmanyň öňki baplarynda eýýäm gördük, ýöne Java döredijiniň başarnyklaryny ýokarlandyrmak maksady bilen köp amaly maslahatlar berler.
2. Üýtgeýän çäk
Üçünji bölümde ("Synplary we interfeýsleri nädip dizaýn etmeli"), çäk çäklendirmelerini göz öňünde tutup, synplaryň we interfeýsleriň agzalaryna görnükliligiň we elýeterliligiň nähili ulanylyp bilinjekdigini ara alyp maslahatlaşdyk. Şeýle-de bolsa, usuly durmuşa geçirmekde ulanylýan ýerli üýtgeýjileri entek ara alyp maslahatlaşmadyk. Java dilinde, bir gezek yglan edilen her ýerli üýtgeýjiniň çäkleri bar. Bu üýtgeýji, yglan edilen ýerinden usulyň (ýa-da kod blokynyň) ýerine ýetirilişine çenli görünýär. Umuman, berjaý edilmeli ýeke-täk düzgün, ýerli üýtgeýjini ulanyljak ýerine mümkin boldugyça ýakyn yglan etmekdir. Adaty bir meselä seredip geçeliň: for( final Locale locale: Locale.getAvailableLocales() ) { // блок codeа } try( final InputStream in = new FileInputStream( "file.txt" ) ) { // блока codeа } Iki kod böleklerinde üýtgeýjileriň gerimi bu üýtgeýjileriň yglan edilen ýerine ýetiriş bloklary bilen çäklenýär. Blok gutarandan soň, çäk gutarýar we üýtgeýji görünmeýär. Bu has düşnükli ýaly görünýär, ýöne Java 8-iň çykmagy we lambdalaryň ornaşdyrylmagy bilen ýerli üýtgeýänleri ulanýan diliň belli sözleriniň köpüsi köneldi. Öňki mysaldan aýlawyň ýerine lambdas ulanyp mysal getireýin: Arrays.stream( Locale.getAvailableLocales() ).forEach( ( locale ) -> { // блок codeа } ); varierli üýtgeýjiniň funksiýa argumente öwrülendigini görmek bolýar, bu bolsa öz gezeginde forEach usulyna argument hökmünde geçýär .
3. Synp meýdanlary we ýerli üýtgeýjiler
Java-daky her bir usul belli bir klasa degişlidir (ýa-da Java8 ýagdaýynda, usulyň deslapky usul hökmünde yglan edilýän interfeýsi). Synpyň meýdanlary bolan ýerli üýtgeýjileriň ýa-da durmuşa geçirmekde ulanylýan usullaryň arasynda at gapma-garşylygy ýaly ähtimallyk bar. Java düzüjisi, birden köp işläp düzüjiniň şol üýtgeýjini ulanmagy maksat edinýändigine garamazdan, bar bolanlaryň arasyndan dogry üýtgeýjini nädip saýlamalydygyny bilýär. Häzirki zaman Java IDE-ler, düzüjiler duýduryşlary we üýtgeýän bellikler arkaly şular ýaly gapma-garşylyklar haçan ýüze çykjakdygyny döredijä aýtmak üçin ajaýyp iş edýär. Codeöne kod ýazýan wagtyňyz beýle zatlar hakda pikir etmek has gowudyr. Mysal gözlemegi maslahat berýärin: public class LocalVariableAndClassMember { private long value; public long calculateValue( final long initial ) { long value = initial; value *= 10; value += value; return value; } } Mysal gaty aňsat görünýär, ýöne duzak. “CalculateValue” usuly ýerli üýtgeýän bahany girizýär we üstünde işleýär we şol bir at bilen synp meýdançasyny gizleýär. Setir value += value; synp meýdanynyň we ýerli üýtgeýäniň bahasynyň jemi bolmaly, tersine, başga bir zat edilýär. Dogry ýerine ýetiriş şuňa meňzeýär (bu açar söz ulanyp): public class LocalVariableAndClassMember { private long value; public long calculateValue( final long initial ) { long value = initial; value *= 10; value += this.value; return value; } } Bu mysal käbir tarapdan sada bolsa-da, käbir ýagdaýlarda düzediş we düzediş üçin birnäçe sagat gerek bolup biljekdigini görkezýär.
4. Usul argumentleri we ýerli üýtgeýjiler
Tejribesiz Java döredijileriniň köplenç düşýän başga bir ýalňyşlygy, ýerli üýtgeýjiler hökmünde usul argumentlerini ulanmakdyr. Java bahalary hemişelik däl argumentlere täzeden bellemäge mümkinçilik berýär (ýöne bu asyl bahasyna täsir etmeýär): public String sanitize( String str ) { if( !str.isEmpty() ) { str = str.trim(); } str = str.toLowerCase(); return str; } aboveokardaky kod parçasy owadan däl, ýöne meseläni açmak üçin gowy iş edýär: argument str bellendi başga bir baha (we esasan ýerli üýtgeýji hökmünde ulanylýar). Caseshli ýagdaýlarda (hiç hili kadadan çykma bolmazdan), bu mysalsyz edip bilersiňiz we etmeli (mysal üçin, argumentleri yzygiderli yglan etmek bilen). Mysal üçin: public String sanitize( final String str ) { String sanitized = str; if( !str.isEmpty() ) { sanitized = str.trim(); } sanitized = sanitized.toLowerCase(); return sanitized; } Bu ýönekeý düzgüne eýerip, ýerli üýtgeýjiler girizilende-de berlen kody yzarlamak we meseläniň çeşmesini tapmak has aňsat.
5. Gaplamak we gaplamak
Boks we gutulmak, Java-da başlangyç görnüşleri ( int, uzyn, goşa we ş.m. ) degişli görnüşli örtüklere ( Integer, Long, Double we ş.m.) öwürmek üçin ulanylýan usulyň adydyr . “Generics” -i nädip we haçan ulanmalydygyny öwrenmegiň 4-nji bölüminde, başlangyç görnüşleri generikleriň görnüş parametrleri hökmünde gaplamak hakda aýdanymda, muny eýýäm görüpdiňiz. Java düzüjisi awtoboksirlemek arkaly şeýle öwrülişikleri gizlemek üçin elinden gelenini etse-de, käwagt bu garaşylýandan az bolýar we garaşylmadyk netijeleri berýär. Bir mysala seredeliň: public static void calculate( final long value ) { // блок codeа } final Long value = null; calculate( value ); aboveokardaky kod parçasy gowy düzülýär. Şeýle-de bolsa, Uzyn we uzyn arasynda öwrülýän setire NullPointerException atar . Şeýle ýagdaý üçin maslahat, ýönekeý görnüşleri ulanmak maslahat berilýär (ýöne munuň hemişe mümkin däldigini eýýäm bilýäris). // блок
6. Interfeýsler
"Synplary we interfeýsleri nädip dizaýn etmeli" sapagynyň 3-nji bölüminde interfeýsleri we şertnamalaýyn programmirlemegi ara alyp maslahatlaşdyk, interfeýsleriň mümkin boldugyça anyk synplardan has ileri tutulmalydygyny belledik. Bu bölümiň maksady, muny hakyky dünýä mysallary bilen görkezip, ilki bilen interfeýsleri gözden geçirmäge höweslendirmekdir. Interfeýsler belli bir ýerine ýetiriş bilen baglanyşykly däl (deslapky usullardan başga). Diňe şertnamalar we mysal hökmünde şertnamalaryň ýerine ýetirilişinde köp erkinlik we çeýeligi üpjün edýär. Bu çeýeligi durmuşa geçirmek daşarky ulgamlary ýa-da hyzmatlary öz içine alanda has möhüm bolýar. Simpleönekeý interfeýsiň we onuň mümkin bolup biläýjek mysalyna seredeliň: public interface TimezoneService { TimeZone getTimeZone( final double lat, final double lon ) throws IOException; } public class TimezoneServiceImpl implements TimezoneService { @Override public TimeZone getTimeZone(final double lat, final double lon) throws IOException { final URL url = new URL( String.format( "http://api.geonames.org/timezone?lat=%.2f&lng=%.2f&username=demo", lat, lon ) ); final HttpURLConnection connection = ( HttpURLConnection )url.openConnection(); connection.setRequestMethod( "GET" ); connection.setConnectTimeout( 1000 ); connection.setReadTimeout( 1000 ); connection.connect(); int status = connection.getResponseCode(); if (status == 200) { // Do something here } return TimeZone.getDefault(); } } aboveokardaky kod parçasy adaty interfeýs nagşyny we ýerine ýetirilişini görkezýär. Bu ýerine ýetiriş , belli bir ýeriň wagt guşagyny almak üçin daşarky HTTP hyzmatyny ( http://api.geonames.org/ ) ulanýar. Emma, ​​sebäbi şertnama interfeýsine bagly, interfeýsiň başga bir ýerine ýetirilişini girizmek gaty aňsat, mysal üçin maglumat bazasy ýa-da adaty tekiz faýl. Olar bilen interfeýsler synagdan geçirilýän kody düzmekde örän peýdalydyr. Mysal üçin, her synagda daşarky hyzmatlary çagyrmak hemişe praktiki däl, şonuň üçin alternatiw, iň ýönekeý ýerine ýetiriş (stub ýaly) durmuşa geçirmegiň manysy bar: Bu ýerine ýetiriş, TimezoneService public class TimezoneServiceTestImpl implements TimezoneService { @Override public TimeZone getTimeZone(final double lat, final double lon) throws IOException { return TimeZone.getDefault(); } } interfeýsiniň zerur bolan ýerinde ulanylyp bilner , izolýasiýa daşarky komponentlere baglylykdan synag skripti. Şeýle interfeýsleri netijeli ulanmagyň köp ajaýyp mysallary Java standart kitaphanasynyň içinde jemlenendir. Kolleksiýalar, sanawlar, toplumlar - bu interfeýsleriň yzygiderli ýerine ýetirilmegi mümkin, şertnamalar artykmaçlyk bilen çalşylyp bilner. Mysal üçin: public static< T > void print( final Collection< T > collection ) { for( final T element: collection ) { System.out.println( element ); } } print( new HashSet< Object >( /* ... */ ) ); print( new ArrayList< Integer >( /* ... */ ) ); print( new TreeSet< String >( /* ... */ ) );
7. Setirler
Setirler Java we beýleki programmirleme dillerinde iň köp ulanylýan görnüşleriň biridir. Java dili gutularyň daşynda birleşmek we deňeşdirme amallaryny goldamak bilen köp sanly yzygiderli manipulýasiýalary aňsatlaşdyrýar. Mundan başga-da, adaty kitaphanada simli amallary netijeli edýän köp synp bar. Bu, şu bölümde ara alyp maslahatlaşjak zadymyz. Java-da setirler UTF-16 kodlamasynda görkezilen üýtgewsiz zatlar. Her gezek setirleri birleşdireniňizde (ýa-da asyl setiri üýtgedýän islendik amaly ýerine ýetireniňizde), String synpynyň täze mysaly döredilýär . Şol sebäpli, birleşme amaly gaty netijesiz bolup biler, bu bolsa String synpynyň köp aralyk ýagdaýlarynyň döremegine sebäp bolup biler (umuman, zibil döretmek). Javaöne Java standart kitaphanasynda iki sany gaty peýdaly synp bar, olaryň maksady simli manipulýasiýany amatly etmek. Bular StringBuilder we StringBuffer (olaryň arasyndaky ýeke-täk tapawut, StringBuffer tersine bolsa StringBuffer sapak howpsuz ). Geliň, bu synplaryň biriniň ulanylýan birnäçe mysalyna seredeliň: StringBuilder / StringBuffer final StringBuilder sb = new StringBuilder(); for( int i = 1; i <= 10; ++i ) { sb.append( " " ); sb.append( i ); } sb.deleteCharAt( 0 ); sb.insert( 0, "[" ); sb.replace( sb.length() - 3, sb.length(), "]" ); setirleri manipulirlemegiň maslahat berilýän usuly bolsa , adaty goşma operatory (iki) ýa-da üç setiri birleşdirmegiň iň ýönekeý ssenariýasynda artykmaç görünip biler. ("+"), mysal üçin: Köplenç birleşmegi ýönekeýleşdirmek üçin iň oňat alternatiw, statiki String.format kömekçi usuly bilen üpjün etmek üçin simli formatirlemäni we Java Standard Kitaphanasyny ulanmakdyr . Bu, sanlary, nyşanlary, senäni / wagty we ş.m. öz içine alýan baý format kesgitleýjilerini goldaýar (Doly maglumat üçin salgylanma resminamalaryna serediň) String.format usuly dürli maglumatlar görnüşlerinden setirleri döretmekde arassa we ýeňil çemeleşýär. Häzirki zaman Java IDE-leriniň format spesifikasiýasyny String.format usulyna geçen argumentlerden seljerip biljekdigini we haýsydyr bir gabat gelmeýän zat ýüze çykarylsa döredijilere duýduryş berip biljekdigini bellemelidiris . String userId = "user:" + new Random().nextInt( 100 ); String.format( "%04d", 1 ); -> 0001 String.format( "%.2f", 12.324234d ); -> 12.32 String.format( "%tR", new Date() ); -> 21:11 String.format( "%tF", new Date() ); -> 2014-11-11 String.format( "%d%%", 12 ); -> 12%
8. Konwensiýalara at bermek
Java, döredijileri haýsydyr bir atlandyryş konwensiýasyny berk berjaý etmäge mejbur etmeýän dil, emma jemgyýet Java koduny adaty kitaphanada-da, beýleki Java taslamalarynda-da yzygiderli görkezýän ýönekeý düzgünler toplumyny döretdi:
  • paket atlary kiçi harpda: org.junit, com.fasterxml.jackson, javax.json
  • synplaryň atlary, sanalmalar, interfeýsler, düşündirişler baş harp bilen ýazylýar: StringBuilder, Runnable, @Override
  • meýdanlaryň ýa-da usullaryň atlary ( statiki finaldan başga ) düýe belliginde görkezilýär: isEmpty, format, addAll
  • statiki jemleýji meýdan ýa-da sanalýan hemişelik atlar kiçi harplar bilen, aşaky çyzyklar bilen bölünýär ("_"): LOG, MIN_RADIX, INSTANCE.
  • ýerli üýtgeýjiler ýa-da usul argumentleri düýe belliginde ýazylýar: str, newLength, minimumCapacity
  • generikler üçin parametr görnüşiniň atlary baş harp bilen bir harp bilen görkezilýär: T, U, E.
Bu ýönekeý konwensiýalara eýerip, ýazýan koduňyz başga bir kitaphanadan ýa-da çarçuwadan gysga we stil taýdan tapawutlanmaz ýaly görüner we şol bir adam tarapyndan döredilen ýaly duýular (konwensiýalar hakykatdanam işleýän seýrek döwürleriň biri).
9. Adaty kitaphanalar
Haýsy Java taslamasynyň üstünde işleseňizem, Java standart kitaphanalary iň gowy dostlaryňyzdyr. Hawa, käbir gödek gyralary we geň dizaýn kararlary barlygy bilen ylalaşmak kyn, ýöne 99% hünärmenler tarapyndan ýazylan ýokary hilli kod. Gözlemeli. Her Java çykarylyşy bar bolan kitaphanalara köp täze aýratynlyklar getirýär (köne aýratynlyklar bilen baglanyşykly käbir meseleler bilen) we köp sanly täze kitaphanany goşýar. Java 5 java.util.concurrent paketiniň bir bölegi hökmünde täze ylalaşyk kitaphanasyny getirdi . Java 6 (az tanalýan) skript goldawyny ( javax.script paketi) we Java compiler API ( javax.tools paketiniň bir bölegi hökmünde ) hödürledi. Java 7 java.util.concurrent- a köp gowulaşmalar getirdi , java.nio.file paketinde täze I / O kitaphanasyny hödürledi we java.lang.invoke- da dinamiki dilleri goldaýar . Netijede, Java 8 java.time paketine köpden bäri garaşylýan senäni / wagty goşdy . Java platforma hökmünde ösýär we ýokardaky üýtgeşmeler bilen birlikde öňe gitmegi gaty möhümdir. Taslamaňyza üçünji tarap kitaphanasyny ýa-da çarçuwasyny goşmagy göz öňünde tutanyňyzda, zerur Java funksiýasynyň adaty Java kitaphanalarynda ýokdugyna göz ýetiriň (elbetde, algoritmleriň köp ýöriteleşdirilen we ýokary öndürijilikli durmuşa geçirilmegi bar) adaty kitaphanalarda algoritmler, ýöne köp halatlarda hakykatdanam zerur däl).
10. Üýtgemezlik
Gollanmanyň we bu bölegiň üýtgewsizligi ýatlatma bolup galýar: çynlakaý serediň. Dizaýn eden synpyňyz ýa-da durmuşa geçirýän usulyňyz üýtgewsiz kepillik berip bilýän bolsa, köp halatlarda şol bir wagtyň özünde üýtgedilmeginden gorkman hemme ýerde ulanylyp bilner. Bu dörediji hökmünde durmuşyňyzy aňsatlaşdyrar (we toparyň agzalarynyň durmuşyny umyt ederis).
11. Synag
Synag bilen ösdürmegiň (TDD) praktikasy, Java jemgyýetinde gaty meşhur bolup, koduň hilini ýokarlandyrýar. TDD-iň berýän ähli artykmaçlyklary bilen, häzirki wagtda Java standart kitaphanasynda synag çarçuwasy ýa-da goldaw gurallarynyň ýokdugyny görmek gynandyryjy. Şeýle-de bolsa, synag häzirki zaman Java ösüşiniň zerur bölegine öwrüldi we bu bölümde JUnit çarçuwasyny ulanyp birnäçe esasy usullara serederis . JUnit-de, esasan, her synag, obýektiň garaşylýan ýagdaýy ýa-da özüni alyp barşy barada jümleler toplumydyr. Uly synaglary ýazmagyň syry, olary bir gezekde synap, ýönekeý we gysga saklamakdyr. Maşk hökmünde, String.format-yň islenýän netijäni gaýtaryp berýän setir bölüminden bir funksiýadygyny barlamak üçin synaglar toplumyny ýazalyň . package com.javacodegeeks.advanced.generic; import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.Test; public class StringFormatTestCase { @Test public void testNumberFormattingWithLeadingZeros() { final String formatted = String.format( "%04d", 1 ); assertThat( formatted, equalTo( "0001" ) ); } @Test public void testDoubleFormattingWithTwoDecimalPoints() { final String formatted = String.format( "%.2f", 12.324234d ); assertThat( formatted, equalTo( "12.32" ) ); } } Synaglaryň ikisi-de gaty okalýan ýaly görünýär we ýerine ýetirilmegi mysaldyr. Häzirki wagtda ortaça Java taslamasy ýüzlerçe synag ýagdaýyny öz içine alýar, regressler ýa-da aýratynlyklar boýunça ösüş prosesinde döredijä çalt seslenme berýär.
12. Indiki
Gollanmanyň bu bölümi, Java-da programmirlemek praktikasy we bu programmirleme dili üçin gollanmalar bilen baglanyşykly birnäçe çekişmäni tamamlaýar. Indiki gezek kadadan çykmalar, olaryň görnüşleri, olary nädip we haçan ulanmalydygy barada Java dünýäsini öwrenip, diliň aýratynlyklaryna gaýdyp geleris.
13. Çeşme koduny göçürip alyň
Bu Advanced Java kursundan umumy ösüş ýörelgeleri boýunça sapak boldy. Sapagyň deslapky kody şu ýerden göçürip alyp bilersiňiz .
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION