Framework atau Library

Dec 23 2022
Apa bedanya, dan haruskah kita peduli?
Saat berbicara tentang dependensi, kedua istilah tersebut dapat digunakan, terkadang dengan cara (berbahaya) yang dapat dipertukarkan. Apakah React itu framework atau library? Bagaimana dengan Bootstrap, atau Lodash? Keduanya adalah "paket", bukan? Tentu saja, tetapi mereka pasti tidak memiliki dampak yang sama pada aplikasi Anda.
Pemandangan berbingkai dari Perpustakaan Nasional Perancis

Saat berbicara tentang dependensi , kedua istilah tersebut dapat digunakan, terkadang dengan cara (berbahaya) yang dapat dipertukarkan. Apakah React itu framework atau library? Bagaimana dengan Bootstrap , atau Lodash ? Keduanya adalah “ paket ” kan?

Tentu saja, tetapi mereka pasti tidak memiliki dampak yang sama pada aplikasi Anda.

Perpustakaan

Perpustakaan ("bibliothèque" dalam bahasa Prancis, tetapi kebanyakan orang Prancis mengatakan "librairie" yang sebenarnya berarti "toko buku" dalam bahasa Prancis, tetapi cocok dengan pengucapan bahasa Inggris "perpustakaan") adalah sekumpulan fungsi untuk tujuan umum (seperti underscore.js ) atau yang khusus (seperti moment.js ).

Anda memanggil fungsi perpustakaan kapan pun Anda membutuhkannya, seperti Anda memilih alat di kotak alat. Mereka tidak memerlukan perubahan dalam desain perangkat lunak Anda .

Menggunakan perpustakaan melakukan panggilan penting untuk itu

Panggilan eksklusif

Namun, sebagai ketergantungan, mereka meminta Anda untuk memanggil API milik mereka, sehingga "mengunci" kode Anda dengan mereka (atau bahkan mungkin versinya ) , sehingga panggilan perpustakaan akan terlihat seperti ini:

Pada kenyataannya kode Anda bergantung pada API perpustakaan

Penguncian seperti itu akan meningkat dengan jumlah panggilan yang Anda keluarkan: semakin banyak Anda memanggil pustaka, semakin banyak kode Anda bergantung padanya (atau pada versinya):

Semakin banyak Anda memanggil perpustakaan, semakin banyak kode Anda "tercemar" dengan panggilan hak milik

Titik ketergantungan tunggal

Namun, untuk membatasi ketergantungan seperti itu, Anda dapat menyembunyikannya di balik pembungkus:

Menggunakan adaptor membuat panggilan Anda tidak bergantung pada perpustakaan

Pembungkus seperti itu sebenarnya bisa melayani lebih dari satu tujuan. Selain mengurangi penguncian ke satu titik di basis kode Anda, ini memungkinkan Anda untuk mengekspos api Anda sendiri ke penelepon. Adaptasi pustaka semacam itu hanya akan menampilkan API yang masuk akal untuk aplikasi Anda, serta jenis I/O yang khusus bukan aplikasi Anda, bukan untuk pustaka.

Namun, implementasi berbicara, selangkah demi selangkah, kode Anda masih bergantung pada perpustakaan.

API Bisnis

Mudah-mudahan, seperti yang biasa dikatakan mendiang David J. Wheeler:

Semua masalah dalam ilmu komputer dapat diselesaikan dengan tingkat tipuan lain .

Memang, Anda dapat menghindari ketergantungan tersebut dengan menambahkan interface :

Merujuk antarmuka API alih-alih implementasi memungkinkan kode aplikasi tetap independen
  • penelepon akan bergantung pada deklarasi API tersebut ;
  • adaptor harus mengimplementasikannya (perhatikan bahwa ini juga akan memudahkan perpustakaan yang mengejek saat pengujian).

Kerangka kerja

Frameworks ("quadriciels" dalam bahasa Prancis resmi, tetapi semua orang mengatakan "framework") berbeda, karena mereka menyediakan jenis layanan yang berbeda: mereka menawarkan untuk mengelola berbagai hal untuk Anda, alih-alih membiarkan Anda merancang apa yang harus dilakukan.

Menyerahkan kendali

Untuk melakukannya, mereka menerapkan tulang punggung ("bingkai") aplikasi, dan membiarkan Anda mengisi bagian yang kosong. Tapi kekosongan itu dibiarkan di tempat yang ditentukan dan memiliki bentuk yang ditentukan.

