JavaRush /Blog Jawa /Random-JV /Kasalahan khas ing kode Jawa.
Sdu
tingkat

Kasalahan khas ing kode Jawa.

Diterbitake ing grup
Materi iki ngemot kesalahan paling khas sing dakdeleng ing kode Jawa wong sing kerja bareng karo aku. Analisis statis (kita nggunakake qulice ), kanthi alasan sing jelas, ora bisa ndeteksi kabeh kesalahan kasebut, mula aku mutusake kanggo dhaptar ing kene. Kabeh kesalahan kasebut ana gandhengane karo pemrograman berorientasi obyek ing umum lan khususe Jawa.
Jeneng Kelas
Kelas sampeyan kudu abstraksi obyek urip nyata tanpa " validator " , " pengontrol " , " manajer " , lsp. Yen jeneng kelas sampeyan diakhiri karo "-er" desaine ala. Lan mesthi, kelas helper anti-pola kaya Apache's StringUtils , FileUtils , lan IOUtils minangka conto gedhe saka pola desain sing nggegirisi. Aja nambah sufiks utawa awalan kanggo mbedakake antar muka lan kelas. Contone, kabeh jeneng iki elek: IRecord , IfaceEmployee , utawa RecordInterface . Biasane, jeneng antarmuka minangka jeneng obyek nyata, dene jeneng kelas kudu nerangake rincian implementasine. Yen ora ana sing spesifik babagan implementasine, jeneng " Default ", " Simple ", utawa sing padha bakal ditindakake. Tuladhane: class SimpleUser implements User {}; class DefaultRecord implements Record {}; class Suffixed implements Name {}; class Validated implements Content {};
Jeneng Metode
Metode bisa ngasilake " sesuatu " utawa bali " kosong ". Yen cara ngasilake barang, mula jenenge kudu nerangake apa sing bakal dibalekake. Contone (aja nggunakake " entuk " awalan): boolean isValid(String name); String content(); int ageOf(File file); Yen " kosong " bali, jeneng kudu njlentrehake apa cara. Contone: void save(File file); void process(Work work); void append(File file, String line); Mung ana siji pangecualian kanggo aturan iki - JUnit test methods . Padha diterangake ing ngisor iki.
Jeneng Metode Test
Jeneng metode ing tes JUnit kudu dibangun minangka ukara basa Inggris tanpa spasi. Iki luwih gampang dijlentrehake nganggo conto: Penting /** * HttpRequest can return its content in Unicode. * @throws Exception If test fails */ public void returnsItsContentInUnicode() throws Exception { } kanggo miwiti ukara pisanan JavaDoc kanthi jeneng kelas sing sampeyan tes diikuti " bisa ". Dadi, ukara pisanan kudu kaya tembung " wong bisa nindakake apa wae ." Jeneng metode bakal nyatakake bab sing padha, nanging tanpa subyek tes. Yen ditambahake ing wiwitan jeneng metode, aku entuk ukara basa Inggris sing lengkap, kaya ing conto ing ndhuwur: " HttpRequest ngasilake konten ing unicode ." Elinga yen jeneng metode tes ora diwiwiti kanthi " bisa ". Mung komentar JavaDoc diwiwiti kanthi " bisa ". Kajaba iku, jeneng metode ngirim ora diwiwiti karo kriya ( Saka penerjemah: ketoke, penulis tegese swasana ati imperatif saka kriya ). Praktek sing apik kanggo nunjukake yen ana pangecualian nalika ngumumake metode tes.
Jeneng Variabel
Ngindhari jeneng variabel majemuk kayata timeOfDay , firstItem , utawa httpRequest . Maksudku variabel kelas lan variabel metode. Jeneng variabel kudu cukup dawa kanggo ngindhari ambiguitas ing ruang lingkup, nanging ora suwe yen bisa. Jeneng kasebut kudu dadi tembung tunggal utawa jamak. Contone: Kadhangkala ana tabrakan antarane paramèter konstruktor lan lapangan kelas yen konstruktor nyimpen data input menyang obyek sing digawe. Ing kasus iki, aku nyaranake nggawe singkatan kanthi ngilangi aksara swara. Conto: Umume kasus, jeneng variabel paling apik yaiku jeneng kelas sing cocog. Mung kapitalisasi lan sampeyan bakal nggoleki: Nanging, aja nglakoni sing padha kanggo jinis primitif kaya utawa . Sampeyan uga bisa nggunakake adjectives nalika ana sawetara variabel karo karakteristik beda. Tuladhane: List names; void sendThroughProxy(File file, Protocol proto); private File content; public HttpRequest request; public class Message { private String recipient; public Message(String rcpt) { this.recipient = rcpt; } } File file; User user; Branch branch; Integer number String string String contact(String left, String right);
Konstruktor
Tanpa pangecualian, mung ana siji konstruktor sing nyimpen data menyang variabel obyek. Kabeh konstruktor liyane kudu nelpon iki kanthi paramèter sing beda: public class Server { private String address; public Server(String uri) { this.address = uri; } public Server(URI uri) { this(uri.toString()); } }
Variabel siji-wektu
Ngindhari variabel siji-wektu ing kabeh biaya. Miturut "disposable" Maksudku variabel sing digunakake sapisan. Kaya ing conto iki: String name = "data.txt"; return new File(name); Variabel digunakake mung sapisan, lan kode bisa disederhanakake dadi: return new File("data.txt"); Kadhangkala, ing kasus sing arang banget - biasane amarga format sing luwih apik - variabel siji-wektu bisa digunakake. Nanging, coba nyingkiri kahanan kaya ngono.
Pangecualian.
Mesthi, sampeyan ora kudu "nguntal" pangecualian; kudu dibuwang kanthi dhuwur. Pangecualian saka cara pribadi kudu ditangani sacara eksternal. Aja nggunakake pangecualian kanggo ngontrol aliran. Kode ing conto iku salah: int size; try { size = this.fileSize(); } catch (IOException ex) { size = 0; } Serius, apa yen IOException ngandika "disk kebak", sampeyan bakal nganggep ukuran file nul lan terus?
Indentasi.
Kanggo indentasi, aturan umum yaiku kurung kudu mungkasi baris utawa nutup ing baris sing padha (aturan ngelawan ditrapake kanggo kurung tutup). Ing conto ing ngisor iki, kode kasebut ora bener amarga kurung pisanan ora ditutup ing baris sing padha lan ana karakter sawise. Krenjang kapindho duwe masalah sing padha amarga ana karakter sadurunge, lan ora ana braket bukaan ing baris saiki. final File file = new File(directory, "file.txt"); Indentasi sing bener kudu katon kaya iki: StringUtils.join( Arrays.asList( "first line", "second line", StringUtils.join( Arrays.asList("a", "b") ) ), "separator" ); Aturan indentasi sing penting nomer loro yaiku sampeyan kudu nyelehake sabisane ing siji baris - ing 80 karakter. Conto ing ndhuwur ora bener amarga bisa dikompres: StringUtils.join( Arrays.asList( "first line", "second line", StringUtils.join(Arrays.asList("a", "b")) ), "separator" );
Konstanta Redundant.
Konstanta kelas kudu digunakake nalika sampeyan pengin nuduhake akses menyang informasi antarane metode kelas, lan informasi iki minangka karakteristik ( ! ) kelas sampeyan. Aja nggunakake konstanta minangka panggantos kanggo strings utawa literal numerik - laku banget ala, iku ndadékaké kanggo polusi kode. Konstanta (kaya obyek OOP liyane) kudu nduweni makna ing donya nyata. Apa tegese konstanta kasebut ing jagad nyata: class Document { private static final String D_LETTER = "D"; // bad practice private static final String EXTENSION = ".doc"; // good practice } Kesalahan umum liyane yaiku nggunakake konstanta ing tes unit supaya ora duplikat string / literal angka ing metode tes. Aja ngono! Saben cara tes kudu operate ing set dhewe saka nilai input. Gunakake teks lan angka anyar ing saben cara tes anyar. Tes kasebut independen. Dadi kenapa kudu nuduhake konstanta input sing padha?
Tes Kopling Data.
Punika conto hooking ing cara test: User user = new User("Jeff"); // maybe some other code here MatcherAssert.assertThat(user.name(), Matchers.equalTo("Jeff")); Ing baris pungkasan, kita concatenate " Jeff " karo string literal padha kasebut ing baris pisanan. Yen sawetara sasi mengko, ana sing pengin ngganti nilai ing baris katelu, dheweke kudu nglampahi wektu ekstra kanggo nggoleki ing ngendi wae " Jeff " digunakake ing metode iki. Kanggo ngindhari snagging data iki, sampeyan kudu ngenalake variabel.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION