JavaRush /Blog Jawa /Random-JV /Panduan Gaya Pemrograman Umum
pandaFromMinsk
tingkat
Минск

Panduan Gaya Pemrograman Umum

Diterbitake ing grup
Artikel iki minangka bagéan saka kursus akademik "Jawa Lanjutan." Kursus iki dirancang kanggo mbantu sampeyan sinau babagan cara nggunakake fitur Jawa kanthi efektif. Materi kasebut kalebu topik "maju" kayata nggawe obyek, kompetisi, serialisasi, refleksi, lan liya-liyane. Kursus kasebut bakal mulang sampeyan carane nguwasani teknik Jawa kanthi efektif. Rincian kene .
Isi
1. Pambuka 2. Cakupan Variabel 3. Bidang Kelas lan Variabel Lokal 4. Argumen Metode lan Variabel Lokal 5. Boxing lan Unboxing 6. Antarmuka 7. String 8. Konvensi Penamaan 9. Pustaka Standar 10. Imutabilitas 11. Pengujian 12. Sabanjure. .. 13. Ngundhuh kode sumber
1. Pambuka
Ing bagean tutorial iki, kita bakal nerusake diskusi babagan prinsip umum gaya pemrograman sing apik lan desain responsif ing Jawa. Kita wis ndeleng sawetara prinsip kasebut ing bab pandhuan sadurunge, nanging akeh tips praktis bakal diwenehake kanthi tujuan kanggo nambah katrampilan pangembang Jawa.
2. Cakupan variabel
Ing Bagean Tiga ("Carane Ngrancang Kelas lan Antarmuka") kita ngrembug babagan carane visibilitas lan aksesibilitas bisa ditrapake kanggo anggota kelas lan antarmuka, diwenehi watesan ruang lingkup. Nanging, kita durung ngrembug babagan variabel lokal sing digunakake ing implementasine metode. Ing basa Jawa, saben variabel lokal, yen diumumake, nduweni ruang lingkup. Variabel iki katon saka panggonan sing diumumake menyang titik ing ngendi eksekusi metode (utawa blok kode) rampung. Umumé, siji-sijine aturan sing kudu ditindakake yaiku ngumumake variabel lokal sing paling cedhak karo papan sing bakal digunakake. Ayo kula katon ing conto khas: for( final Locale locale: Locale.getAvailableLocales() ) { // блок codeа } try( final InputStream in = new FileInputStream( "file.txt" ) ) { // блока codeа } Ing loro pecahan kode, orane katrangan saka variabel diwatesi kanggo pamblokiran eksekusi ngendi variabel iki ngumumaké. Nalika pamblokiran rampung, ruang lingkup rampung lan variabel dadi ora katon. Iki katon luwih jelas, nanging kanthi release Java 8 lan introduksi lambdas, akeh idiom sing kondhang ing basa nggunakake variabel lokal dadi ora bisa digunakake. Ayo kula menehi conto saka conto sadurunge nggunakake lambdas tinimbang daur ulang: Arrays.stream( Locale.getAvailableLocales() ).forEach( ( locale ) -> { // блок codeа } ); Bisa dideleng yen variabel lokal wis dadi argumentasi kanggo fungsi kasebut, sing banjur diterusake minangka argumen kanggo metode forEach .
3. Kolom kelas lan variabel lokal
Saben metode ing Jawa kalebu kelas tartamtu (utawa, ing kasus Java8, antarmuka ing ngendi metode kasebut diumumake minangka metode standar). Antarane variabel lokal sing minangka lapangan kelas utawa metode sing digunakake ing implementasine, ana kemungkinan konflik jeneng. Compiler Java ngerti carane milih variabel sing bener saka antarane sing kasedhiya, sanajan luwih saka siji pangembang arep nggunakake variabel kasebut. IDE Jawa modern nindakake tugas sing apik kanggo ngandhani pangembang nalika konflik kasebut bakal kedadeyan, liwat bebaya kompiler lan sorotan variabel. Nanging luwih becik mikir babagan kaya ngono nalika nulis kode. Aku suggest ndeleng conto: public class LocalVariableAndClassMember { private long value; public long calculateValue( final long initial ) { long value = initial; value *= 10; value += value; return value; } } Conto katon cukup gampang, nanging iku jebakan. Metode calculateValue ngenalake nilai variabel lokal lan, kanthi operasi kasebut, ndhelikake kolom kelas kanthi jeneng sing padha. Baris kasebut value += value; kudu dadi jumlah nilai lapangan kelas lan variabel lokal, nanging ana sing liya. Implementasine sing bener bakal katon kaya iki (nggunakake tembung kunci iki): public class LocalVariableAndClassMember { private long value; public long calculateValue( final long initial ) { long value = initial; value *= 10; value += this.value; return value; } } Nalika conto iki naif ing sawetara cara, iki nuduhake titik penting sing ing sawetara kasus butuh jam kanggo debug lan ndandani.
4. Metode argumen lan variabel lokal
Jeblugan liyane sing asring ditindakake dening pangembang Jawa sing ora duwe pengalaman yaiku nggunakake argumen metode minangka variabel lokal. Jawa ngidini sampeyan ngganti nilai menyang argumen non-konstan (Nanging, iki ora duwe pengaruh marang nilai asli): public String sanitize( String str ) { if( !str.isEmpty() ) { str = str.trim(); } str = str.toLowerCase(); return str; } Potongan kode ing ndhuwur ora elegan, nanging nindakake tugas sing apik kanggo nemokake masalah: argumen str ditugasake nilai beda (lan Sejatine digunakake minangka variabel lokal). Ing kabeh kasus (tanpa pangecualian), sampeyan bisa lan kudu nindakake tanpa conto iki (contone, kanthi nyatakake argumen minangka konstanta). Contone: public String sanitize( final String str ) { String sanitized = str; if( !str.isEmpty() ) { sanitized = str.trim(); } sanitized = sanitized.toLowerCase(); return sanitized; } Kanthi ngetutake aturan prasaja iki, luwih gampang nglacak kode sing diwenehake lan nemokake sumber masalah, sanajan ngenalake variabel lokal.
5. Packing lan unpacking
Boxing lan unboxing iku jeneng teknik sing digunakake ing Jawa kanggo ngowahi jinis primitif ( int, long, double, etc. ) menyang jinis wrappers sing cocog ( Integer, Long, Double , etc.). Ing Bagean 4 saka Tutorial Cara lan Kapan Gunakake Generik, sampeyan wis weruh iki tumindak nalika aku ngomong babagan mbungkus jinis primitif minangka paramèter jinis generik. Senajan compiler Java nyoba paling apik kanggo ndhelikake konversi kasebut kanthi nindakake autoboxing, kadhangkala iki kurang saka samesthine lan ngasilake asil sing ora dikarepke. Ayo katon ing conto: public static void calculate( final long value ) { // блок codeа } final Long value = null; calculate( value ); Potongan kode ing ndhuwur kompilasi apik. Nanging, bakal mbuwang NullPointerException ing baris // блок sing diowahi antarane Long lan long . Saran kanggo kasus kaya mengkono iku dianjurake kanggo nggunakake jinis primitif (Nanging, kita wis ngerti sing iki ora tansah bisa).
6. Antarmuka
Ing Part 3 saka tutorial, "Carane Ngrancang Kelas lan Antarmuka," kita ngrembug antarmuka lan pemrograman kontrak, nandheske yen antarmuka kudu luwih disenengi tinimbang kelas konkrit sawayah-wayah. Tujuan bagean iki yaiku kanggo nyengkuyung sampeyan nimbang antarmuka dhisik kanthi nuduhake iki nganggo conto nyata. Antarmuka ora ana gandhengane karo implementasine tartamtu (kajaba cara standar). Dheweke mung kontrak lan, minangka conto, menehi akeh kebebasan lan keluwesan babagan cara kontrak bisa ditindakake. Fleksibilitas iki dadi luwih penting nalika implementasine kalebu sistem utawa layanan eksternal. Ayo ndeleng conto antarmuka sing prasaja lan implementasine sing bisa ditindakake: 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(); } } Potongan kode ing ndhuwur nuduhake pola antarmuka sing khas lan implementasine. Implementasi iki nggunakake layanan HTTP eksternal ( http://api.geonames.org/ ) kanggo njupuk zona wektu lokasi tartamtu. Nanging, amarga kontrak gumantung antarmuka, iku gampang banget kanggo introduce implementasine liyane saka antarmuka, nggunakake, contone, database utawa malah file flat biasa. Karo wong-wong mau, antarmuka banget mbiyantu ngrancang kode testable. Contone, ora mesthi praktis nelpon layanan eksternal ing saben tes, mula luwih becik ngleksanakake alternatif, implementasine sing paling gampang (kayata rintisan): public class TimezoneServiceTestImpl implements TimezoneService { @Override public TimeZone getTimeZone(final double lat, final double lon) throws IOException { return TimeZone.getDefault(); } } Implementasi iki bisa digunakake ing ngendi wae ing ngendi antarmuka TimezoneService dibutuhake, ngisolasi script test saka katergantungan ing komponen njaba. Akeh conto sing apik banget babagan panggunaan antarmuka kasebut kanthi efektif ing perpustakaan standar Jawa. Koleksi, dhaptar, set - antarmuka iki duwe macem-macem implementasi sing bisa diganti kanthi lancar lan bisa diijolake nalika kontrak njupuk kauntungan. Tuladhane: 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. Serat
String minangka salah sawijining jinis sing paling akeh digunakake ing basa Jawa lan basa pamrograman liyane. Basa Jawa nyederhanakake akeh manipulasi string rutin kanthi ndhukung operasi concatenation lan perbandingan langsung saka kothak. Kajaba iku, perpustakaan standar ngemot akeh kelas sing nggawe operasi senar efisien. Iki persis sing bakal kita rembug ing bagean iki. Ing Jawa, senar minangka obyek sing ora bisa diganti sing dituduhake ing enkoding UTF-16. Saben sampeyan nggabungake strings (utawa nindakake operasi apa wae sing ngowahi string asli), conto anyar saka kelas String digawe . Amarga iki, operasi concatenation bisa dadi ora efisien banget, nyebabake akeh kedadeyan penengah saka kelas String digawe (nggawe sampah, umume). Nanging perpustakaan standar Jawa ngemot rong kelas banget migunani sing tujuane kanggo nggawe manipulasi string trep. Iki StringBuilder lan StringBuffer (mung prabédan antarane iku StringBuffer aman thread nalika StringBuilder ngelawan). Ayo goleki sawetara conto salah sawijining kelas sing digunakake: 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(), "]" ); Nalika nggunakake StringBuilder/StringBuffer minangka cara sing disaranake kanggo ngapusi senar, bisa uga katon overkill ing skenario paling gampang kanggo nggabungake loro utawa telung senar, supaya operator tambahan normal ( ( "+"), contone: String userId = "user:" + new Random().nextInt( 100 ); Asring alternatif sing paling apik kanggo nyederhanakake concatenation nggunakake format string uga Pustaka Standar Jawa kanggo bantuan nyedhiyani String.format helper cara statis . Iki ndhukung set sugih saka specifiers format, kalebu nomer, simbol, tanggal / wektu, etc.. (Waca dokumentasi referensi kanggo rincian lengkap) Metode 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% String.format menehi pendekatan resik lan entheng kanggo ngasilaken strings saka macem-macem jinis data. Wigati dicathet menawa IDE Jawa modern bisa ngurai spesifikasi format saka argumen sing diterusake menyang metode String.format lan ngelingake pangembang yen ana mismatches sing dideteksi.
8. Konvensi jeneng
Jawa minangka basa sing ora meksa pangembang kanggo ngetutake konvensi penamaan apa wae, nanging komunitas wis ngembangake aturan prasaja sing ndadekake kode Jawa katon konsisten ing perpustakaan standar lan ing proyek Jawa liyane:
  • jeneng paket ana ing huruf cilik: org.junit, com.fasterxml.jackson, javax.json
  • jeneng kelas, enumerasi, antarmuka, anotasi ditulis nganggo huruf kapital: StringBuilder, Runnable, @Override
  • jeneng kolom utawa metode (kajaba final statis ) ditemtokake ing notasi unta: isEmpty, format, addAll
  • kolom final statis utawa jeneng konstan enumerasi ing huruf gedhe, dipisahake dening underscores ("_"): LOG, MIN_RADIX, INSTANCE.
  • variabel lokal utawa argumen metode diketik ing notasi unta: str, newLength, minimumCapacity
  • jeneng jinis parameter kanggo generik diwakili dening huruf siji ing huruf gedhe: T, U, E
Kanthi ngetutake konvensi prasaja iki, kode sing sampeyan tulis bakal katon ringkes lan ora bisa dibedakake saka perpustakaan utawa kerangka liyane, lan bakal rumangsa dikembangake dening wong sing padha (salah sawijining wektu sing arang banget nalika konvensi bener-bener bisa digunakake).
9. Pustaka standar
Ora preduli proyek Java apa wae sing sampeyan lakoni, perpustakaan standar Jawa minangka kanca sing paling apik. Ya, iku hard kanggo ora setuju sing padha duwe sawetara sudhut kasar lan pancasan desain aneh, Nanging, 99% wektu iku kode kualitas dhuwur ditulis dening ahli. Iku worth njelajah. Saben release Jawa ndadekke akeh fitur anyar kanggo perpustakaan ana (karo sawetara masalah bisa karo fitur lawas), lan uga nambah akeh perpustakaan anyar. Java 5 nggawa perpustakaan concurrency anyar minangka bagéan saka paket java.util.concurrent . Java 6 nyedhiyakake (kurang dikenal) dhukungan kanggo skrip ( paket javax.script ) lan API compiler Java (minangka bagéan saka paket javax.tools ). Java 7 nggawa akeh dandan kanggo java.util.concurrent , ngenalake perpustakaan I/O anyar ing paket java.nio.file lan dhukungan kanggo basa dinamis ing java.lang.invoke . Lan pungkasane, Java 8 nambahake tanggal/wektu sing ditunggu-tunggu ing paket java.time . Jawa minangka platform sing berkembang lan penting banget kanggo maju bebarengan karo owah-owahan ing ndhuwur. Yen sampeyan nganggep kalebu perpustakaan utawa kerangka kerja pihak katelu ing proyek sampeyan, priksa manawa fungsi sing dibutuhake durung ana ing perpustakaan Java standar (mesthi, ana akeh implementasi algoritma khusus lan kinerja dhuwur sing luwih dhisik tinimbang algoritma ing perpustakaan standar, nanging ing paling kasus padha tenan ora perlu).
10. Imut
Immutability ing saindhenging pandhuan lan ing bagean iki tetep minangka pangeling: please njupuk akeh. Yen kelas sampeyan ngrancang utawa cara sing sampeyan tindakake bisa menehi jaminan immutability, bisa digunakake ing paling kasus nang endi wae tanpa wedi diowahi bebarengan. Iki bakal nggawe urip sampeyan minangka pangembang (lan muga-muga urip anggota tim sampeyan) luwih gampang.
11. Testing
Praktek pangembangan tes-driven (TDD) misuwur banget ing masyarakat Jawa, ngunggahake standar kualitas kode. Kanthi kabeh keuntungan sing disedhiyakake TDD, sedhih yen perpustakaan standar Jawa saiki ora kalebu kerangka tes utawa alat dhukungan. Nanging, pangujian wis dadi bagean penting ing pangembangan Jawa modern lan ing bagean iki kita bakal ndeleng sawetara teknik dhasar nggunakake kerangka JUnit . Ing JUnit, saben tes minangka set pernyataan babagan kahanan utawa prilaku obyek sing dikarepake. Rahasia kanggo nulis tes sing apik yaiku supaya tetep gampang lan cendhak, nyoba siji-sijine. Minangka latihan, ayo nulis set tes kanggo verifikasi manawa String.format minangka fungsi saka bagean senar sing ngasilake asil sing dikarepake. 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" ) ); } } Loro-lorone tes katon bisa diwaca lan eksekusi kasebut minangka conto. Saiki, proyek Java rata-rata ngemot atusan kasus uji, menehi umpan balik cepet pangembang sajrone proses pangembangan babagan regresi utawa fitur.
12. Sabanjure
Bagean saka pandhuan iki ngrampungake seri diskusi sing ana gandhengane karo praktik pemrograman ing Jawa lan manual kanggo basa pamrograman iki. Sabanjure kita bakal bali menyang fitur basa, njelajah donya Jawa bab pangecualian, jinis, carane lan nalika nggunakake.
13. Ngundhuh kode sumber
Iki minangka pawulangan babagan prinsip pangembangan umum saka kursus Jawa Lanjut. Kode sumber kanggo pawulangan bisa didownload ing kene .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION