Pertama, pahami bahwa kelas yang benar-benar abstrak hanyalah antarmuka yang tidak dapat melakukan banyak pewarisan.
Kelas tulis, ekstrak antarmuka, adalah aktivitas yang mematikan otak. Sedemikian rupa sehingga kita memiliki refactoring untuk itu. Sangat disayangkan. Mengikuti pola "setiap kelas mendapat antarmuka" ini tidak hanya menghasilkan kekacauan tetapi juga melewatkan intinya.
Antarmuka tidak boleh dianggap hanya sebagai pernyataan resmi apa pun yang dapat dilakukan oleh kelas. Antarmuka harus dianggap sebagai kontrak yang dipaksakan oleh kode klien menggunakan merinci kebutuhan itu.
Saya sama sekali tidak kesulitan menulis antarmuka yang saat ini hanya memiliki satu kelas yang mengimplementasikannya. Saya sebenarnya tidak peduli jika tidak ada kelas yang mengimplementasikannya. Karena saya sedang memikirkan apa yang saya perlukan menggunakan kode. Antarmuka mengungkapkan apa yang diminta menggunakan kode. Apa pun yang terjadi kemudian dapat melakukan apa yang disukainya asalkan memenuhi harapan-harapan ini.
Sekarang saya tidak melakukan ini setiap kali satu objek menggunakan yang lain. Saya melakukan ini ketika melewati batas. Saya melakukannya ketika saya tidak ingin satu objek tahu persis objek lain yang diajak bicara. Yang merupakan satu-satunya cara polimorfisme akan bekerja. Saya melakukannya ketika saya mengharapkan objek yang kode klien saya bicarakan cenderung berubah. Saya tentu tidak melakukan ini ketika apa yang saya gunakan adalah kelas String. Kelas String bagus dan stabil dan saya merasa tidak perlu berjaga-jaga agar tidak berubah pada saya.
Ketika Anda memutuskan untuk berinteraksi langsung dengan implementasi konkret daripada melalui abstraksi, Anda memperkirakan bahwa implementasinya cukup stabil untuk memercayai untuk tidak berubah.
Bahwa di situlah cara saya meredam Prinsip Ketergantungan Pembalikan . Anda seharusnya tidak secara fanatik menerapkan ini pada segalanya. Ketika Anda menambahkan abstraksi Anda benar-benar mengatakan Anda tidak percaya pilihan menerapkan kelas menjadi stabil selama umur proyek.
Ini semua mengasumsikan Anda mencoba mengikuti Prinsip Terbuka Tertutup . Prinsip ini penting hanya ketika biaya yang terkait dengan membuat perubahan langsung ke kode yang ditetapkan adalah signifikan. Salah satu alasan utama orang tidak setuju tentang betapa pentingnya objek decoupling adalah karena tidak semua orang mengalami biaya yang sama ketika melakukan perubahan langsung. Jika pengujian ulang, kompilasi ulang, dan redistribusi seluruh basis kode Anda sepele bagi Anda, maka menyelesaikan kebutuhan untuk perubahan dengan modifikasi langsung kemungkinan merupakan penyederhanaan yang sangat menarik dari masalah ini.
Tidak ada jawaban yang mati otak untuk pertanyaan ini. Antarmuka atau kelas abstrak bukanlah sesuatu yang harus Anda tambahkan ke setiap kelas dan Anda tidak bisa hanya menghitung jumlah kelas implementasi dan memutuskan itu tidak diperlukan. Ini tentang berurusan dengan perubahan. Yang berarti Anda mengantisipasi masa depan. Jangan kaget jika Anda salah. Buat sesederhana mungkin tanpa menyudutkan diri.
Jadi tolong, jangan menulis abstraksi hanya untuk membantu kami membaca kode. Kami punya alat untuk itu. Gunakan abstraksi untuk memisahkan apa yang perlu dipisahkan.