Buku "Bagaimana JavaScript Bekerja"

gambar Sebagian besar bahasa pemrograman tumbuh dari paradigma kuno yang berasal dari zaman Fortran. Guru JavaScript Douglas Crockford mencabut akar-akar kering ini, memungkinkan kita untuk berpikir tentang masa depan pemrograman, pindah ke tingkat baru dalam memahami persyaratan untuk Bahasa Selanjutnya.

Penulis mulai dengan dasar-dasar: nama, angka, nilai logis, karakter, dan informasi dasar lainnya. Anda akan belajar tidak hanya tentang masalah dan kesulitan bekerja dengan tipe dalam JavaScript, tetapi juga bagaimana cara mengatasinya. Anda kemudian akan mulai membiasakan diri dengan struktur data dan fungsi untuk memahami mekanisme yang mendasarinya, dan belajar bagaimana menggunakan fungsi tingkat tinggi dan gaya pemrograman berorientasi objek tanpa kelas.

Kutipan
Bagaimana kode bekerja tanpa kelas


Dan Anda berpikir bahwa Anda pintar di luar semua kelas dan gratis.
John Lennon

Salah satu ide kunci dalam pengembangan pemrograman berorientasi objek adalah model untuk pertukaran data antara bagian-bagian program. Nama metode dan argumennya harus direpresentasikan dalam bentuk pesan. Panggilan metode mengirim pesan ke objek. Setiap objek ditandai oleh perilakunya sendiri, yang dimanifestasikan saat menerima pesan tertentu. Pengirim yakin bahwa penerima tahu apa yang harus dilakukan dengan pesan tersebut.

Satu manfaat tambahan adalah polimorfisme. Setiap objek yang mengenali pesan tertentu memiliki hak untuk menerimanya. Apa yang terjadi selanjutnya tergantung pada spesialisasi objek. Dan ini adalah pemikiran yang sangat produktif.

Sayangnya, kami mulai terganggu oleh warisan - skema yang sangat efektif untuk menggunakan kembali kode. Pentingnya dikaitkan dengan kemampuan untuk mengurangi biaya tenaga kerja saat mengembangkan suatu program. Warisan dibangun di atas rencana yang sama, dengan pengecualian beberapa nuansa. Kita dapat mengatakan bahwa beberapa objek atau kelas objek mirip dengan beberapa objek atau kelas objek lain, tetapi memiliki beberapa perbedaan penting. Dalam situasi yang sederhana, semuanya bekerja dengan baik. Harus diingat bahwa OOP modern dimulai dengan Smalltalk, bahasa pemrograman untuk anak-anak. Ketika situasinya menjadi lebih rumit, pewarisan menjadi problematis. Ini menimbulkan kohesi kelas yang kuat. Mengubah satu kelas dapat menyebabkan kegagalan di kelas-kelas yang bergantung padanya. Modul dari kelas tidak berguna.

Selain itu, kami mengamati peningkatan perhatian pada properti, dan bukan pada objek. Perhatian khusus diberikan pada metode untuk memperoleh (mendapatkan-metode) dan menetapkan (set-metode) nilai untuk masing-masing properti individu, dan bahkan dalam proyek yang kurang berhasil, properti terbuka dan dapat diubah tanpa sepengetahuan objek. Sangat mungkin untuk memperkenalkan proyek yang lebih sukses, di mana properti disembunyikan, dan metode memproses transaksi, tidak hanya berurusan dengan perubahan properti. Namun pendekatan ini tidak sering diterapkan.

Selain itu, ada terlalu banyak ketergantungan tipe. Jenis menjadi fitur bahasa Fortran dan kemudian, karena mereka nyaman bagi pembuat kompiler. Sejak itu, mitologi seputar tipe telah berkembang, setelah memperoleh klaim berlebihan bahwa tipe melindungi program dari kesalahan. Meskipun pengabdian pada tipe, kesalahan tidak meninggalkan praktik sehari-hari.

Jenis dihormati dan dipuji untuk deteksi dini kesalahan perhitungan pada tahap kompilasi. Semakin cepat pengawasan ditemukan, semakin rendah biaya yang diperlukan untuk menghilangkannya. Tetapi dengan pengujian program yang tepat, semua kesalahan perhitungan ini terdeteksi dengan sangat cepat. Oleh karena itu, kesalahan identifikasi jenis diklasifikasikan sebagai biaya rendah.

Tipe tidak bisa disalahkan atas penampilan kesalahan yang sulit dideteksi dan mahal. Kesalahan mereka bukanlah dalam terjadinya masalah yang disebabkan oleh kesalahan seperti itu dan membutuhkan beberapa trik. Jenis dapat mendorong kita untuk menggunakan metode pemrograman yang tidak jelas, membingungkan, dan meragukan.

