Apa yang dianggap kode pihak ketiga?

15

Terinspirasi oleh pertanyaan ini Menggunakan perpustakaan pihak ketiga - selalu menggunakan pembungkus? Saya ingin tahu apa yang orang anggap sebagai perpustakaan pihak ketiga.

Contoh dari PHP:
Jika saya membuat aplikasi menggunakan kerangka Zend, haruskah saya memperlakukan pustaka kerangka kerja Zend sebagai kode pihak ketiga?

Contoh dari C #:
Jika saya membuat aplikasi desktop, haruskah saya memperlakukan semua kelas .Net sebagai kode pihak ketiga?

Contoh dari Jawa:
Haruskah saya memperlakukan semua perpustakaan di JDK sebagai perpustakaan pihak ketiga?

Beberapa orang mengatakan bahwa jika perpustakaan stabil dan tidak akan sering berubah maka orang tidak perlu membungkusnya. Namun saya gagal melihat bagaimana seseorang akan menguji kelas yang tergantung pada kode pihak ketiga tanpa membungkusnya.

Songo
sumber
8
Bisakah pemilih bawah menjelaskan mengapa?
Songo
Saya pernah mendengar tentang perangkat lunak pihak ketiga, tetapi bukan kode pihak ketiga. Sebagian besar pihak ketiga tidak memberi Anda kode sumber mereka.
Tulains Córdova

Jawaban:

18

Semua contoh Anda adalah kode pihak ketiga, tetapi Anda tidak boleh menulis pembungkus untuk mereka. Mereka adalah proyek besar, matang dengan API stabil dan terencana dengan baik.

Kebutuhan pembungkus adalah untuk memberikan lapisan abstraksi antara kode Anda dan perpustakaan. Anda hanya perlu abstraksi ini ketika Anda menemukan bahwa perpustakaan tidak menyediakan API yang baik untuk hal tertentu yang Anda lakukan. Kemudian Anda dapat membuat pembungkus untuk menyederhanakan kode Anda sendiri, dan menyembunyikan fakta bahwa panggilan API canggung.

Kode Anda akan dapat diuji jika Anda menggunakan injeksi ketergantungan. Dalam pengujian unit Anda, Anda dapat menukar ketergantungan perpustakaan dengan objek tiruan, memungkinkan Anda untuk mengisolasi kode Anda yang sedang diuji.

M. Dudley
sumber
+1 untuk menjelaskan kapan bungkus atau fasad, jika Anda mau, mungkin diperlukan.
Joshua Drake
Terima kasih atas jawabannya, tetapi mengenai paragraf terakhir tentang pengujian unit dapatkah Anda melihat pertanyaan ini di mana saya mencoba menguji unit kelas yang memiliki ketergantungan langsung pada kerangka kerja perpustakaan?
Songo
@Songo: Strategi pengujian Anda harus membuat Zend_Mailtiruan yang Anda berikan ke Loggerobjek yang sedang diuji. Apakah PHP tidak mendukung mengetik bebek? Jika demikian, bukankah sepele membuat objek tiruan ...? Saya tidak benar-benar tahu PHP, tetapi Anda bisa melihat contoh-contoh dari perpustakaan PHP mengejek untuk melihat bagaimana biasanya dilakukan. Dalam bahasa yang tidak mendukung pengetikan bebek, maka saya pikir Anda perlu mengubah Zend_Mailke antarmuka, dan kemudian membuat pembungkus tipis yang mengimplementasikan antarmuka dan mewarisi dari Zend_Mailatau hanya mendelegasikan semua panggilannya.
M. Dudley
@emddudley ya, tapi saya sedang mencari solusi yang lebih umum untuk masalah dalam bahasa lain yang tidak mendukung mengetik bebek. Sebenarnya solusi Anda untuk membungkus Zend_Mailadalah pikiran pertama saya, tetapi seperti yang dapat Anda lihat di posting asli saya sebelum mengeditnya saya memang menggunakan antarmuka dan pembungkus yang mengimplementasikannya. Namun, satu-satunya tujuan pembungkus yang ada adalah agar saya dapat mengejek antarmuka. Apakah itu umum dalam bahasa yang tidak mendukung mengetik bebek? Maksudku, membangun pembungkus tak terbatas tanpa batas?
Songo
@Songo: Saya pikir ini sangat khusus bahasa dan perpustakaan, dan Anda harus puas dengan apa pun yang didukung platform Anda. Terkadang Anda mungkin terjebak dengan pembungkus menulis. Ketergantungan injeksi dan pengejekan objek adalah perkembangan yang cukup baru (2004?), Jadi tidak semua bahasa dan perpustakaan mendukungnya dengan sangat baik. "Solusi umum" yang Anda cari hanyalah pola pikir: bagaimana Anda bisa membuat kode untuk kopling longgar dan pengujian unit yang efektif?
M. Dudley
6

