Saya bermasalah akhir-akhir ini tentang penggunaan kelas abstrak.
Terkadang kelas abstrak dibuat sebelumnya dan berfungsi sebagai templat bagaimana kelas turunan akan bekerja. Itu berarti, lebih atau kurang, bahwa mereka menyediakan beberapa fungsionalitas tingkat tinggi tetapi meninggalkan detail tertentu untuk diimplementasikan oleh kelas turunan. Kelas abstrak mendefinisikan perlunya rincian ini dengan menerapkan beberapa metode abstrak. Dalam kasus seperti itu, kelas abstrak berfungsi seperti cetak biru, deskripsi fungsi tingkat tinggi atau apa pun yang Anda ingin menyebutnya. Itu tidak dapat digunakan sendiri, tetapi harus khusus untuk mendefinisikan rincian yang telah ditinggalkan dari implementasi tingkat tinggi.
Kadang-kadang, kebetulan bahwa kelas abstrak dibuat setelah penciptaan beberapa kelas "turunan" (karena kelas induk / abstrak belum ada, mereka belum diturunkan, tetapi Anda tahu maksud saya). Dalam kasus ini, kelas abstrak biasanya digunakan sebagai tempat di mana Anda dapat meletakkan segala jenis kode umum yang berisi kelas turunan saat ini.
Setelah melakukan pengamatan di atas, saya bertanya-tanya yang mana dari dua kasus ini yang seharusnya menjadi aturan. Haruskah setiap jenis rincian digelembungkan ke kelas abstrak hanya karena mereka saat ini menjadi umum di semua kelas turunan? Haruskah kode umum yang bukan bagian dari fungsionalitas tingkat tinggi ada di sana?
Haruskah kode yang mungkin tidak memiliki makna untuk kelas abstrak itu sendiri ada di sana hanya karena kebetulan umum untuk kelas turunan?
Biarkan saya memberi contoh: Kelas abstrak A memiliki metode a () dan metode abstrak aq (). Metode aq (), di kedua kelas turunan AB dan AC, menggunakan metode b (). Haruskah b () dipindahkan ke A? Jika ya, maka jika seseorang hanya melihat A (mari kita berpura-pura AB dan AC tidak ada di sana), keberadaan b () tidak masuk akal! Apakah ini hal yang buruk? Haruskah seseorang dapat melihat kelas abstrak dan memahami apa yang terjadi tanpa mengunjungi kelas turunannya?
Sejujurnya, pada saat menanyakan ini, saya cenderung percaya bahwa menulis kelas abstrak yang masuk akal tanpa harus melihat di kelas turunannya adalah masalah kode bersih dan arsitektur bersih. Ι tidak terlalu menyukai ide kelas abstrak yang bertindak seperti dump untuk semua jenis kode yang biasa terjadi di semua kelas turunan.
Apa yang Anda pikirkan / praktikkan?
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.
- Kenapa? Apakah tidak mungkin bahwa, dalam proses mendesain dan mengembangkan aplikasi, saya menemukan bahwa beberapa kelas memiliki fungsi umum yang secara alami dapat di refactored menjadi kelas abstrak? Haruskah saya cukup waskita untuk selalu mengantisipasi ini sebelum menulis kode untuk kelas turunan? Jika saya gagal menjadi lihai ini, apakah saya dilarang melakukan refactoring seperti itu? Haruskah saya membuang kode dan memulai kembali?