Dengan anggapan Anda tidak mencari kerangka kerja yang mengejek, karena sangat ultra-ubiquitous dan mudah ditemukan , ada beberapa hal yang perlu diperhatikan di muka:
- Ada "tidak pernah" apa pun yang harus "selalu" Anda lakukan.
Tidak selalu terbaik untuk membungkus perpustakaan pihak ketiga. Jika aplikasi Anda secara intrinsik tergantung pada perpustakaan, atau jika itu benar-benar dibangun di sekitar satu atau dua perpustakaan inti, jangan buang waktu Anda membungkusnya. Jika perpustakaan berubah, aplikasi Anda harus tetap berubah .
- Boleh saja menggunakan tes integrasi.
Ini terutama berlaku di sekitar batas yang stabil, intrinsik untuk aplikasi Anda, atau tidak dapat dengan mudah diejek. Jika syarat-syarat itu terpenuhi, membungkus dan mengejek akan menjadi rumit dan membosankan. Dalam hal ini, saya akan menghindari keduanya: jangan membungkus dan tidak mengejek; tulis saja tes integrasi. (Jika pengujian otomatis adalah tujuan.)
- Alat dan kerangka kerja tidak dapat menghilangkan kompleksitas logis.
Pada prinsipnya, alat hanya bisa mengurangi boilerplate. Tetapi, tidak ada algoritma yang dapat diotomatisasi untuk mengambil antarmuka yang kompleks dan membuatnya mudah - apalagi menggunakan antarmuka X dan mengadaptasinya sesuai dengan kebutuhan Anda. (Hanya Anda yang tahu bahwa algoritma!) Jadi, sementara ada diragukan lagi alat yang dapat menghasilkan pembungkus tipis, saya sarankan bahwa mereka belum di mana-mana karena, pada akhirnya, Anda masih perlu untuk kode hanya cerdas, dan karena itu secara manual, terhadap antarmuka bahkan jika itu tersembunyi di balik pembungkus.
Yang mengatakan, ada taktik yang dapat Anda gunakan dalam banyak bahasa untuk menghindari merujuk langsung ke kelas. Dan dalam beberapa kasus, Anda dapat "berpura-pura" antarmuka atau pembungkus tipis yang sebenarnya tidak ada. Dalam C #, misalnya, saya akan pergi salah satu dari dua rute:
- Gunakan pabrik dan pengetikan implisit .
Anda dapat menghindari upaya membungkus sepenuhnya kelas yang kompleks dengan kombo kecil ini:
// "factory"
class PdfDocumentFactory {
public static ExternalPDFLibraryDocument Build() {
return new ExternalPDFLibraryDocument();
}
}
// code that uses the factory.
class CoreBusinessEntity {
public void DoImportantThings() {
var doc = PdfDocumentFactory.Build();
// ... i have no idea what your lib does, so, I'm making stuff but.
// but, you can do whatever you want here without explicitly
// referring to the library's actual types.
doc.addHeader("Wee");
doc.getAllText().makeBiggerBy(4).makeBold().makeItalic();
return doc.exportBinaryStreamOrSomething();
}
}
Jika Anda dapat menghindari menyimpan objek-objek ini sebagai anggota, baik melalui pendekatan yang lebih "fungsional" atau dengan menyimpannya dalam kamus (atau apa pun ), pendekatan ini memiliki manfaat memeriksa tipe waktu kompilasi tanpa entitas bisnis inti Anda perlu tahu persis kelas apa yang mereka kerjakan.
Yang diperlukan hanyalah bahwa, pada waktu kompilasi, kelas yang dikembalikan oleh pabrik Anda sebenarnya memiliki metode yang digunakan objek bisnis Anda.
- Gunakan pengetikan dinamis .
Ini berada dalam nada yang sama dengan menggunakan pengetikan tersirat , tetapi melibatkan pengorbanan lain: Anda kehilangan pemeriksaan tipe kompilasi dan mendapatkan kemampuan untuk menambahkan dependensi eksternal secara anonim sebagai anggota kelas dan menyuntikkan dependensi Anda.
class CoreBusinessEntity {
dynamic Doc;
public void InjectDoc(dynamic Doc) {
Doc = doc;
}
public void DoImortantThings() {
Doc.addHeader("Wee");
Doc.getAllText().makeBiggerBy(4).makeBold().makeItalic();
return Doc.exportBinaryStreamOrSomething();
}
}
Dengan kedua taktik ini, ketika tiba saatnya untuk mengejek ExternalPDFLibraryDocument
, seperti yang saya katakan sebelumnya, Anda memiliki beberapa pekerjaan yang harus dilakukan - tetapi, itu adalah pekerjaan yang perlu Anda lakukan juga . Dan, dengan konstruksi ini, Anda telah menghindari mendefinisikan 100-an kelas bungkus kecil tipis. Anda cukup menggunakan perpustakaan tanpa melihatnya langsung - sebagian besar.
Dengan semua yang dikatakan, ada tiga alasan besar yang saya masih akan mempertimbangkan secara eksplisit membungkus perpustakaan pihak ketiga - tidak ada yang akan mengisyaratkan menggunakan alat atau kerangka kerja:
- Perpustakaan spesifik tidak intrinsik ke aplikasi.
- Akan sangat mahal untuk menukar tanpa membungkusnya.
- Saya tidak suka API itu sendiri.
Jika saya tidak memiliki masalah level di ketiga area tersebut, Anda tidak melakukan upaya signifikan untuk menyelesaikannya. Dan, jika Anda memiliki kekhawatiran di ketiga area, pembungkus tipis yang dibuat secara otomatis tidak akan membantu.
Jika Anda telah memutuskan untuk membungkus pustaka, penggunaan waktu Anda yang paling efisien dan efektif adalah membangun aplikasi Anda terhadap antarmuka yang Anda inginkan ; tidak menentang API yang ada.
Dengan kata lain, perhatikan nasihat klasik: Tunda setiap keputusan yang Anda bisa. Bangun "inti" aplikasi Anda terlebih dahulu. Kode terhadap antarmuka yang pada akhirnya akan melakukan apa yang Anda inginkan, yang pada akhirnya akan dipenuhi oleh "hal periferal" yang belum ada. Jembatan kesenjangan yang diperlukan.
Upaya ini mungkin tidak terasa seperti menghemat waktu; tetapi jika Anda merasa perlu pembungkus, ini adalah cara paling efisien untuk melakukannya dengan aman.
Pikirkan seperti ini.
Anda perlu kode terhadap pustaka ini di beberapa sudut gelap kode Anda - bahkan jika sudah selesai. Jika Anda mengejek perpustakaan selama pengujian, ada upaya manual yang tidak dapat dihindari di sana - bahkan jika sudah selesai. Tapi, itu tidak berarti Anda harus secara langsung mengakui perpustakaan itu dengan nama di sebagian besar aplikasi Anda.
TLDR
Jika perpustakaan layak untuk dibungkus, gunakan taktik untuk menghindari rujukan luas, langsung ke perpustakaan pihak ke-3 Anda, tetapi jangan mengambil jalan pintas untuk menghasilkan pembungkus tipis. Bangun logika bisnis Anda terlebih dahulu, pertimbangkan antarmuka Anda, dan jalankan adapter Anda secara organik, sesuai kebutuhan.
Dan, jika itu yang terjadi, jangan takut dengan tes integrasi. Mereka sedikit fuzzier, tetapi mereka masih menawarkan bukti kode kerja, dan mereka masih dapat dengan mudah dibuat untuk menjaga regresi.