Baru-baru ini saya mengalami kesulitan dalam proses mempelajari antarmuka PHP5. Buku tersebut mengatakan ini adalah cara untuk mengimplementasikan pewarisan berganda, tetapi saya masih belum tahu bagaimana cara mengimplementasikannya. Informasi tentang antarmuka PHP di Internet sangat sedikit, jadi saya memeriksanya di Java. Setelah membaca artikel "Mengklarifikasi Java (Antarmuka dan Warisan)", saya tiba-tiba menyadari bahwa saya telah salah memahaminya sejak awal. Yang disebut pewarisan berganda mengacu pada antarmuka yang mewarisi kelas, bukan kelas yang mewarisi antarmuka.
Artikel tersebut menyebutkan tentang abstraksi OO. Sama seperti kalimat di artikel - "Abstraksi adalah menghilangkan bagian gambar", sangat jelas. Ketika saya memikirkan tentang abstraksi, saya selalu berpikir itu sulit untuk dipahami. Tapi abstraksi, haha , sekarang mudah untuk dipahami. Ya, inilah yang dilakukan antarmuka dan kelas abstrak.
Masih banyak sudut pandang lain dalam artikel tersebut yang sangat bermanfaat bagi saya, seperti tercantum di bawah ini:
Inti dari OO, menurut saya, adalah abstraksi objek.
Singkatnya, fungsi antarmuka adalah untuk menandai jenis kelas. Mengatribusikan jenis kelas yang berbeda ke antarmuka yang berbeda dapat mengelolanya dengan lebih baik.
Inti dari pewarisan juga adalah abstraksi, bukan penggunaan kembali kode.
Setelah membaca artikel ini, pada dasarnya saya sekarang memahami cara menerapkan antarmuka, kelas abstrak, dan pewarisan.
Teks aslinya adalah sebagai berikut:
Mengklarifikasi Java (Antarmuka dan Warisan) Kakak saya, seorang mahasiswa pascasarjana tahun kedua di Fakultas Ilmu Komputer, berdiskusi dengan saya tentang Java. Saat kami bertemu, ada beberapa pertanyaan tentang antarmuka. Mengapa menggunakan antarmuka? Kapan sebaiknya Anda menggunakan antarmuka? Saya senang mereka tidak bertanya kepada saya bagaimana cara terhubung ke SQL Server menggunakan Java, atau bagaimana mengembangkan aplikasi J2EE. Pertanyaan seperti itu mematikan dan harus dihindari. Tahun ini Fakultas Ilmu Komputer mengadakan proyek kelulusan di J2ME. Siswa yang memilih topik ini masih mempelajari paket java.util.* dengan meringis di akhir Mei, ini dan ini... huh.
Kebanyakan orang percaya bahwa tujuan antarmuka adalah untuk menggantikan pewarisan berganda. Seperti yang kita ketahui bersama, Java tidak memiliki mekanisme pewarisan berganda seperti C++, namun dapat mengimplementasikan banyak antarmuka. Faktanya, ini tidak masuk akal. Antarmuka dan warisan adalah hal yang sangat berbeda. Antarmuka tidak memiliki kemampuan untuk menggantikan banyak warisan, dan mereka tidak memiliki kewajiban seperti itu. Singkatnya, fungsi antarmuka adalah untuk menandai jenis kelas. Mengatribusikan jenis kelas yang berbeda ke antarmuka yang berbeda dapat mengelolanya dengan lebih baik. Saya pikir inti dari OO adalah abstraksi objek, dan antarmuka paling baik mewujudkan hal ini. Mengapa kita membahas pola desain hanya untuk bahasa dengan kemampuan abstrak (seperti c++, java, c#, dll.) adalah karena yang dipelajari pola desain sebenarnya adalah bagaimana mengabstraksi secara wajar. (Pepatah terkenal Cowboy adalah "Abstraksi adalah menghilangkan bagian gambar", yang sepertinya hanya lelucon, tetapi sebenarnya benar).
Pola desain yang paling dasar adalah pola Pabrik. Dalam aplikasi sederhana yang baru saja saya buat, saya ingin mencoba yang terbaik untuk membuat program saya portabel di antara banyak database dari DBMS yang berbeda adalah sakit kepala. Sebaiknya kita menyederhanakan masalahnya terlebih dahulu dan hanya mempertimbangkan cara menghubungkan database yang berbeda.
Misalkan saya memiliki banyak kelas, yaitu Mysql.java, SQLServer.java, Oracle.java, dan DB2.java. Mereka masing-masing terhubung ke database yang berbeda, mengembalikan objek Connection secara seragam, dan semuanya memiliki metode close untuk menutup koneksi. Anda hanya perlu memilih kelas yang berbeda untuk DBMS Anda, dan Anda dapat menggunakannya. Tapi database apa yang akan digunakan pengguna saya? Entahlah, yang saya harapkan adalah memodifikasi kodenya sesedikit mungkin untuk memenuhi kebutuhannya. Saya dapat mengabstraksi antarmuka berikut:
paket org.bromon.test;
antarmuka publik DB
{
java.sql.Koneksi openDB(String url,String pengguna,String kata sandi);
batal tutup();
}
Antarmuka ini hanya mendefinisikan dua metode tanpa kode yang berarti. Kode spesifik diberikan oleh kelas yang mengimplementasikan antarmuka ini, seperti Mysql.java:
Package org.bromon.test;
impor java.sql.*;
kelas publik Mysql mengimplementasikan DB
{
String pribadi url="jdbc:mysql:localhost:3306/test";
String pribadi pengguna="root";
kata sandi String pribadi=””;
koneksi Koneksi pribadi;
Koneksi publik openDB (url, pengguna, kata sandi)
{
//Kode untuk terhubung ke database}
public void close()
{
//Tutup basis data}
}
Yang serupa tentu saja Oracle.java, dll. Antarmuka DB mengklasifikasikan kelas-kelas ini. Dalam aplikasi, kami mendefinisikan objek seperti ini:
org.bromon.test.DB myDB
menggunakan myDB untuk mengoperasikan database, dan Anda tidak melakukannya; tidak perlu khawatir. Kelas mana yang sebenarnya saya gunakan adalah apa yang disebut prinsip "terbuka-tertutup". Tetapi masalahnya adalah antarmuka tidak dapat dipakai, myDB=new DB(), kode tersebut benar-benar salah, kami hanya dapat myDB=new Mysql() atau myDB=new Oracle(). Maaf, saya masih perlu menentukan kelas mana yang akan dipakai. Menggunakan antarmuka tidak ada gunanya. Jadi kita memerlukan pabrik:
package org.bromon.test;
DBFactory kelas publik
{
Koneksi DB statis publik getConn()
{
Kembali(Mysql baru());
}
}
Sehingga kode instantiasinya menjadi: myDB=DBFactory.getConn();
Ini adalah pabrik biasa yang paling dasar (Pabrik) di antara 23 mode. Kelas pabrik bertanggung jawab untuk secara khusus membuat instance kelas mana, dan logika program lain yang beroperasi pada antarmuka DB. Tanggung jawab telah diserahkan ke kelas pabrik. Tentu saja, Anda juga dapat terus mendefinisikan antarmuka pabrik dan terus memberikan tanggung jawab, yang berkembang menjadi pabrik abstrak.
Antarmuka tidak bertanggung jawab atas operasi spesifik apa pun selama keseluruhan proses. Jika program lain ingin terhubung ke database, program tersebut hanya perlu membuat objek DB, terlepas dari bagaimana kelas pabrik berubah. Inilah yang dimaksud dengan antarmuka - abstraksi.
Tentu saja, konsep warisan mudah dipahami. Mengapa mewarisi? Karena Anda ingin menggunakan kembali kode? Ini jelas bukan alasan. Inti dari pewarisan adalah abstraksi, bukan penggunaan kembali kode. Jika objek A memiliki metode run(), objek B juga ingin memiliki metode ini, sehingga seseorang menggunakan Kelas B extends A. Ini adalah pendekatan yang tidak masuk akal. Jika Anda membuat instance A di B dan memanggil metode Run() A, dapatkah tujuan yang sama dicapai? sebagai berikut:
Kelas B
{
A a=baru A();
a.jalankan();
}
Hal ini menggunakan agregasi kelas untuk menggunakan kembali kode. Ini adalah prototipe model delegasi dan praktik yang selalu dianjurkan oleh GoF.
Lalu apa gunanya warisan? Faktanya, hal ini disebabkan oleh alasan historis. Bahasa OO asli hanya memiliki pewarisan dan tidak ada antarmuka, jadi abstraksi hanya dapat dicapai melalui pewarisan. Harap dicatat bahwa maksud awal pewarisan adalah abstraksi, bukan penggunaan kembali kode (walaupun pewarisan juga memiliki hal ini efeknya). Ini adalah salah satu kesalahan paling serius dari banyak buku Java yang buruk. Saya belum sepenuhnya menghilangkan bayangan yang ditimbulkannya. Buku-buku jelek itu berbahaya bagi manusia, terutama buku-buku pengantar. Kapan sebaiknya Anda menggunakan warisan? Hanya gunakan di kelas abstrak, cobalah untuk tidak menggunakannya di situasi lain. Kelas abstrak tidak dapat dipakai. Mereka hanya menyediakan template, yang menggambarkan masalah.
Akar dari segala kejahatan dalam pengembangan perangkat lunak, khususnya di kalangan pemrogram C++, adalah duplikasi kode alih-alih menggunakan kembali kode, dan penyalahgunaan warisan. Tujuan pelarangan pewarisan berganda di Jawa adalah untuk menghentikan penggunaan warisan yang buruk. Ini adalah pendekatan yang sangat bijaksana, namun banyak orang yang tidak memahaminya. Java dapat mencerminkan desain dengan lebih baik, itulah salah satu alasan mengapa saya terpesona.