Jenisnya seperti diet penurunan berat badan. Diet tidak dituduh kembali dan menambah berat badan. Ia juga tidak dianggap sebagai penyebab penderitaan atau masalah kesehatan yang ditimbulkannya. Diet memberi harapan bahwa berat badan akan kembali ke norma yang sehat dan kita akan terus makan junk food.

Warisan klasik memungkinkan kita berpikir bahwa kita membuat program berkualitas tinggi, sementara kita membuat lebih banyak kesalahan dan menerapkan warisan yang semakin tidak efisien. Jika Anda mengabaikan manifestasi negatif, tipe tersebut tampaknya menjadi kemenangan besar. Manfaatnya jelas. Tetapi jika Anda melihat jenisnya lebih dekat, Anda akan melihat bahwa biayanya melebihi manfaatnya.

Konstruktor


Dalam bab 13, kami bekerja dengan pabrik - fungsi yang mengembalikan fungsi. Sekarang kita dapat melakukan sesuatu yang mirip dengan konstruktor - fungsi yang mengembalikan objek yang berisi fungsi.

Mari kita mulai dengan membuat counter_constructor, mirip dengan generator penghitung. Ini memiliki dua metode, atas dan ke bawah:

function counter_constructor() { let counter = 0; function up() { counter += 1; return counter; } function down() { counter -= 1; return counter; } return Object.freeze({ up, down }); } 

Objek yang dikembalikan beku. Itu tidak dapat rusak atau rusak. Objek memiliki status. Penghitung variabel adalah properti pribadi objek. Anda dapat mengaksesnya hanya melalui metode. Dan kita tidak perlu menggunakan ini.

Ini adalah keadaan yang sangat penting. Antarmuka objek adalah metode eksklusif. Dia memiliki cangkang yang sangat kuat. Kami mendapatkan enkapsulasi terbaik. Tidak ada akses langsung ke data. Ini adalah desain modular yang sangat berkualitas tinggi.

Konstruktor adalah fungsi yang mengembalikan objek. Parameter dan variabel konstruktor menjadi properti pribadi objek. Tidak memiliki properti publik yang terdiri dari data. Fungsi internal menjadi metode objek. Mereka mengubah properti menjadi yang tertutup. Metode yang jatuh ke objek beku terbuka.

Metode harus menerapkan transaksi. Misalkan, misalnya, kita memiliki objek seseorang. Anda mungkin perlu mengubah alamat orang yang datanya tersimpan di dalamnya. Untuk melakukan ini, Anda tidak perlu satu set fungsi terpisah untuk mengubah setiap elemen alamat individual. Kita memerlukan satu metode yang menerima objek literal, yang mampu menggambarkan semua bagian dari alamat yang perlu diubah.

Salah satu ide cemerlang dalam JavaScript adalah objek literal. Ini adalah sintaks yang bagus dan ekspresif untuk informasi pengelompokan. Dengan membuat metode yang mengkonsumsi dan membuat objek data, Anda dapat mengurangi jumlah metode, sehingga meningkatkan integritas objek.

Ternyata kami memiliki dua jenis objek.

  • Objek keras hanya berisi metode. Objek-objek ini melindungi integritas data yang terkandung dalam penutupan. Mereka memberi kita polimorfisme dan enkapsulasi.
  • Objek data lunak hanya berisi data. Mereka tidak punya perilaku. Ini hanya koleksi praktis yang dapat berfungsi dengan fungsi.

Dipercayai bahwa OOP dimulai dengan menambahkan prosedur pada catatan dalam bahasa Kobol, sehingga memastikan semacam perilaku. Saya percaya bahwa kombinasi metode data dan properti merupakan langkah maju yang penting, tetapi seharusnya tidak menjadi langkah terakhir.

Jika objek keras harus dikonversi ke string, metode toJSON harus diaktifkan. Jika tidak, JSON.stringify akan melihatnya sebagai objek kosong, mengabaikan metode dan data tersembunyi (lihat bab 22).

Opsi konstruktor


Suatu ketika saya membuat konstruktor yang membutuhkan sepuluh argumen. Itu sangat sulit digunakan, karena tidak ada yang bisa mengingat urutan argumennya. Kemudian diketahui bahwa tidak ada yang menggunakan argumen kedua, saya ingin menghapusnya dari daftar parameter, tetapi itu akan memecah semua kode yang sudah dikembangkan.

Jika saya bijaksana, saya akan memiliki konstruktor yang mengambil satu objek sebagai parameter. Biasanya diambil dari objek literal, tetapi dapat berasal dari sumber lain, misalnya, dari konten JSON.