Tujuan membungkus perpustakaan adalah untuk memecah ketergantungan kode Anda pada perpustakaan itu untuk memungkinkan:

  • Pengujian unit - Anda harus dapat menguji kode Anda. Jika perpustakaan tidak memungkinkan Anda untuk mengejek kelas atau memaksa tanggapan yang Anda butuhkan untuk ujian Anda, maka Anda harus membungkus perpustakaan itu. Ini adalah masalah yang jelas, dan mungkin bukan kasus yang Anda tanyakan.
  • Mengubah implementasi - Sebagai pembuat kode, Anda perlu memahami perubahan yang mungkin terjadi pada Anda, dan berapa banyak biaya yang harus disiapkan untuk perubahan dibandingkan dengan seberapa besar kemungkinannya. Bisakah Anda beralih dari .NET ke JVM? Itu sulit dan tidak mungkin; Namun, Anda sangat mungkin untuk mengubah teknologi UI di masa depan, atau mesin XML.

Mengisolasi perpustakaan dan kerangka kerja pihak ketiga hanyalah sebagian dari mengisolasi perubahan.

Ben
sumber
Poin yang sangat bagus tentang pengujian unit. Saya tidak mengatakan selalu membungkus untuk dapat menguji unit aplikasi Anda, tetapi itu adalah strategi yang baik untuk memisahkan ketergantungan ketika diperlukan.
Sergio Acosta
2

Saya tidak akan memperlakukan anggota perpustakaan standar sebagai kode pihak ke-3 - mereka adalah standar setelah semua dan cukup dapat dianggap tersedia dan fungsional pada platform yang Anda gunakan.

Adapun sesuatu seperti Zend, saya pikir orang tidak akan membungkusnya - Anda mungkin perlu menulis ulang program jika Anda menggunakan kerangka kerja yang berbeda. Sejujurnya, saya tidak akan membungkus banyak yang bukan ketergantungan konfigurasi eksternal yang serius atau jika saya tidak benar-benar berencana untuk membuat potongan itu swappable.

Wyatt Barnett
sumber
2

Saya akan mempertimbangkan perpustakaan yang disediakan oleh bahasa pemrograman tertentu hanya sebagai bagian dari bahasa.

Daripada, saya akan mempertimbangkan pihak ketiga, semua perpustakaan yang disediakan oleh entitas lain sebagai ekstensi atau alat yang terpisah dari bahasa pemrograman itu sendiri.

Mengambil contoh Anda, saya akan mempertimbangkan Zend pihak ketiga. Saya juga akan membangun aplikasi saya sedemikian rupa sehingga logika bisnis inti saya tidak akan bergantung pada Zend.

Wikipedia mendefinisikan komponen pihak ketiga sebagai:

Dalam pemrograman komputer, komponen perangkat lunak pihak ketiga adalah komponen perangkat lunak yang dapat digunakan kembali yang dikembangkan untuk didistribusikan atau dijual secara bebas oleh entitas selain dari vendor asli platform pengembangan.

Patkos Csaba
sumber
1

Dalam arti yang paling ketat, setiap contoh yang Anda berikan adalah kode pihak ketiga. Namun, tidak semua kode pihak ketiga harus dibungkus. Semua perpustakaan pihak ketiga harus dibungkus. Kerangka kerja, menurut definisi, tidak dapat dibungkus karena mereka menjadi bagian tak terpisahkan dari kode Anda. Itu sebabnya Anda akan membungkus pustaka logging Anda, tetapi bukan kerangka .NET atau kerangka Zend. Anda tidak dapat benar-benar memisahkan kode Anda dari .NET - mereka saling terkait. Tentu saja, kerangka kerja yang baik akan memiliki antarmuka untuk diprogram melawan, memungkinkan Anda untuk melewati masalah sampai batas tertentu.

Lihat juga: /programming/148747/what-is-the-difference-between-a-framework-and-a-library

Michael
sumber