Saya curiga saya membuat kesalahan anak sekolah di sini, dan saya sedang mencari klarifikasi. Banyak kelas dalam solusi saya (C #) - berani saya katakan mayoritas - Saya akhirnya menulis antarmuka yang sesuai untuk. Misalnya antarmuka "ICalculator" dan kelas "Kalkulator" yang mengimplementasikannya, meskipun saya tidak akan pernah mungkin mengganti kalkulator itu dengan implementasi yang berbeda. Juga, sebagian besar kelas-kelas ini berada dalam proyek yang sama dengan dependensi mereka - mereka benar-benar hanya perlu internal
, tetapi akhirnya menjadi public
efek samping dari implementasi antarmuka masing-masing.
Saya pikir praktik menciptakan antarmuka untuk semuanya ini berakar dari beberapa kepalsuan: -
1) Saya awalnya berpikir bahwa sebuah antarmuka diperlukan untuk membuat unit test mock (saya menggunakan Moq), tetapi sejak itu saya menemukan bahwa sebuah kelas dapat diejek jika anggotanya adalah virtual
, dan ia memiliki konstruktor tanpa parameter (koreksi saya jika Aku salah).
2) Saya awalnya berpikir antarmuka diperlukan untuk mendaftarkan kelas dengan kerangka kerja IoC (Castle Windsor), misalnya
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
padahal sebenarnya saya bisa mendaftarkan tipe beton itu sendiri:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3) Menggunakan antarmuka, misalnya parameter konstruktor untuk injeksi dependensi, menghasilkan "kopling longgar".
Jadi, apakah saya sudah gila dengan antarmuka ?! Saya mengetahui skenario di mana Anda akan "biasanya" menggunakan antarmuka, misalnya mengekspos API publik, atau untuk hal-hal seperti fungsionalitas "pluggable". Solusi saya memiliki sejumlah kecil kelas yang sesuai dengan kasus penggunaan tersebut, tetapi saya ingin tahu apakah semua antarmuka lain tidak perlu, dan harus dihapus? Mengenai poin 3) di atas, tidakkah saya akan melanggar "kopling longgar" jika saya melakukan ini?
Sunting : - Saya hanya bermain-main dengan Moq, dan tampaknya memerlukan metode untuk publik dan virtual, dan memiliki konstruktor tanpa parameter publik , agar dapat mengejek mereka. Jadi sepertinya saya tidak bisa memiliki kelas internal?