Jumlah antarmuka sering bertambah ketika objek generik digunakan di lingkungan yang berbeda. Dalam C # varian IComparable, IEqualityComparer dan IComparer memungkinkan pengurutan dalam pengaturan yang berbeda, sehingga Anda mungkin akhirnya mengimplementasikan semuanya, beberapa di antaranya mungkin lebih dari sekali karena Anda dapat mengimplementasikan versi generik yang diketik dengan kuat serta versi non-generik , selain itu Anda dapat menerapkan lebih dari satu obat generik.
Mari kita ambil contoh skenario, katakanlah sebuah toko web di mana Anda dapat membeli kredit yang dengannya Anda dapat membeli sesuatu yang lain (stok situs foto sering menggunakan skema ini). Anda mungkin memiliki kelas "Valuta" dan kelas "Kredit" yang mewarisi bentuk basis yang sama. Valuta memiliki beberapa kelebihan operator dan rutinitas perbandingan yang memungkinkan Anda melakukan perhitungan tanpa khawatir tentang properti "Mata Uang" (misalnya, menambahkan pound ke dolar). Kredit lebih mudah tetapi memiliki beberapa perilaku berbeda lainnya. Ingin dapat membandingkan ini satu sama lain, Anda bisa akhirnya mengimplementasikan IComparable serta IComparable dan varian lain dari antarmuka perbandingan pada keduanya (meskipun mereka menggunakan implementasi umum apakah itu di kelas dasar atau di tempat lain).
Ketika menerapkan serialisasi, ISerializable, IDeserializationCallback diimplementasikan. Kemudian menerapkan tumpukan undo-redo: IClonable ditambahkan. Fungsionalitas IsDirty: IObservable, INotifyPropertyChanged. Mengizinkan pengguna mengedit nilai menggunakan string: IConvertable ... Daftar ini bisa berlanjut dan terus ...
Dalam bahasa modern kita melihat tren berbeda yang membantu memisahkan aspek-aspek ini dan menempatkannya di kelas mereka sendiri, di luar kelas inti. Kelas atau aspek luar kemudian dikaitkan dengan kelas target dengan menggunakan anotasi (atribut). Seringkali dimungkinkan untuk membuat kelas aspek luar lebih atau kurang generik.
Penggunaan atribut (anotasi) tunduk pada refleksi. Satu kelemahan adalah kerugian kinerja (awal) kecil. Kelemahan (sering emosional) adalah bahwa prinsip-prinsip seperti enkapsulasi perlu santai.
Selalu ada solusi lain, tetapi untuk setiap solusi bagus ada tradeoff atau tangkapan. Misalnya, menggunakan solusi ORM mungkin menuntut semua properti dinyatakan virtual. Solusi serialisasi mungkin menuntut konstruktor default di kelas Anda. Jika Anda menggunakan injeksi dependensi Anda mungkin akhirnya mengimplementasikan 23 antarmuka pada satu kelas.
Di mata saya, 23 antarmuka tidak harus buruk menurut definisi. Mungkin ada skema dipikirkan dengan baik di belakangnya, atau beberapa prinsip penentuan seperti menghindari penggunaan refleksi atau keyakinan enkapsulasi ekstrim.
Setiap kali berganti pekerjaan, atau harus membangun arsitektur yang sudah ada. Saran saya adalah pertama-tama berkenalan sepenuhnya, jangan mencoba untuk memperbaiki semuanya terlalu cepat. Dengarkan pengembang asli (jika dia masih di sana) dan cobalah untuk mencari tahu pikiran dan ide di balik apa yang Anda lihat. Saat mengajukan pertanyaan, lakukan itu bukan demi memecahnya, tetapi untuk belajar ... Ya, setiap orang memiliki palu emas sendiri, tetapi semakin banyak palu yang dapat Anda kumpulkan semakin mudah Anda bergaul dengan rekan-rekan sesama.