1. Objek dan kelas

Hari ini anda akan belajar sedikit tentang cara program Java biasa berfungsi. Inilah berita besar: setiap program Java terdiri daripada kelas dan objek.

Anda sudah tahu apa itu kelas, tetapi apakah itu objek?

Saya akan mulakan dengan analogi. Bayangkan anda ingin membuat kapal kecil. Mula-mula anda perlu membuat pelan tindakan dan kemudian memberikannya kepada kilang, di mana sebuah kapal akan dibina mengikut pelan tindakan. Atau mungkin sedozen. Atau seberapa banyak kapal yang anda suka. Berpuluh-puluh kapal yang sama dibina mengikut pelan tindakan tunggal. Itu yang penting di sini.

Ia sama dalam pengaturcaraan Java.

Rangka tindakan

Seorang pengaturcara adalah seperti seorang pereka. Pereka bentuk mencipta pelan tindakan, dan pengaturcara Java menulis kelas. Bahagian dibuat berdasarkan cetak biru, dan objek dibuat berdasarkan kelas.

Mula-mula, kami menulis kelas (membuat cetak biru), dan kemudian, semasa program berjalan, mesin Java mencipta objek berdasarkan kelas ini. Dengan cara yang sama kapal dicipta daripada cetak biru.

Terdapat hanya satu pelan tindakan, tetapi terdapat banyak kapal. Kapal-kapal itu berbeza — mereka mempunyai nama yang berbeza dan membawa kargo yang berbeza. Tetapi mereka sangat serupa: mereka semua berkongsi reka bentuk yang sama dan boleh melakukan tugas yang serupa.

Atau ini analogi lain...

sarang semut

Bukit semut ialah contoh yang baik tentang cara objek berinteraksi. Terdapat tiga kelas semut dalam sarang semut yang mudah: ratu, askar dan pekerja.

Bilangan semut setiap kelas adalah berbeza. Terdapat seorang ratu tunggal untuk seluruh sarang semut, tetapi terdapat berpuluh-puluh askar, dan beratus-ratus semut pekerja. Tiga kelas dan beratus-ratus objek. Semut berinteraksi antara satu sama lain — dengan semut kelas yang sama dan dengan semut kelas lain — mengikut peraturan yang tegar.

Ini adalah contoh yang sempurna. Semuanya betul-betul seperti ini dalam program biasa. Terdapat objek utama yang mencipta objek semua kelas lain. Objek mula berinteraksi antara satu sama lain dan dengan "dunia luar" program. Tingkah laku objek dikodkan secara dalaman.

Kedua-dua analogi ini adalah dua sisi syiling yang sama. Kebenaran berada di tengah-tengah. Contoh pertama (tentang pelan tindakan dan kapal) menunjukkan hubungan antara kelas dan objek kelas itu. Ini adalah analogi yang kuat. Contoh kedua (tentang bukit semut) menunjukkan hubungan antara kelas bertulis dan objek yang wujud semasa program berjalan.

Anda mesti menulis kelas terlebih dahulu untuk setiap objek yang akan wujud dalam program, dan kemudian juga menerangkan cara ia berinteraksi. Ya, betul, tetapi ia lebih mudah daripada yang didengari.

Di Java, semua entiti adalah objek semasa runtime, dan menulis program adalah tentang menerangkan cara berbeza objek berinteraksi. Objek hanya memanggil kaedah satu sama lain dan menghantar data yang diperlukan kepada mereka.

Dokumentasi

Dan bagaimana anda tahu data apa yang hendak dihantar ke kaedah? Orang yang datang sebelum anda memikirkan segala-galanya.

Setiap kelas biasanya mempunyai penerangan yang menyatakan untuk tujuan ia dicipta. Selain itu, setiap kaedah awam biasanya mempunyai penerangan yang menunjukkan perkara yang dilakukan dan data yang perlu dihantar kepadanya.

Untuk menggunakan kelas, anda perlu mempunyai idea umum tentang fungsinya. Dan anda perlu tahu dengan tepat apa yang dilakukan oleh setiap kaedah. Tetapi anda tidak perlu tahu bagaimana ia melakukannya. Ia seperti tongkat sakti.

Mari kita lihat kod untuk menyalin fail:

Menyalin fail c:\\data.txt ke fail c:\\result.txt
package com.codegym.lesson2;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy
{
   public static void main(String[] args) throws IOException
   {
      FileInputStream fileInputStream = new FileInputStream("c:\\data.txt");
      FileOutputStream fileOutputStream = new FileOutputStream("c:\\result.txt");

      while (fileInputStream.available() > 0)
      {
         int data = fileInputStream.read();
         fileOutputStream.write(data);
      }

      fileInputStream.close();
      fileOutputStream.close();
   }
}

Jika anda membaca kod ini baris demi baris, anda boleh meneka apa yang ia lakukan secara umum. Walaupun itu memerlukan pengalaman dan latihan. Selepas beberapa ketika kod ini akan kelihatan biasa dan boleh difahami oleh anda.


2. Mereka bentuk program

