Kata pengantar
Dalam bab ini, kita akan menjelaskan bab keempat dari implementasi lima prinsip utama javascript padat, prinsip pemisahan antarmuka.
Teks Bahasa Inggris Asli: http://freshbrewedcode.com/derekgreeer/2012/01/08/solid-javascript-the-interface-segregation-principle/
Catatan: Penulis artikel ini cukup menyentuh, sehingga pamannya juga tertekan untuk memahaminya. Bacalah saja sesuka Anda, jangan terjebak di dalamnya.
Deskripsi prinsip isolasi antarmuka adalah:
Salinan kode adalah sebagai berikut:
Klien tidak boleh dipaksa untuk bergantung pada metode yang tidak mereka gunakan.
Pelanggan tidak boleh dipaksa untuk mengandalkan metode yang tidak mereka gunakan.
Ketika metode antarmuka yang diandalkan pengguna hanya digunakan oleh pengguna lain dan tidak menggunakannya, ia harus mengimplementasikan antarmuka ini. Dengan kata lain, jika pengguna bergantung pada antarmuka yang tidak digunakan tetapi digunakan oleh pengguna lain, ketika pengguna lain memodifikasi antarmuka, semua pengguna yang mengandalkan antarmuka akan terpengaruh. Ini jelas melanggar prinsip pembukaan dan penutupan, dan bukan yang kita harapkan.
Prinsip isolasi antarmuka ISP agak mirip dengan tanggung jawab tunggal. Keduanya digunakan untuk mengumpulkan tanggung jawab fungsional. Faktanya, ISP dapat dipahami untuk mengonversi program dengan tanggung jawab tunggal ke objek dengan antarmuka publik.
Antarmuka JavaScript
Bagaimana kita mematuhi prinsip ini di bawah JavaScript? Bagaimanapun, JavaScript tidak memiliki fitur antarmuka. Jika antarmuka adalah apa yang ingin kami buat kontrak dan decouple melalui tipe abstrak yang disediakan oleh bahasa tertentu, dapat dikatakan bahwa tidak apa -apa, tetapi JavaScript memiliki bentuk antarmuka lain. Dalam buku desain pola desain perangkat lunak berorientasi objek yang dapat digunakan kembali, kami menemukan definisi antarmuka:
http://www.amazon.com/design-patterns-elements-reusable-object-oriented/dp/0201633612
Operasi apa pun yang dideklarasikan oleh suatu objek berisi nama operasi, objek parameter, dan nilai pengembalian operasi. Kami menyebutnya tanda tangan operator.
Semua operasi yang dinyatakan dalam suatu objek disebut antarmuka objek ini. Antarmuka objek menggambarkan semua informasi permintaan yang terjadi pada objek ini.
Terlepas dari apakah suatu bahasa menyediakan konstruk terpisah untuk mewakili antarmuka, semua objek memiliki antarmuka implisit yang terdiri dari semua properti dan metode objek. Lihat kode berikut:
Salinan kode adalah sebagai berikut:
var exampleBinder = {};
exampleBinder.modelobserver = (function () {
/* Variabel pribadi*/
kembali {
Observe: function (model) {
/* Kode*/
mengembalikan newmodel;
},
Onchange: function (callback) {
/* Kode*/
}
}
}) ();
exampleBinder.viewAdaptor = (function () {
/* Variabel pribadi*/
kembali {
bind: function (model) {
/* Kode*/
}
}
}) ();
exampleBinder.bind = function (model) {
/* Variabel pribadi*/
exampleBinder.modelobserver.onchange (/ * callback callback */);
var om = exampleBinder.modelobserver.observe (model);
exampleBinder.ViewAdaptor.Bind (OM);
mengembalikan om;
};
Perpustakaan kelas ExampleBinder di atas mengimplementasikan ikatan dua arah. Antarmuka publik yang diekspos oleh pustaka kelas ini adalah metode BIND, di mana fungsi pemberitahuan perubahan dan interaksi tampilan yang digunakan dalam BIND diimplementasikan oleh objek terpisah ModelObserver dan ViewAdaptor, masing -masing. Objek -objek ini dalam arti implementasi spesifik dari metode BIND antarmuka publik.
Meskipun JavaScript tidak menyediakan jenis antarmuka untuk mendukung kontrak objek, antarmuka implisit objek masih dapat diberikan kepada pengguna program sebagai kontrak.
ISP dan JavaScript
Beberapa subbagian yang kita bahas di bawah ini adalah dampak melanggar prinsip isolasi antarmuka dalam JavaScript. Seperti yang terlihat di atas, meskipun sangat disayangkan untuk mengimplementasikan prinsip isolasi antarmuka dalam program JavaScript, itu tidak sekuat bahasa yang diketik secara statis. Karakteristik bahasa JavaScript kadang-kadang membuat apa yang disebut antarmuka sedikit non-stick.
Realisasi kebobrokan
Dalam bahasa yang diketik secara statis, salah satu alasan untuk melanggar prinsip ISP adalah implementasi yang merosot. Metode yang ditentukan dalam semua antarmuka di Java dan C# harus diimplementasikan. Jika Anda hanya membutuhkan beberapa dari mereka, metode lain juga harus diimplementasikan (dapat diimplementasikan dengan pengecualian kosong atau melempar). Dalam JavaScript, jika hanya beberapa antarmuka dalam suatu objek yang diperlukan, ia tidak dapat menyelesaikan masalah implementasi yang merosot, meskipun tidak perlu memaksa implementasi antarmuka di atas. Namun, implementasi ini masih melanggar prinsip penggantian Richter.
Salinan kode adalah sebagai berikut:
var rectangle = {
area: function () {
/* Kode*/
},
Draw: function () {
/* Kode*/
}
};
var geometryApplication = {
getLarestrectangle: function (persegi panjang) {
/* Kode*/
}
};
var drawingApplication = {
drawrectangles: function (persegi panjang) {
/* Kode*/
}
};
Ketika alternatif persegi panjang untuk memenuhi getLarestrectangle dari Obyek GeometryApplication, ia hanya membutuhkan metode Area Persegi Panjang (), tetapi melanggar LSP (karena tidak dapat menggunakan metode Draw yang hanya dapat digunakan dalam metode Drawrectangles).
Kopling statis
Alasan lain untuk pelanggaran ISP dalam bahasa yang diketik secara statis adalah kopling statis. Dalam bahasa yang diketik secara statis, antarmuka memainkan peran utama dalam program desain yang digabungkan secara longgar. Apakah dalam bahasa yang dinamis atau statis, kadang -kadang suatu objek mungkin perlu berkomunikasi antara beberapa pengguna klien (seperti keadaan bersama). Untuk bahasa yang diketik secara statis, solusi terbaik adalah menggunakan antarmuka peran, yang memungkinkan pengguna untuk berinteraksi dengan objek (yang mungkin perlu dalam berbagai peran) sebagai implementasinya untuk memisahkan pengguna dan perilaku yang tidak terkait. Tidak ada masalah seperti itu dalam JavaScript, karena objek dipisahkan oleh keunggulan unik dari bahasa dinamis.
Kopling semantik
Salah satu alasan umum untuk melanggar ISP adalah bahasa yang dinamis dan diketik secara statis, yang merupakan kopling semantik. Yang disebut kopling semantik adalah saling ketergantungan, yaitu, perilaku suatu objek tergantung pada objek lain, yang berarti bahwa jika pengguna mengubah salah satu perilaku, kemungkinan besar akan mempengaruhi pengguna lain. Ini juga melanggar prinsip tanggung jawab tunggal. Masalah ini dapat diselesaikan melalui warisan dan substitusi objek.
Skalabilitas
Alasan lain untuk masalah ini adalah tentang skalabilitas. Banyak orang akan memberikan contoh tentang panggilan balik untuk menunjukkan skalabilitas (seperti pengaturan panggilan balik setelah sukses di AJAX). Jika antarmuka seperti itu membutuhkan implementasi dan ada banyak metode atau metode yang akrab dalam objek implementasi ini, ISP akan menjadi sangat penting. Dengan kata lain, ketika antarmuka antarmuka menjadi kebutuhan untuk mengimplementasikan banyak metode, implementasinya akan menjadi sangat kompleks, dan dapat menyebabkan antarmuka ini memikul tanggung jawab yang tidak lengket. Ini adalah antarmuka lemak yang sering kita sebutkan.
Meringkaskan
Karakteristik bahasa dinamis dalam JavaScript membuat implementasi antarmuka non-stick kami kurang berpengaruh daripada bahasa yang diketik secara statis, tetapi prinsip isolasi antarmuka masih memiliki fungsinya dalam model pemrograman JavaScript.