Apa yang dimaksud Alan Kay dengan “penugasan” di The Early History of Smalltalk?

47

Saya telah membaca The Early History of Smalltalk dan ada beberapa yang menyebutkan "penugasan" yang membuat saya mempertanyakan pemahaman saya tentang maknanya:

Meskipun OOP berasal dari banyak motivasi, dua adalah pusat. Yang berskala besar adalah menemukan skema modul yang lebih baik untuk sistem kompleks yang melibatkan penyembunyian detail, dan yang berskala kecil adalah menemukan versi tugas yang lebih fleksibel, dan kemudian mencoba menghilangkannya sama sekali.

(dari 1960-66 - OOP Awal dan gagasan formatif lainnya dari tahun enam puluhan , Bagian I)

Apa yang saya dapatkan dari Simula adalah bahwa Anda sekarang dapat mengganti binding dan tugas dengan gol . Hal terakhir yang Anda inginkan dari setiap programmer adalah mengacaukan keadaan internal meskipun disajikan secara kiasan. Sebaliknya, objek harus disajikan sebagai situs perilaku tingkat tinggi yang lebih tepat untuk digunakan sebagai komponen dinamis . (...) Sangat disayangkan bahwa banyak dari apa yang disebut "pemrograman berorientasi objek" saat ini hanyalah pemrograman gaya lama dengan konstruksi yang lebih menarik. Banyak program dimuat dengan operasi "penugasan-gaya" sekarang dilakukan oleh prosedur terlampir lebih mahal.

(dari Gaya "Berorientasi Objek" , Bagian IV)

Apakah saya benar dalam mengartikan maksud sebagai objek yang dimaksudkan sebagai fasad dan metode apa pun (atau "pesan") yang tujuannya adalah untuk menetapkan variabel instan pada objek (yaitu "penugasan") mengalahkan tujuannya? Penafsiran ini tampaknya didukung oleh dua pernyataan kemudian di Bagian IV:

Empat teknik yang digunakan bersama - keadaan persisten, polimorfisme, instantiasi, dan metode-sebagai-tujuan untuk objek - menjelaskan sebagian besar kekuatan. Tidak satu pun dari ini memerlukan "bahasa berorientasi objek" untuk dipekerjakan - ALGOL 68 hampir dapat beralih ke gaya ini - dan OOPL hanya memfokuskan pikiran desainer dalam arah yang bermanfaat. Namun, melakukan enkapsulasi benar adalah komitmen tidak hanya untuk abstraksi negara, tetapi untuk menghilangkan metafora berorientasi negara dari pemrograman.

...dan:

Pernyataan penugasan - bahkan yang abstrak - mengekspresikan tujuan tingkat sangat rendah, dan lebih dari itu akan diperlukan untuk menyelesaikan apa pun. Secara umum, kami tidak ingin programmer untuk bermain-main dengan keadaan, apakah disimulasikan atau tidak.

Apakah adil untuk mengatakan bahwa kejadian-kejadian yang tidak jelas dan tidak dapat diubah sedang didorong di sini? Atau itu hanya perubahan status langsung yang tidak disarankan? Sebagai contoh, jika saya memiliki BankAccountkelas, tidak masalah untuk memiliki GetBalance, Depositdan Withdrawcontoh metode / pesan; pastikan saja tidak ada SetBalancemetode / pesan instan?

Olivier Dagenais
sumber

Jawaban:

86

Gagasan dasarnya (dipengaruhi oleh Sketchpad) adalah bahwa sebagian besar variabel / nilai berada dalam hubungan dinamis - satu sama lain (dikelola oleh interior objek), sehingga dapat langsung mereset nilai dari luar berbahaya. Karena (dalam Smalltalk tetap) setidaknya ada metode setter diperlukan, ini memungkinkan kemungkinan tindakan pengaturan luar dimediasi oleh metode internal untuk mempertahankan hubungan timbal balik yang diinginkan. Tetapi kebanyakan orang yang menggunakan setter hanya menggunakannya untuk mensimulasikan penugasan langsung ke variabel interior, dan ini melanggar semangat dan niat OOP nyata.

Tetapi objek memiliki "garis dunia" perubahan waktu. Ini dapat dianggap sebagai versi-sejarah- dari objek di mana-hubungan-yang sesuai. Tidak ada kondisi balapan dalam skema ini ... objek hanya dapat terlihat saat stabil dan tidak lagi komputasi. Ini seperti jam dua fase di HW. (Ide dari Strachey, dan berbeda dari McCarthy, dan dipengaruhi oleh Lucid.)

Semoga sukses,

Alan Kay

Alan Kay
sumber
2
@ alan-kay: Terima kasih! Bolehkah saya meminta izin Anda untuk mengutip ini dalam tesis saya?
Olivier Dagenais
2
Mengontrol efek samping, atau mengetahui cara mengontrol efek samping sebagai holly grail untuk banyak bahasa. Tapi sepertinya belum ada yang menemukannya. :)
mathk
@OlivierDagenais meskipun saya yakin Alan akan lebih dari senang (dia sepertinya pria yang sangat luar biasa), jawaban SE berlisensi CC, jadi mencari pertanyaan dan jawaban SE sangat sah.
Wayne Werner
Jam dua fase? Apakah ini semacam "pengamat" pola dan pola aliran data seperti di Excel atau di React.JS di mana objek menyebarkan perubahan bersama untuk menjaga kendala.
aoeu256
21

Saya menyadari bahwa Alan sudah menjawab pertanyaan ini, dan sepertinya tidak ada gunanya untuk menjawab lebih lanjut. Namun, Alan tidak menjawab setiap pertanyaan yang Anda miliki.

Khususnya:

