Mungkin Anda baru saja memperhatikan orang mengatakan ini dalam beberapa bulan terakhir, tetapi telah diketahui oleh programmer yang baik lebih lama dari itu. Saya tentu mengatakannya di mana yang sesuai selama sekitar satu dekade.
Inti dari konsep ini adalah bahwa ada overhead konseptual yang besar untuk warisan. Ketika Anda menggunakan warisan, maka setiap panggilan metode tunggal memiliki pengiriman implisit di dalamnya. Jika Anda memiliki pohon warisan yang dalam, atau banyak pengiriman, atau (bahkan lebih buruk) keduanya, maka mencari tahu di mana metode tertentu akan dikirim dalam panggilan tertentu dapat menjadi PITA kerajaan. Itu membuat alasan yang benar tentang kode lebih kompleks, dan itu membuat debugging lebih sulit.
Biarkan saya memberikan contoh sederhana untuk diilustrasikan. Misalkan jauh di dalam pohon warisan, seseorang bernama metode foo
. Kemudian orang lain datang dan menambahkan foo
di atas pohon, tetapi melakukan sesuatu yang berbeda. (Kasus ini lebih umum dengan pewarisan berganda.) Sekarang orang yang bekerja di kelas akar telah melanggar kelas anak yang tidak jelas dan mungkin tidak menyadarinya. Anda dapat memiliki cakupan 100% dengan tes unit dan tidak melihat kerusakan ini karena orang di atas tidak akan berpikir untuk menguji kelas anak, dan tes untuk kelas anak tidak berpikir untuk menguji metode baru yang dibuat di atas . (Memang ada cara untuk menulis tes unit yang akan menangkap ini, tetapi ada juga kasus di mana Anda tidak dapat dengan mudah menulis tes seperti itu.)
Sebaliknya ketika Anda menggunakan komposisi, pada setiap panggilan biasanya lebih jelas apa tujuan pengiriman Anda. (Oke, jika Anda menggunakan inversi kontrol, misalnya dengan injeksi ketergantungan, mencari tahu kemana panggilan juga bisa menjadi masalah. Tapi biasanya lebih mudah untuk mencari tahu.) Ini membuat alasan tentang hal itu lebih mudah. Sebagai bonus, komposisi menghasilkan metode terpisah satu sama lain. Contoh di atas tidak boleh terjadi di sana karena kelas anak akan pindah ke beberapa komponen yang tidak jelas, dan tidak pernah ada pertanyaan tentang apakah panggilan ke foo
ditujukan untuk komponen yang tidak jelas atau objek utama.
Sekarang Anda benar sekali bahwa warisan dan komposisi adalah dua alat yang sangat berbeda yang melayani dua jenis benda yang berbeda. Memang warisan membawa overhead konseptual, tetapi ketika itu adalah alat yang tepat untuk pekerjaan itu, ia membawa overhead konseptual yang lebih sedikit daripada mencoba untuk tidak menggunakannya dan lakukan dengan tangan apa fungsinya untuk Anda. Tidak ada yang tahu apa yang mereka lakukan akan mengatakan bahwa Anda tidak boleh menggunakan warisan. Tetapi pastikan itu adalah hal yang benar untuk dilakukan.
Sayangnya banyak pengembang belajar tentang perangkat lunak berorientasi objek, belajar tentang warisan, dan kemudian pergi menggunakan kapak baru mereka sesering mungkin. Yang berarti bahwa mereka mencoba menggunakan warisan di mana komposisi adalah alat yang tepat. Semoga mereka akan belajar lebih baik pada waktunya, tetapi seringkali ini tidak terjadi sampai setelah beberapa anggota badan diangkat, dll. Memberitahu mereka di muka bahwa itu adalah ide yang buruk cenderung mempercepat proses belajar dan mengurangi cedera.