Apa gunanya 'Smalltalk' menjadi: 'miliki?


12

The become:pesan dalam Smalltalk menyebabkan satu objek perubahan ke yang lain, yang mempengaruhi semua referensi untuk itu.

Apa kegunaan fitur bahasa ini? Apakah itu digunakan dalam kode nyata? Apakah itu hanya rasa ingin tahu? Apakah dianggap praktik yang baik / buruk untuk menggunakannya?

Jawaban:


11

Gilad Bracha berbicara become:panjang lebar:

Salah satu fitur Smalltalk yang paling unik dan kuat juga merupakan salah satu yang paling tidak dikenal di luar komunitas Smalltalk. Ini adalah metode kecil yang disebut menjadi:.

Apa yang menjadi: lakukan adalah menukar identitas penerima dan argumennya. Itu setelah

a menjadi: b

semua referensi ke objek yang dilambangkan dengan sebelum titik panggilan merujuk ke objek yang dilambangkan dengan b, dan sebaliknya.

Luangkan waktu sebentar untuk menginternalisasi ini; Anda mungkin salah paham sebagai sesuatu yang sepele. Ini bukan tentang bertukar dua variabel - ini secara harfiah tentang satu objek menjadi yang lain. Saya tidak mengetahui bahasa lain yang memiliki fitur ini. Ini adalah fitur kekuatan yang sangat besar - dan bahaya.

Pertimbangkan tugas untuk memperluas bahasa Anda untuk mendukung objek yang persisten. Katakanlah Anda ingin memuat objek dari disk, tetapi tidak ingin memuat semua objek yang dirujuk secara transitif (jika tidak, itu hanya deserialisasi objek biasa). Jadi Anda memuat objek itu sendiri, tetapi alih-alih memuat referensi langsungnya, Anda menggantinya dengan objek sekam.

Sekam berdiri untuk data nyata pada penyimpanan sekunder. Data itu dimuat dengan malas. Ketika Anda benar-benar perlu memanggil metode pada sekam, itu doesNotUnderstand: metode memuat objek data yang sesuai dari disk (tapi sekali lagi, tidak secara transitif).

Kemudian, itu menjadi :, mengganti semua referensi ke kulit dengan referensi ke objek yang baru dimuat, dan mencoba lagi panggilan.

Beberapa mesin kegigihan telah melakukan hal semacam ini selama beberapa dekade - tetapi mereka biasanya mengandalkan akses tingkat rendah ke representasi. Menjadi: memungkinkan Anda melakukan ini di tingkat kode sumber.

Sekarang lakukan ini di Jawa. Atau bahkan dalam bahasa dinamis lain. Anda akan menyadari bahwa Anda dapat melakukan bentuk umum berjangka seperti ini, dan karenanya kemalasan. Semua tanpa akses istimewa ke cara pelaksanaan. Ini juga berguna untuk evolusi skema - ketika Anda menambahkan variabel instan ke kelas, misalnya. Anda dapat "membentuk kembali" semua instance sesuai kebutuhan.

Tentu saja, Anda tidak boleh menggunakan menjadi: santai. Itu datang pada biaya, yang mungkin menjadi penghalang dalam banyak implementasi. Pada Smalltalks awal, menjadi: murah, karena semua objek direferensikan secara tidak langsung melalui tabel objek. Dengan tidak adanya tabel objek, menjadi: melintasi tumpukan dengan cara yang mirip dengan pemulung. Semakin banyak memori yang Anda miliki, semakin mahal menjadi: menjadi.

Memiliki tabel objek membutuhkan penyimpanan dan memperlambat akses; tetapi itu memberi Anda banyak fleksibilitas. Dukungan perangkat keras dapat meringankan penalti kinerja. Keuntungannya adalah bahwa banyak masalah sulit menjadi sangat mudah dikerjakan jika Anda bersedia membayar biaya tipuan melalui tabel objek di depan. Ingat: setiap masalah dalam ilmu komputer dapat diselesaikan dengan tingkat tipuan ekstra. Alex Warth memiliki beberapa karya yang sangat menarik yang sesuai dengan kategori ini, misalnya.

Menjadi: memiliki beberapa variasi - satu cara menjadi: mengubah identitas suatu objek A ke yang lain objek B, sehingga referensi ke A sekarang menunjuk ke B; referensi ke B tetap tidak berubah. Hal ini sering berguna untuk menjadi: dalam jumlah besar - mentransmutasikan identitas semua objek dalam sebuah array (baik secara tidak langsung atau dua arah). Grup menjadi: yang melakukan sihir secara atomik sangat bagus untuk menerapkan pembaruan reflektif ke suatu sistem, misalnya. Anda dapat mengubah seluruh rangkaian kelas dan instance mereka dalam sekali jalan.

Anda bahkan dapat membayangkan tipe aman menjadi:. Dua cara menjadi: hanya tipe aman jika tipe A identik dengan B, tetapi satu jalan menjadi: hanya mengharuskan objek baru menjadi subtipe yang lama.

Mungkin sudah waktunya untuk mempertimbangkan kembali apakah memiliki tabel objek sebenarnya adalah hal yang baik.

Apa yang Anda dapatkan secara efektif adalah bentuk pemuatan malas melalui jumlah yang harus diprogramkan. Seperti yang ditunjukkan Bracha, ini bisa sangat berguna tetapi juga berbahaya karena dapat membawa dampak kinerja yang serius.


Saya akan lebih khawatir tentang becomedampak pada kewarasan saya daripada pada kinerja program saya ...
Benjamin Hodgson

Hardware support could ease the performance penalty.Dari semua tempat yang pernah saya dengar ini, komunitas Smalltalk adalah yang paling menonjol. Mengapa kita harus "menghabiskan" perbaikan perangkat keras untuk mengaktifkan paradigma pemrograman yang idealistik ketika itu malah bisa mengarah pada peningkatan kinerja, penurunan penggunaan daya, atau peningkatan kemampuan.
Alexander - Pasang kembali Monica

2

Itu tidak banyak digunakan. Dalam gambar Pharo 5 yang saya buka, ada 9 pengirim #become :, 7 di antaranya dalam unit test. Ini digunakan dalam kompiler dalam pembuatan kode dan di perpustakaan serialisasi Bahan Bakar untuk mengganti proxy dengan konten mereka.


Menarik. Untuk apa unit tes menggunakannya?
DPK

untuk melihat apakah itu berhasil ...
Stephan Eggermont
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.