Prinsip Pepejal dijelaskan untuk pemaju Java
Prinsip Tanggungjawab Tunggal (SRP) memerlukan kelas untuk bertanggungjawab untuk hanya satu fungsi, seperti memisahkan penjimatan dan penghantaran mel dalam pemprosesan urutan; 2. Prinsip Pembukaan dan Penutupan (OCP) memerlukan pembukaan dan penutup untuk sambungan dan penutupan untuk pengubahsuaian, seperti menambah grafik baru melalui antara muka bentuk tanpa mengubahsuai kalkulator; 3. Prinsip Penggantian Richter (LSP) memerlukan subkelas boleh menggantikan kelas induk tanpa memusnahkan program, seperti menggunakan kelas bebas untuk mengelakkan kelainan tingkah laku yang disebabkan oleh segi empat tepat warisan persegi; 4. Prinsip Pengasingan Antara Muka (ISP) menghendaki pelanggan tidak boleh bergantung pada antara muka yang tidak diingini, seperti memisahkan antara muka peranti pelbagai fungsi untuk percetakan bebas, pengimbasan, dan antara muka faks; 5. Prinsip Inversi Ketergantungan (DIP) memerlukan modul peringkat tinggi tidak bergantung pada modul peringkat rendah, dan kedua-duanya bergantung kepada abstraksi, seperti pesanan pesanan bergantung kepada antara muka pangkalan data dan bukannya pelaksanaan konkrit. Lima prinsip ini bersama -sama meningkatkan pemeliharaan, kebolehpercayaan dan kesesuaian kod Java.
Prinsip-prinsip pepejal adalah satu set lima prinsip reka bentuk yang bertujuan untuk membuat reka bentuk perisian lebih mudah difahami, fleksibel, dan dikekalkan-terutamanya dalam pengaturcaraan berorientasikan objek. Bagi pemaju Java, memohon pepejal membantu membina sistem yang lebih mudah untuk melanjutkan, menguji, dan reflektor. Mari kita memecahkan setiap prinsip dengan contoh Java praktikal dan penjelasan yang jelas.

1. Prinsip Tanggungjawab Tunggal (SRP)
Kelas sepatutnya hanya mempunyai satu sebab untuk berubah.
Dalam erti kata lain, kelas harus bertanggungjawab untuk satu bahagian fungsi aplikasi. Jika kelas mengendalikan pelbagai tugas, menukar seseorang mungkin memecahkan yang lain.

