Ini adalah pertanyaan yang lebih filosofis, yang membahas platform .NET, tapi mungkin itu berguna juga untuk bahasa lain. Saya melakukan banyak Pengujian Unit dan terutama ketika saya menggunakan komponen pihak ketiga yang sering saya perjuangkan. Dalam. NET adalah klaim besar untuk desain komponen (er) untuk memilih metode mana yang harus virtual atau tidak. Di satu sisi adalah penggunaan komponen (yang masuk akal untuk menjadi virtual), di sisi lain apakah itu komponen yang dapat diperolok-olok . Anda dapat menggunakan Shims untuk mempermainkan komponen pihak ketiga, tetapi ini sering menyebabkan desain dan kompleksitas yang buruk. Seperti yang saya ingat diskusi tentang membuat semua metode menjadi virtual (JAVA memilikinya sejak awal) di .NET adalah tentang kinerja. Tapi apakah masih masalah? Mengapa tidak semua metode dalam. NET virtual atau mengapa tidak memiliki setiap kelas setidaknya satu antarmuka?
sumber
Jawaban:
Seperti yang dikatakan Anders , sebagian tentang kinerja dan sebagian lagi tentang mengunci rancangan yang buruk untuk mengurangi ruang lingkup masalah yang terjadi kemudian oleh orang-orang yang secara buta mewarisi hal-hal yang tidak dirancang untuk diwariskan.
Performa tampak jelas - sementara sebagian besar metode tidak akan diperhatikan pada perangkat keras modern, pengambil virtual mungkin menyebabkan hit yang cukup mencolok, bahkan pada perangkat keras modern yang semakin bergantung pada instruksi yang diprediksi dengan mudah dalam pipa CPU.
Sekarang alasan untuk membuat semuanya virtual secara default tampaknya didorong oleh satu hal saja: kerangka kerja unit testing. Tampaknya bagi saya bahwa ini adalah alasan yang buruk, di mana kami mengubah kode agar sesuai dengan kerangka kerja daripada mendesainnya dengan benar.
Mungkin masalahnya adalah dengan kerangka kerja yang digunakan di sini, mereka harus meningkatkan untuk memungkinkan penggantian fungsi saat runtime dengan shims yang disuntikkan daripada membangun kode yang melakukan ini (dengan semua peretasan untuk mendapatkan putaran metode pribadi maupun yang non-virtual, tidak untuk menyebutkan fungsi statis dan pihak ketiga)
Jadi metode alasan tidak virtual secara default adalah seperti yang dikatakan Anders, dan setiap keinginan untuk membuatnya virtual agar sesuai dengan beberapa alat unit test adalah menempatkan kereta di depan kuda, desain yang tepat mengalahkan kendala buatan.
Sekarang Anda dapat mengurangi semua ini dengan menggunakan antarmuka, atau dengan mengerjakan ulang seluruh basis kode Anda untuk menggunakan komponen (atau layanan Microsoft) yang berkomunikasi melalui pesan yang lewat alih-alih panggilan metode kabel langsung. Jika Anda memperbesar permukaan unit untuk pengujian menjadi komponen, dan komponen itu sepenuhnya mandiri, Anda tidak perlu mengacaukannya untuk mengujinya.
sumber
Ada dua elemen untuk pertanyaan Anda, jadi saya akan mencoba dan mengatasinya pada gilirannya:
Mengapa metode .NET tidak virtual secara default?
Warisan, dalam praktiknya, memiliki banyak masalah . Jadi jika ingin digunakan sebagai bagian dari desain, maka harus dipertimbangkan dengan cermat. Dengan membuat metode non-virtual secara default, teorinya adalah itu mendorong pengembang untuk berpikir tentang warisan ketika merancang kelas. Apakah itu berhasil dalam praktiknya adalah masalah lain tentu saja.
Mengapa tidak semua kelas menerapkan antarmuka?
Desain yang buruk adalah jawaban yang sederhana. Meskipun secara umum diakui sebagai praktik yang baik untuk waktu yang sangat lama, sayangnya banyak orang masih tidak merancang sistem mereka dengan mempertimbangkan DI dan TDD.
Kombinasi kelas yang tidak sepenuhnya diwariskan dan tidak mudah dipermainkan memang menciptakan "badai sempurna" kode yang sulit untuk diuji. Sampai kita mencapai hari ketika semua orang menggunakan DI dan prinsip desain-ke-antarmuka, tidak banyak yang bisa dilakukan untuk mengurangi rasa sakit.
sumber
interface
hanya karena Nilai apa yang dimilikiinterface
untuk apa yang pada dasarnya dimiliki oleh tuple yang dimuliakan? (Meskipun mungkin menggunakan POJO / POCO sendiri adalah cacat desain)As soon as you use classes as types, you are no longer doing OO
- Kelas adalah tipe. Apa?? Warisan kelas normal adalah OO, tidak peduli apa yang Anda katakan. Anda tidak dapat memutuskan bahwa itu bukan OO lagi hanya karena DI adalah hal yang paling disukai sekarang.