Reka bentuk program adalah keseluruhan seni. Ia pada masa yang sama mudah dan sukar. Mudah, kerana tidak ada undang-undang yang ketat: apa-apa yang tidak dilarang adalah dibenarkan. Nah, dan itu juga yang menjadikannya sukar: terdapat banyak cara untuk melakukan sesuatu dan bukan mudah untuk mencari yang terbaik.

Mereka bentuk program adalah seperti menulis buku. Di satu pihak, anda hanya menulis huruf, perkataan dan ayat. Sebaliknya, plot, watak, percanggahan dalaman, konflik, gaya penceritaan, tipu daya dan sebagainya adalah penting.

Perkara utama ialah memahami untuk siapa anda menulis kod tersebut. Dan anda menulis kod untuk pengaturcara lain .

Pembangunan produk tidak dapat dielakkan bermaksud membuat perubahan: sesuatu ditambah di sini, sesuatu yang lain dialih keluar di sana, sesuatu akan direka bentuk semula. Begitulah projek besar, besar dan gergasi dilahirkan daripada lelaran kecil.

Apa yang paling penting untuk kod ialah ia mesti difahami oleh pengaturcara lain. Kod yang salah yang boleh difahami boleh dibetulkan. Kod yang betul tetapi tidak dapat difahami tidak boleh diperbaiki.  Apa yang boleh anda lakukan ialah membuangnya.

Jadi bagaimana anda menulis kod yang baik dan bersih?

Untuk melakukan ini memerlukan tiga perkara:

  • Menulis kod yang baik dan mudah difahami di dalam kaedah — ini adalah keperluan yang paling mudah
  • Memutuskan entiti mana yang harus disertakan dalam program
  • Membahagikan atur cara kepada bahagian logik dengan betul

Apakah di sebalik konsep ini?

Menulis kod yang baik di dalam kaedah

Jika anda mempunyai kemahiran bahasa Inggeris yang asas, anda mungkin perasan betapa mudahnya membaca kod sebagai ayat bahasa Inggeris kadangkala:

  • class Cat extends Pet— Ini bermakna kelas Cat memanjangkan kelas Pet
  • while(stream.ready())— selagi aliran itu sedia...
  • if (a<b) return a; else return b— jika akurang daripada b, maka kembali a, jika tidak kembali b.

Ini sengaja. Java ialah salah satu daripada beberapa bahasa yang memudahkan untuk menulis kod pendokumentasian sendiri, iaitu kod yang boleh difahami tanpa ulasan. Dalam kod Java yang baik, banyak kaedah dibaca sama seperti ayat bahasa Inggeris.

Apabila menulis kod, tugas anda ialah menjadikannya semudah dan ringkas yang mungkin. Fikirkan sama ada kod anda mudah dibaca dan anda akan mula bergerak ke arah yang betul.

Di Java, adalah kebiasaan untuk menulis kod yang mudah dibaca. Sebaik-baiknya, semua kod untuk kaedah akan muat pada satu skrin (iaitu 20-30 baris). Ini adalah norma untuk seluruh komuniti Java. Jika kod boleh diperbaiki, ia harus diperbaiki.

Cara terbaik untuk mempelajari cara menulis kod yang baik adalah melalui latihan. Tulis banyak kod, kaji kod orang lain dan minta rakan sekerja yang lebih berpengalaman menyemak kod anda.

Dan ingat bahawa apabila anda memberitahu diri anda "tinggalkan dengan cukup baik", pertumbuhan anda terhenti.

Memutuskan entiti mana yang harus disertakan dalam program

Anda perlu menulis kod yang boleh difahami oleh pengaturcara lain. Jika 9 daripada 10 pengaturcara akan memasukkan kelas A, B dan C dalam reka bentuk program, maka anda juga harus membuat kelas A, B dan C dalam program anda. Anda mesti menulis kod yang boleh difahami oleh orang lain.

Hebat, berfungsi, pantas, tetapi kod bukan standard ialah kod yang tidak baik.

Anda perlu mengkaji projek orang lain: ini adalah cara terbaik, terpantas dan termudah untuk menyerap semua kebijaksanaan yang telah terkumpul dalam industri IT selama beberapa dekad.

Lagipun, anda sudah mempunyai akses kepada projek yang sangat baik, popular dan didokumentasikan dengan baik — Java SDK . Mulakan dengannya.

Menganalisis kelas dan cara ia diatur. Fikirkan mengapa sesetengah kaedah statik dan yang lain tidak. Mengapa kaedah mempunyai parameter khusus yang mereka ada tetapi bukan yang lain. Mengapa kaedah ini betul-betul, dan mengapa kelas dinamakan apa yang dinamakan, dan mengapa ia terkandung dalam pakej khusus mereka.

Sebaik sahaja anda mula memahami jawapan kepada semua soalan ini, anda akan dapat menulis kod yang boleh difahami oleh orang lain.

Yang berkata, saya ingin memberi amaran kepada anda terhadap menganalisis kod dalam kaedah Java SDK. Banyak kaedah telah ditulis semula untuk memaksimumkan kelajuan, dan kebolehbacaannya boleh dipersoalkan.

