Ada banyak jawaban bagus di sini, tetapi saya sering menemukan menggunakan KEDUA antarmuka dan kelas abstrak adalah rute terbaik. Pertimbangkan contoh yang dibuat-buat ini:
Anda adalah pengembang perangkat lunak di bank investasi, dan perlu membangun sistem yang menempatkan pesanan ke pasar. Antarmuka Anda menangkap gagasan paling umum tentang apa yang dilakukan sistem perdagangan ,
1) Trading system places orders
2) Trading system receives acknowledgements
dan dapat ditangkap dalam sebuah antarmuka, ITradeSystem
public interface ITradeSystem{
public void placeOrder(IOrder order);
public void ackOrder(IOrder order);
}
Sekarang teknisi yang bekerja di meja penjualan dan di sepanjang lini bisnis lainnya dapat mulai berinteraksi dengan sistem Anda untuk menambahkan fungsionalitas penempatan pesanan ke aplikasi mereka yang ada. Dan Anda bahkan belum mulai membangun! Inilah kekuatan antarmuka.
Jadi Anda melanjutkan dan membangun sistem untuk pedagang saham ; mereka telah mendengar bahwa sistem Anda memiliki fitur untuk menemukan saham murah dan sangat ingin mencobanya! Anda menangkap perilaku ini dalam sebuah metode yang disebut findGoodDeals()
, tetapi juga menyadari ada banyak hal berantakan yang terlibat dalam menghubungkan ke pasar. Misalnya, Anda harus membuka SocketChannel
,
public class StockTradeSystem implements ITradeSystem{
@Override
public void placeOrder(IOrder order);
getMarket().place(order);
@Override
public void ackOrder(IOrder order);
System.out.println("Order received" + order);
private void connectToMarket();
SocketChannel sock = Socket.open();
sock.bind(marketAddress);
<LOTS MORE MESSY CODE>
}
public void findGoodDeals();
deals = <apply magic wizardry>
System.out.println("The best stocks to buy are: " + deals);
}
Implementasi konkret akan memiliki banyak metode berantakan seperti ini connectToMarket()
, tetapi findGoodDeals()
semua pedagang benar-benar peduli.
Sekarang di sinilah kelas abstrak berperan. Bos Anda memberi tahu Anda bahwa pedagang mata uang juga ingin menggunakan sistem Anda. Dan melihat pasar mata uang, Anda melihat pipa ledeng hampir identik dengan pasar saham. Bahkan, connectToMarket()
dapat digunakan kembali secara verbatim untuk menghubungkan ke pasar valuta asing. Namun, findGoodDeals()
adalah konsep yang jauh berbeda di arena mata uang. Jadi sebelum Anda memberikan basis kode kepada anak ahli valuta asing di seberang lautan, Anda terlebih dahulu melakukan refaktorisasi ke dalam sebuah abstract
kelas, meninggalkanfindGoodDeals()
public abstract class ABCTradeSystem implements ITradeSystem{
public abstract void findGoodDeals();
@Override
public void placeOrder(IOrder order);
getMarket().place(order);
@Override
public void ackOrder(IOrder order);
System.out.println("Order received" + order);
private void connectToMarket();
SocketChannel sock = Socket.open();
sock.bind(marketAddress);
<LOTS MORE MESSY CODE>
}
Sistem perdagangan saham Anda menerapkan findGoodDeals()
seperti yang telah Anda tentukan,
public class StockTradeSystem extends ABCTradeSystem{
public void findGoodDeals();
deals = <apply magic wizardry>
System.out.println("The best stocks to buy are: " + deals);
}
tetapi sekarang bocah ahli FX dapat membangun sistemnya hanya dengan menyediakan implementasi findGoodDeals()
untuk mata uang; dia tidak harus menerapkan ulang koneksi soket atau bahkan metode antarmuka!
public class CurrencyTradeSystem extends ABCTradeSystem{
public void findGoodDeals();
ccys = <Genius stuff to find undervalued currencies>
System.out.println("The best FX spot rates are: " + ccys);
}
Pemrograman ke antarmuka sangat bermanfaat, tetapi aplikasi serupa sering kali menerapkan ulang metode dengan cara yang hampir identik. Menggunakan kelas abstrak menghindari reimplmentation, sambil mempertahankan kekuatan antarmuka.
Catatan: orang mungkin bertanya-tanya mengapa findGreatDeals()
bukan bagian dari antarmuka. Ingat, antarmuka menentukan komponen paling umum dari sistem perdagangan. Insinyur lain mungkin mengembangkan sistem perdagangan yang BENAR-BENAR BERBEDA, di mana mereka tidak peduli tentang menemukan penawaran yang bagus. Antarmuka tersebut menjamin bahwa meja penjualan juga dapat berinteraksi dengan sistem mereka, jadi sebaiknya tidak melibatkan antarmuka Anda dengan konsep aplikasi seperti "penawaran hebat".