Ini akan memberikan banyak manfaat.

  • Baris kunci memberi kode tampilan yang terdokumentasi. Kode lebih mudah dibaca karena memberi tahu Anda apa masing-masing argumen kepada penelepon.
  • Argumen dapat diatur dalam urutan apa pun.
  • Di masa mendatang, Anda dapat menambahkan argumen baru tanpa merusak kode yang ada.
  • Parameter yang tidak relevan dapat diabaikan.

Paling sering, parameter digunakan untuk menginisialisasi properti pribadi. Ini dilakukan sebagai berikut:

 function my_little_constructor(spec) { let { name, mana_cost, colors, type, supertypes, types, subtypes, text, flavor, power, toughness, loyalty, timeshifted, hand, life } = spec; 

Kode ini membuat dan menginisialisasi 15 variabel pribadi menggunakan properti dengan nama yang sama dari spec. Jika spec tidak memiliki properti yang sesuai, variabel baru diinisialisasi, yang diberi nilai yang tidak ditentukan. Ini memungkinkan Anda untuk mengisi semua nilai yang hilang dengan nilai default.

Komposisi


Ekspresi yang jelas dan efektifitas JavaScript memungkinkan Anda membuat program dalam paradigma klasik, meskipun bahasa ini tidak berlaku untuk yang klasik. JavaScript juga memungkinkan untuk peningkatan. Kami dapat bekerja dengan komposisi fungsional. Jadi, alih-alih menambahkan sesuatu sebagai pengecualian, Anda bisa mendapatkan sedikit ini dan itu. Konstruktor memiliki tampilan umum berikut:

 function my_little_constructor(spec) { let {} = spec; const _ = other_constructor(spec); const  = function () { //   spec, , _,  }; return Object.freeze({ , _. }); } 

Konstruktor Anda dapat memanggil sebanyak mungkin konstruktor lain yang diperlukan untuk mendapatkan akses ke manajemen negara dan perilaku yang mereka berikan. Anda bahkan dapat melewatkannya objek spec yang sama persis. Dengan mendokumentasikan parameter spesifikasi, kami mencantumkan properti yang dibutuhkan oleh my_little_constructor dan properti yang dibutuhkan oleh konstruktor lain.

Kadang-kadang Anda bisa menambahkan metode yang dihasilkan ke objek beku. Dalam kasus lain, kami memiliki metode baru yang memanggil metode yang diterima. Ini memastikan bahwa kode digunakan kembali, mirip dengan warisan, tetapi tanpa kohesi yang kuat. Panggilan fungsi adalah skema penggunaan kembali kode asli, dan tidak ada yang lebih baik yang telah ditemukan.

Ukuran


Dengan pendekatan ini untuk membangun suatu objek, lebih banyak memori yang terlibat daripada ketika menggunakan prototipe, karena setiap objek kaku berisi semua metode objek, dan objek prototipe berisi tautan ke prototipe yang berisi metode. Apakah perbedaan dalam konsumsi memori signifikan? Membandingkan perbedaan dengan pencapaian terbaru dalam meningkatkan jumlah memori, kita dapat mengatakan: tidak. Kita terbiasa membaca memori dalam kilobyte. Dan sekarang kami mempertimbangkannya dalam gigabytes. Terhadap latar belakang ini, perbedaannya tidak terasa sama sekali.

Perbedaannya dapat dikurangi dengan meningkatkan modularitas. Penekanan pada transaksi, bukan properti, memungkinkan Anda untuk mengurangi jumlah metode, dan pada saat yang sama meningkatkan konektivitas.

Model klasik ditandai oleh keseragaman. Setiap objek harus merupakan turunan dari kelas. JavaScript menghapus batasan ini. Tidak semua objek harus mematuhi aturan ketat seperti itu.

Sebagai contoh, saya percaya bahwa tidak masuk akal jika poin menjadi objek yang kaku dengan metode. Suatu titik bisa menjadi wadah sederhana untuk dua atau tiga angka. Poin diteruskan ke fungsi yang mampu proyeksi, atau interpolasi, atau hal lain yang dapat dilakukan dengan poin. Ini bisa menjadi jauh lebih produktif daripada poin subclassing untuk memberi mereka perilaku khusus. Biarkan fungsinya bekerja.

Β»Informasi lebih lanjut tentang buku ini dapat ditemukan di situs web penerbit
Β» Isi
Β» Kutipan

Kupon diskon 25% untuk penjaja - JavaScript

Setelah pembayaran versi kertas buku, sebuah buku elektronik dikirim melalui email.

Source: https://habr.com/ru/post/id455698/


All Articles