Membahagikan atur cara kepada bahagian logik dengan betul

Hampir setiap program dibahagikan kepada bahagian atau modul. Setiap bahagian bertanggungjawab ke atas aspek programnya sendiri.

Komputer mempunyai papan induk, monitor dan papan kekunci — ini semua adalah bahagian yang berasingan dan berganding longgar. Lebih-lebih lagi, mereka berinteraksi dalam cara piawai: USB, HDMI, dsb. Jika anda menumpahkan kopi pada papan kekunci anda, anda boleh membasuhnya di dalam singki, biarkan ia kering, dan kemudian terus menggunakannya.

Tetapi komputer riba adalah contoh seni bina monolitik: nampaknya kita boleh membezakan bahagian logik yang berasingan, tetapi ia lebih bersepadu. Pada MacBookPro, anda perlu membuka separuh daripada komputer riba untuk membersihkan papan kekunci. Dan menumpahkan kopi anda pada komputer riba adalah sebab untuk memesan komputer riba baharu. Bukan secawan kopi baru.


3. Membuat kelas anda sendiri

Tetapi kerana anda baru belajar memprogram, anda harus bermula dari kecil dengan belajar membuat kelas anda sendiri.

Sudah tentu, anda telah pun mencipta kelas, tetapi anda perlu belajar untuk memahami kelas yang perlu disertakan dalam program, cara ia harus dinamakan dan kaedah yang sepatutnya ada. Dan bagaimana mereka harus berinteraksi antara satu sama lain.

Senarai entiti

Kalau tak tahu nak mula dari mana, mulakan dari awal.

Apabila anda mula-mula mula mereka bentuk program, anda hanya boleh mengambil sekeping kertas dan menulis senarai entiti (objek) yang sepatutnya ada dalam program tersebut. Dan kemudian tulis kod mengikut prinsip bahawa setiap entiti adalah kelas yang berasingan.

Contoh

Katakan anda ingin menulis permainan catur. Anda memerlukan entiti berikut: papan catur dan 6 jenis buah catur. Kepingan bergerak dengan cara yang berbeza dan mempunyai nilai yang berbeza. Ia masuk akal bahawa mereka adalah kelas yang berasingan. Sesungguhnya, apabila anda mula-mula bermula, lebih banyak kelas, lebih baik.

Sangat jarang untuk bertemu dengan pengaturcara baru yang menulis sepuluh kelas dan bukannya dua. Daripada menulis sepuluh kelas, pemula suka menulis dua kelas atau mungkin hanya satu. Jadi sila tulis lebih banyak kelas, rakan pengaturcara saya. Dan kod anda akan menjadi lebih jelas kepada semua orang kecuali mungkin anda 😛

Catur

Katakan kita memutuskan untuk menulis kelas untuk catur: apakah rupa kelas ini?

Adakah papan catur hanya tatasusunan 8 dengan 8? Adalah lebih baik untuk mencipta kelas berasingan yang secara dalaman menyimpan rujukan kepada tatasusunan. Kemudian anda boleh menambah banyak kaedah berguna ke kelas "papan catur", contohnya, untuk menyemak sama ada sel tertentu kosong atau diduduki

Secara umum, semasa anda bermula, sentiasa berpandukan prinsip ini: Program mempunyai pelbagai entiti dan entiti mempunyai jenis. Jenis ini ialah kelas.


4. Pembolehubah statik dan kaedah

Juga jangan lupa untuk menggunakan pembolehubah statik dan kaedah. Jika anda mempunyai satu buah catur berinteraksi dengan yang lain pada papan catur, maka kod anda memerlukan kaedah yang mengambil rujukan kepada buah pertama dan kedua serta papan catur.

Pembolehubah statik, yang boleh diakses dari mana-mana dalam atur cara, biasanya digunakan untuk mengelak daripada terus menghantar rujukan kepada objek yang "sentiasa wujud".

Sebagai contoh, seperti ini:

Kod Catatan
public class ChessBoard
{
   public static ChessBoard board = new ChessBoard();
   public ChessItem[][] cells = new ChessItem[8][8];
   ...
}

public class Game
{
   public static void main(String[] args)
   {
      var board = ChessBoard.board;
      board.cells[0][3] = new King(Color.WHITE);
      board.cells[0][4] = new Queen(Color.WHITE);
      ...
   }
}


Rujukan kepada satu ChessBoardobjek.
Tatasusunan dua dimensi 8x8, bukan pembolehubah statik.








Tambah kepingan ke papan.

Atau bukannya pembolehubah statik, anda boleh mencipta kaedah yang mengembalikan objek tunggal. Sebagai contoh, seperti ini:

public class ChessBoard
{
   private static ChessBoard board = new ChessBoard();
   public static ChessBoard getBoard()
   {
      return board;
   }

   public ChessItem[][] cells = new ChessItem[8][8];
   ...
}

public class Game
{
   public static void main(String[] args)
   {
      var board = ChessBoard.getBoard();
      board.cells[0][3] = new King(Color.WHITE);
      board.cells[0][4] = new Queen(Color.WHITE);
      ...
   }
}