Contoh (pelanggaran):
Pesanan Kelas Awam { ProcessOrder void awam (pesanan pesanan) { // Simpan pesanan ke pangkalan data SaveTodatabase (perintah); // Hantar e -mel pengesahan sendeMail (order.getCustomeReMail ()); } saveTodatabase saveTodatabase (pesanan) { / * ... /} Sendemail void peribadi (e -mel rentetan) { / * ... * /} }
Di sini, OrderProcessor
mengendalikan kedua -dua kegigihan data dan komunikasi -dua tanggungjawab.

Refactored (patuh SRP):
Pesanan Kelas Awam { void awam simpan (pesanan pesanan) { / * ... * /} } e -melservice kelas awam { public void SendConfirmation (string e -mel) { / * ... * /} } Pesanan Kelas Awam { repositori perintah swasta; E -melService EmailService Private; ProcessOrder void awam (pesanan pesanan) { repositori.save (perintah); e -melService.SendConfirmation (Order.GetCustomereMail ()); } }
Sekarang setiap kelas mempunyai satu pekerjaan. Perubahan kepada logik e -mel tidak akan menjejaskan penjimatan data.
2. Prinsip Terbuka/Ditutup (OCP)
Entiti perisian hendaklah dibuka untuk lanjutan, tetapi ditutup untuk pengubahsuaian.
Anda sepatutnya dapat menambah fungsi baru tanpa menukar kod sedia ada.
Contoh (pelanggaran):
Kawasan Kelas Awam { awam calculatearea (Senarai <belect> bentuk) { Jumlah dua = 0; untuk (bentuk objek: bentuk) { jika (bentuk contoh bulatan) { Bulatan c = (bulatan) bentuk; total = math.pi * c.radius * c.radius; } else if (bentuk contoh segi empat tepat) { Segi empat tepat r = (segi empat tepat) bentuk; total = r.width * r.height; } } jumlah pulangan; } }
Setiap kali anda menambah bentuk baru, anda mesti mengubah suai kaedah ini.
Refactored (patuh OCP):
Bentuk Antara Muka Awam { kawasan berganda (); } Lingkaran Kelas Awam mengimplementasikan bentuk { jejari berganda peribadi; kawasan double public () {return math.pi * radius * radius; } } Kelas Rectangle Public mengimplementasikan bentuk { lebar ganda peribadi, ketinggian; kawasan double public () {return width * ketinggian; } } Kawasan Kelas Awam { calculatearea double public (Senarai <bentuk> bentuk) { kembali bentuk.stream () .maptodouble (bentuk :: kawasan) .sum (); } }
Sekarang anda boleh menambah bentuk baru (misalnya, segitiga) tanpa menyentuh AreaCalculator
.
3. Prinsip Penggantian Liskov (LSP)
Subtipe mesti digantikan untuk jenis asas mereka tanpa mengubah ketepatan program.
Sekiranya kelas mewarisi dari yang lain, ia tidak sepatutnya memecahkan tingkah laku yang diharapkan.
Contoh (pelanggaran):
Rectangle Kelas Awam { lebar int yang dilindungi, ketinggian; public void setWidth (int width) {this.width = width; } public void setHeight (int height) {this.height = height; } public int getArea () {return width * Height; } } Square kelas awam memanjangkan segi empat tepat { @Override public void setWidth (int width) { super.setWidth (lebar); super.setheight (lebar); } @Override public void setetheight (ketinggian int) { super.setheight (ketinggian); super.setWidth (ketinggian); } }
Sekarang, jika kaedah menjangkakan Rectangle
dan menetapkan lebar dan ketinggian secara bebas, menggunakan rehat Square
yang anda anggap.
Pendekatan yang lebih baik: Elakkan warisan apabila kontrak tingkah laku adalah ganas. Gunakan komposisi atau hierarki berasingan.
Bentuk Antara Muka Awam { kawasan int (); } Kelas Rectangle Public mengimplementasikan bentuk { lebar int swasta, ketinggian; // setter dan kawasan () } Public Class Square mengimplementasikan bentuk { bahagian int persendirian; // kawasan = sisi * sisi }
Sekarang, tidak ada warisan yang mengelirukan. LSP dipelihara.
4. Prinsip Pengasingan Antara Muka (ISP)
Pelanggan tidak boleh dipaksa bergantung pada antara muka yang tidak mereka gunakan.
Antara muka besar, monolitik membuat kelas melaksanakan kaedah yang mereka tidak perlukan.
Contoh (pelanggaran):
Mesin Antara Muka Awam { void print (); tidak sah imbasan (); void faks (); } Kelas Awam OldPrinter melaksanakan mesin { cetak void awam () {System.out.println ("Percetakan"); } imbasan tidak sah awam () {membuang baru yang tidak disokongOperationException (); } public void faks () {membuang baru UnsupportedOperationException (); } }
OldPrinter
terpaksa melaksanakan kaedah yang tidak relevan.
Refactored (ISP Compliant):
pencetak antara muka awam { void print (); } Pengimbas Antara Muka Awam { tidak sah imbasan (); } antara muka awam FaxMachine { void faks (); } OldPrinter kelas awam melaksanakan pencetak { cetak void awam () {System.out.println ("Percetakan"); } } kelas awam MultifunctionDevice melaksanakan pencetak, pengimbas, faxmachine { cetak void awam () { / * ... * /} imbasan tidak sah awam () { / * ... * /} public void fax () { / * ... * /} }
Sekarang, kelas melaksanakan hanya apa yang mereka dukung.
5. Prinsip Penyongsangan Ketergantungan (DIP)
Modul peringkat tinggi tidak boleh bergantung kepada modul peringkat rendah. Kedua -duanya bergantung kepada abstraksi.
Juga: Abstraksi tidak boleh bergantung kepada butiran. Butiran harus bergantung kepada abstraksi.
Ini membolehkan gandingan longgar dan ujian yang lebih mudah.
Contoh (pelanggaran):
Pesanan Pesanan Kelas Awam { Pangkalan data mysqldatabase peribadi = mysqldatabase baru (); public void saveOrder (pesanan pesanan) { pangkalan data.save (pesanan); } }
OrderService
ditambah dengan MySQLDatabase
. Sukar untuk menguji atau menukar pangkalan data.
Refactored (patuh dip):
Pangkalan Data Antara Muka Awam { tidak sah SAVE (pesanan pesanan); } kelas awam mysqldatabase melaksanakan pangkalan data { void awam simpan (pesanan pesanan) { / * ... * /} } Pesanan Pesanan Kelas Awam { pangkalan data pangkalan data peribadi; Pesanan Pesanan Awam (pangkalan data pangkalan data) { this.database = pangkalan data; } public void saveOrder (pesanan pesanan) { pangkalan data.save (pesanan); } }
Sekarang OrderService
bergantung pada antara muka Database
. Anda boleh menyuntik sebarang pelaksanaan (MySQL, PostgreSQL, Mock, dll.).
Digunakan dengan kerangka suntikan ketergantungan (seperti musim bunga), ini menjadi lebih kuat.
Pemikiran terakhir
Prinsip -prinsip pepejal bukan peraturan tegar -mereka garis panduan untuk membantu anda menulis lebih bersih, lebih banyak kod Java yang dikekalkan. Memohon mereka lebih awal boleh menyelamatkan anda dari hutang teknikal kemudian.
- SRP : Satu pekerjaan setiap kelas.
- OCP : Extend, jangan ubah suai.
- LSP : Subclass tidak boleh mengejutkan pengguna.
- ISP : Antara muka yang kecil dan terfokus.
- Dip : Bergantung pada abstraksi, bukan konkrit.
Mereka mungkin berasa seperti berlebihan pada mulanya, terutamanya dalam projek kecil. Tetapi apabila asas kod anda berkembang, prinsip -prinsip ini menjadi alat penting untuk menguruskan kerumitan.
Pada asasnya, jika kelas Java anda sukar untuk menguji, mengubah, atau menggunakan semula, satu atau lebih prinsip yang kukuh adalah ganas.
Atas ialah kandungan terperinci Prinsip Pepejal dijelaskan untuk pemaju Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Pilihan adalah kelas kontena yang diperkenalkan oleh Java 8 untuk pengendalian yang lebih selamat dari nilai -nilai yang berpotensi null, dengan tujuan terasnya adalah dengan jelas "nilai hilang" dan mengurangkan risiko nullPointerexception. 1. Buat contoh kosong menggunakan optional.empty (), optional.of (nilai) membungkus nilai non-null, dan optional.ofnullable (nilai) dengan selamat membungkus nilai null. 2. Elakkan menggabungkan ispresent () dan dapatkan () secara langsung. Anda harus memberi keutamaan untuk menggunakan Orelse () untuk memberikan nilai lalai. Orelseget () melaksanakan pengiraan kelewatan. Kaedah ini disyorkan apabila nilai lalai adalah overhead.

Gunakan fmt.scanf untuk membaca input diformat, sesuai untuk data berstruktur yang mudah, tetapi rentetan dipotong ketika menghadapi ruang; 2. Adalah disyorkan untuk menggunakan bufio.scanner untuk membaca garis demi baris, menyokong input berbilang baris, pengesanan EOF dan input saluran paip, dan boleh mengendalikan kesilapan pengimbasan; 3. Gunakan io.readall (os.stdin) untuk membaca semua input sekaligus, sesuai untuk memproses data blok besar atau aliran fail; 4. Sambutan utama masa nyata memerlukan perpustakaan pihak ketiga seperti golang.org/x/term, dan Bufio mencukupi untuk senario konvensional; Cadangan Praktikal: Gunakan fmt.scan untuk input mudah interaktif, gunakan bufio.scanner untuk input baris atau saluran paip, gunakan io.readall untuk data blok besar, dan sentiasa mengendalikan

SQLServer sendiri tidak menyokong seni bina tanpa pelayan, tetapi platform awan menyediakan penyelesaian yang sama. 1. Kolam ServerlessSQL Azure boleh secara langsung menanyakan fail Datalake dan caj berdasarkan penggunaan sumber; 2. 3. Awsathena menyokong pertanyaan SQL standard untuk data S3, dan caj berdasarkan data yang diimbas; 4. GooglebigQuery mendekati konsep tanpa pelayan melalui FederatedQuery; 5. Sekiranya anda mesti menggunakan fungsi SQLServer, anda boleh memilih perkhidmatan tanpa pelayan AzuresqLdatabase

Adalah disyorkan untuk menggunakan kata kunci untuk memeriksa sama ada kunci wujud dalam kamus, kerana ia adalah ringkas, cekap dan sangat mudah dibaca; 2. Ia tidak disyorkan untuk menggunakan kaedah GET () untuk menentukan sama ada kunci wujud, kerana ia akan salah apabila kunci wujud tetapi nilai tidak ada; 3. Anda boleh menggunakan kaedah kekunci (), tetapi ia berlebihan, kerana secara lalai untuk memeriksa kunci; 4. Apabila anda perlu mendapatkan nilai dan kunci yang dijangkakan biasanya wujud, anda boleh menggunakan cuba-kecuali untuk menangkap pengecualian KeyError. Kaedah yang paling disyorkan ialah menggunakan kata kunci, yang selamat dan cekap, dan tidak terjejas oleh nilai tiada, yang sesuai untuk kebanyakan senario.

Installjdk, setjava_home, InstalljavaextensionPackinvscode, createoropenamaven/gradleProject, memastikanprojectstructure, anduseBuilt-inrun/debugfeatures;

Useconnectionpoolingwithhikaricptoreusedatabaseconnectionsandreduceoverhead.2.UsePreparedStatementTopreventsqlinjectionAndroveProveQueryperformance.3.fetchonLyRequiredDataByselectingsPecificColumnSandapplyFilation.4.Se

Menguasai model integrasi Springcloud adalah penting untuk membina sistem yang diedarkan moden. 1. Pendaftaran dan Penemuan Perkhidmatan: Pendaftaran dan penemuan perkhidmatan automatik direalisasikan melalui Eureka atau Springcloudkubernetes, dan pengimbangan beban dilakukan dengan reben atau loadbalancer; 2. 3. API Gateway: Gunakan Springcloudgateway untuk menyatukan entri, kawalan penghalaan dan pengurusan kebenaran, dan menyokong pengehadan dan pembalakan semasa; 4. Penjejakan pautan yang diedarkan: Menggabungkan sleuth dan zipkin untuk merealisasikan proses penuh permintaan visual.

Panggilan sistem adalah mekanisme di mana program pengguna meminta operasi istimewa melalui antara muka kernel. Aliran kerja adalah: 1. Program pengguna memanggil fungsi enkapsulasi; 2. Tetapkan nombor panggilan sistem dan parameter kepada daftar; 3. Melaksanakan arahan syscall dan jatuh ke dalam negeri kernel; 4. Melaksanakan fungsi pemprosesan yang sepadan dalam jadual semak; 5. Kembali ke keadaan pengguna selepas pelaksanaan. Anda boleh menggunakan alat Strace untuk mengesan, terus panggil fungsi SYSCall () atau periksa fail header Unitd.H untuk melihat nombor panggilan. Anda perlu ambil perhatian bahawa perbezaan antara panggilan sistem dan fungsi perpustakaan adalah sama ada mereka memasuki keadaan kernel, dan panggilan yang kerap akan menjejaskan prestasi. Anda harus mengoptimumkan dengan menggabungkan I/O, menggunakan kaedah MMAP dan Epoll, dan pemahaman panggilan sistem akan membantu anda menguasai mekanisme operasi asas Linux.