Apakah adil untuk mengatakan bahwa kejadian-kejadian tidak jelas dan tidak dapat diubah sedang didorong di sini? Atau itu hanya perubahan status langsung yang tidak disarankan? Misalnya, jika saya memiliki kelas BankAccount, tidak masalah untuk mendapatkan metode / pesan GetBalance, Deposit, dan Withdraw; pastikan saja tidak ada metode / pesan instance SetBalance?

Jawabannya di sini adalah Anda tidak menggunakan perilaku tingkat tinggi untuk menyusun program Anda. Sistem layanan keuangan dunia nyata seharusnya tidak memiliki metode Setoran pada kelas BankAccount, karena itu sama sekali bukan cara bank bekerja sebelum penemuan komputer! Ketika ATM ditemukan, mereka harus benar-benar mengotomatiskan apa yang dilakukan Teller di bank. Peran Teller adalah untuk memberi tahu pelanggan tentang status akun mereka. Untuk melakukan ini, pelanggan diizinkan untuk berinteraksi dengan Teller hanya dalam beberapa cara, seperti meneruskan Slip Setoran ke Teller.

Dengan langsung memverifikasi objek-objek ini - Teller, Slip Setoran, dll. - domain masalah disusun berdasarkan pesan yang dilewati oleh entitas dalam sistem.

Akun itu sendiri memainkan peran - ide Akun secara harfiah berarti akun arus masuk dan keluar keuangan dalam kaitannya dengan Aset, Kewajiban, Pendapatan, atau Biaya. Sistem Akuntansi, atau Akuntan, mencatat, mempertahankan dan mereproduksi arus ini dan memberi tahu Anda posisi keuangan akun pada suatu titik waktu. Laporan terbaru oleh Teller dapat dianggap sebagai "sekarang", tetapi tidak benar-benar: Ini benar-benar posisi keuangan seperti yang dijelaskan oleh Akuntan pada suatu titik waktu. Itu hanya memiliki ilusi menjadi "sekarang" ketika Anda pergi ke bank, karena umumnya Anda adalah satu-satunya yang berwenang untuk melakukan pembayaran. Ini benar terutama 100 tahun yang lalu, tetapi hari ini banyak orang memiliki pembayaran otomatis,

Mengapa ini penting? Nah, tanyakan pada diri sendiri apa yang perlu dilakukan untuk mencatat transaksi:

Nasabah memiliki log audit internal sendiri atas semua yang telah mereka lakukan, termasuk penerimaan dari Bank. Demikian juga, Bank menyimpan log audit internal mereka sendiri atas semua yang telah mereka lakukan. Bank selalu melakukan akuntansi entri ganda , artinya mereka mencatat transaksi dalam Buku Besar dan Neraca. Ini memungkinkan Bank untuk melakukan rekonsiliasidan pastikan tidak ada entri palsu ketika mereka menutup buku mereka untuk periode keuangan tertentu (harian, mingguan, bulanan, triwulanan, tahunan, dua tahunan, apa pun). Ini juga menunjukkan bahwa catatan untuk apa yang direkam harus idempoten. Berarti, jika kami menulis sebuah program untuk mendaftar semua transaksi unik, kami dapat melakukannya meskipun duplikat palsu ada di log audit internal kami, karena kami memasukkan pengidentifikasi transaksi idempoten ke dalam pesan logging.

Mengingat kemampuan pembayaran otomatis untuk mendebit dan mengkredit akun Anda, tampaknya masuk akal bahwa Akuntan juga dapat melakukan perkiraan untuk Anda. Ini adalah realisasi dampak yang bisa dimiliki komputer pada sistem akuntansi. Oleh karena itu, seseorang menemukan skema sistem akuntansi yang disebut Resources-Events-Agents yang lebih sejalan dengan tidak hanya melihat masa lalu, tetapi juga melihat masa depan dan memperkirakan arus kas pada granularity yang lebih halus daripada sebelumnya. Pada dasarnya, REA hanya lebih banyak metadata daripada sistem akuntansi klasik, memungkinkan pelaporan dan analisis bisnis yang lebih baik. Misalnya, analisis "rantai nilai" dan analisis "rantai pasokan" bukanlah hal yang mudah dilakukan dengan akuntansi klasik.

Demikian juga, Agoric Computing atau Smart Contracts membawa ide dari mekanisme pasar ke komputasi. Penting bahwa ketika Anda memberikan Slip Setoran, Anda juga memberikan Cek atau Dompet untuk disimpan. Karena ada waktu antara menerima cek dan itu benar-benar masuk ke Akun Anda, Anda memerlukan cara aman untuk mengelola mata uang. Ternyata, kemampuan objek adalah cara alami untuk mencapai mata uang aman yang didistribusikan. Mereka dapat digunakan untuk memastikan bahwa Alice tidak menipu Bob dengan menarik semua dana setelah dia menulis Bob cek itu.

John Zabroski
sumber
Terima kasih telah menghilangkan BankAccountcontoh mainan OOP yang terlalu umum .
akuhn
Walaupun secara keseluruhan jawaban Anda bagus (terlalu sedikit orang yang mengerti bahwa akun bukan saldo tetapi daftar transaksi, jadi terima kasih untuk itu), Anda tidak mendapatkan hak akuntansi entri ganda. Maksud dari entri ganda adalah bahwa setiap debit atau kredit ke akun (yaitu, daftar transaksi) memiliki kredit atau debit yang sesuai ke akun lain untuk mencocokkan semuanya. Misalnya, jika Anda mendebit pelanggan sebesar ¥ 108 (yaitu, pelanggan memberi Anda banyak uang), Anda mengkredit akun pendapatan sebesar ¥ 100 dan akun "pajak terhutang" Anda dengan ¥ 8 untuk mencocokkan dengan debit itu dan menunjukkan ke mana uang mengalir (atau harus pergi).
Curt J. Sampson