Sebuah makalah penelitian tahun 1998 yang mengusulkan pola Extensible Visitor untuk menjembatani pemrograman fungsional dan berorientasi objek telah memicu kembali diskusi tentang tantangan fundamental desain bahasa pemrograman. Makalah tersebut membahas apa yang dikenal sebagai expression problem - kesulitan dalam memperluas baik tipe data maupun operasi tanpa memodifikasi kode yang sudah ada.
Konteks Timeline (1998)
- Java sudah ada tetapi belum memiliki generics
- Scala belum diciptakan
- Implementasi Haskell tersedia tetapi dengan keterbatasan performa
- Common Lisp Object System ( CLOS ) sudah ada sejak tahun 1980-an
Tantangan Inti Pemrograman
Penelitian ini menangani masalah yang persisten dalam pengembangan perangkat lunak: bagaimana memperluas program dalam dua dimensi secara bersamaan. Pemrograman fungsional unggul dalam menambahkan operasi baru pada tipe data yang ada, sementara pemrograman berorientasi objek memudahkan penambahan tipe data baru. Namun, kedua pendekatan tersebut tidak menangani kedua ekstensi dengan baik tanpa memerlukan perubahan pada kode yang sudah ada.
Pola Extensible Visitor yang diusulkan mencoba menggabungkan kekuatan dari kedua paradigma. Pola ini mengorganisir alat-alat dengan gaya fungsional sambil menggunakan teknik berorientasi objek untuk mencapai ekstensibilitas data.
Perbandingan Paradigma Pemrograman
Pendekatan | Kelebihan | Keterbatasan |
---|---|---|
Pemrograman Fungsional | Mudah menambahkan operasi baru | Sulit memperluas tipe data |
Pemrograman Berorientasi Objek | Mudah menambahkan tipe data baru | Menantang untuk menambahkan operasi lintas tipe |
Pola Visitor yang Dapat Diperluas | Mencoba kedua ekstensi | Implementasi yang kompleks |
Fungsi Generik CLOS | Multiple dispatch, fungsi eksternal | Memerlukan ekosistem Lisp |
Pertanyaan Komunitas Tentang Karya Sebelumnya
Para pengembang mempertanyakan apakah solusi tahun 1998 tersebut mengabaikan teknologi yang sudah ada. Common Lisp Object System ( CLOS ) dari tahun 1980-an sudah menyediakan fungsi generik dan kemampuan multiple dispatch yang mengatasi tantangan ekstensibilitas serupa. CLOS menempatkan fungsi generik di luar definisi kelas, memungkinkan fungsi baru ditambahkan tanpa memodifikasi kelas yang ada.
Beberapa anggota komunitas mencatat bahwa type classes milik Haskell , yang tersedia sebelum 1998, menawarkan solusi lain untuk asosiasi tipe terbuka. Type classes secara khusus menangani tantangan memperluas set tipe yang dijelaskan dalam makalah tersebut.
Kekhawatiran Praktis Tentang Ekstensi Kode
Tidak semua orang merangkul filosofi tidak pernah memodifikasi kode yang ada. Para kritikus berargumen bahwa terus-menerus menambahkan patch baru tanpa pernah melakukan refactoring menyebabkan basis kode yang semakin kompleks dan sulit dipelihara.
Jika Anda bersikeras melakukan segalanya tanpa memodifikasi kode yang ada, yang Anda lakukan adalah melemparkan patch lumpur baru ke bola lumpur yang terus tumbuh, dan bola lumpur itu tidak ada hubungannya dengan apa yang akan Anda kembangkan jika Anda harus mengimplementasikan semua persyaratan saat ini dalam slate kosong.
Perspektif ini menunjukkan bahwa terkadang memodifikasi dan memperbaiki kode yang ada menghasilkan hasil yang lebih baik daripada mengatasi keterbatasan melalui pola desain yang kompleks.
Evolusi Bahasa Modern
Diskusi ini menyoroti bagaimana bahasa pemrograman telah berevolusi sejak 1998. Java sudah ada tetapi belum memiliki generics, Scala belum diciptakan, dan banyak fitur bahasa modern yang mengatasi ekstensibilitas masih dalam tahap pengembangan. Bahasa-bahasa saat ini menawarkan solusi yang lebih canggih untuk tantangan desain fundamental ini, membuat beberapa pendekatan historis menjadi kurang relevan.
Perdebatan yang berkelanjutan menunjukkan bahwa pertanyaan inti desain bahasa pemrograman tetap menjadi area penelitian dan diskusi yang aktif, bahkan puluhan tahun setelah proposal awal.
Referensi: Synthesizing Object-Oriented and Functional Design to Promote Re-Use