Artinya:

  • aplikasi dimulai dengan kerangka kerja : Anda harus menyerahkan setir.
  • karena kerangka kerja menggerakkan aplikasi, bukan Anda yang melakukan panggilan lagi: sebagai gantinya, Anda akan dipanggil kembali oleh kerangka kerja bila perlu.
“Jangan hubungi kami, kami akan menghubungi Anda”, alias prinsip Hollywood

Kontrak

Tentu saja tidak ada yang menghalangi Anda untuk secara manual memanggil beberapa kode Anda sendiri, pustaka pihak ketiga, atau bahkan beberapa API kerangka kerja, tetapi dengan risiko Anda sendiri . Ini mungkin atau mungkin tidak berfungsi seperti yang Anda harapkan. Framework memiliki aturan yang harus Anda ikuti dan, jika Anda melanggarnya, framework tidak dapat dianggap bertanggung jawab atas kegagalan apa pun.

Biasanya kerangka kerja akan memungkinkan Anda menulis komponen yang sesuai dengan wadahnya melalui penerapan kontrak :

Setiap komponen diharuskan untuk mematuhi kontrak kerangka kerja.

Kontainer kemudian akan dapat menangani kode Anda sebagai perangkat lunak yang kompatibel dengan kerangka kerja yang siklus hidupnya dapat dikelola, dan akan memanggil Anda kembali pada waktu yang relevan untuk melakukan beberapa jenis operasi atau lainnya.

Seperti yang Anda lihat, ini adalah pilihan yang jauh lebih struktural daripada pustaka untuk desain aplikasi Anda: semua komponen Anda menjadi khusus untuk kerangka kerja itu. Itu tidak akan portabel (yaitu tidak dipahami oleh kerangka kerja lain) atau dapat dioperasikan (yaitu komponen Angular hampir tidak akan berinteraksi dengan komponen Bereaksi).

Namun, orang mungkin berpendapat bahwa pola adaptor dapat digunakan untuk membatasi ketergantungan kerangka kerja, seperti yang kami lakukan untuk membatasi ketergantungan pada perpustakaan:

Isolasi komponen kerangka hampir tidak membuat perbedaan

Ini mungkin terlihat berguna… jika arah ketergantungannya sama. Tapi ternyata tidak: adaptor pustaka digunakan untuk mengambil bentuk yang diperlukan oleh aplikasi, sedangkan di sini adaptor komponen hanya dapat mengambil bentuk yang diharapkan kerangka kerja. Akibatnya, komponen aplikasi yang dianggap "gratis" hanya dapat meniru kontrak awal (siklus hidup, semantik, perincian).

Di dalam kerangka kerja, adaptor komponen akan menjadi lapisan yang tidak perlu.

Pustaka kerangka kerja

Perpustakaan juga dapat mematuhi kerangka kerja. Alih-alih menyediakan API, mereka menyediakan implementasi komponen untuk kerangka tertentu.

Karena kerangka kerja menjadi populer, sejumlah pustaka kerangka kerja tersedia. Kebanyakan dari mereka adalah tentang widget, meskipun: misalnya komponen Material Design telah dipindahkan dari kerangka kerja Android ke Web Components , Angular , React , Vue dan bahkan iOS .

Kerangka standar

Siapa pun dapat membayangkan biaya yang luar biasa untuk mem-porting pustaka yang sama (dan versi berikutnya) pada masing-masing kerangka kerja tersebut.

IBM telah menemukan solusi tentang ini : alih-alih mem-porting Sistem Desain Karbon mereka pada setiap kerangka kerja hyped masa lalu, saat ini, dan masa depan, mereka berinvestasi di port pada kerangka kerja Komponen Web standar , yang dapat digunakan dalam konteks apa pun.

Jadi, tidak hanya ini memungkinkan untuk menggunakan komponen mereka dari framework:

Komponen web hanyalah bagian dari tampilan komponen framework

Tetapi komponen yang sama juga dapat digunakan dari aplikasi biasa:

Komponen web dapat disisipkan sebagai tag bahkan di aplikasi web sederhana

Kesimpulan

Framework dan library adalah opsi pihak ketiga yang sangat berbeda:

  • kerangka kerja memberi Anda cetak biru aplikasi dengan layanan bawaan tetapi memberlakukan kontrak yang telah ditentukan sebelumnya untuk memanggil kode Anda. Dengan demikian, mereka menyiratkan ketergantungan yang kuat .
  • pustaka tidak akan membantu Anda mendesain aplikasi, tetapi hanya dapat dipanggil saat Anda membutuhkannya. Anda dapat menyusun desain yang membatasi ketergantungan pada mereka.