Mengapa Operator Null-Safe (misalnya "operator Elvis") ditolak sebagai bagian dari "Project Coin" Java 7?

10

Salah satu fitur yang diusulkan untuk "Project Coin" Java 7 adalah "operator Elvis". Sebuah laporan dari presentasi 2009 JavaOne di Proyek Coin menggambarkannya seperti:

Salah satu "fitur kecil" yang tercakup dalam presentasi ini adalah apa yang disebut "operator Elvis," versi yang lebih ringkas dari operator ternary. Saya menemukan diri saya kehilangan beberapa fitur Groovy ketika menggunakan Java tradisional dan ini akan menjadi salah satu operator yang dapat saya gunakan dalam kedua bahasa jika ditambahkan. Operator "Elvis" berguna untuk menentukan nilai default yang dapat digunakan ketika ekspresi yang dievaluasi adalah nol. Seperti operator navigasi aman Groovy, ini adalah cara ringkas untuk menentukan cara menghindari null yang tidak perlu. Saya telah membuat blog sebelumnya tentang bagaimana saya ingin menghindari NullPointerException.

Sementara aspek-aspek lain dari Koin Proyek akhirnya dilaksanakan, yang ini tidak. Mengapa Operator Elvis akhirnya ditolak, meskipun telah disajikan di JavaOne sebagai kandidat untuk inklusi?

Untuk lebih jelasnya, saya secara khusus menanyakan tentang operator ini dan alasan penolakannya sebagai bagian dari "Project Coin" Java 7, mengingat bahwa itu dianggap serius saat itu. Saya curiga ada milis atau semacamnya di mana alasan penolakan itu dibahas, tetapi saya tidak dapat menemukan apa pun. Jika ada informasi yang lebih umum tentang mengapa itu tidak termasuk dalam versi Java apa pun, itu dapat diterima tetapi tidak disukai.

Thunderforge
sumber
4
pikiran yang mencurigakan?
Ewan
1
Mot kemungkinan karena mendukung dan mendorong penggunaan nulls sebagai nilai yang sah, dan lebih mendasar bertentangan dengan prinsip OO karena Anda memeriksa jenis objek sebelum mengeksekusi suatu metode.
JacquesB
Kecuali jika seseorang akan menggali dokumen eksplisit (email, memo, transkrip) dari proses pengambilan keputusan atau menjadi peserta langsung dari keputusan tersebut, kita tidak dapat mengetahui jawabannya di sini. Misalnya jawaban Robert hanyalah spekulasi dan pertimbangan desain bahasa umum, bukan alasan faktual dan spesifik untuk penolakan operator ini. Karena itu saya memilih untuk menutup pertanyaan ini sebagai berbasis opini.
amon
1
@amon: Saya dengan bebas mengakui bahwa jawaban saya adalah spekulasi di awal posting saya. Namun, saya tetap mengirim jawaban karena 1. Saya mengajarkan cara memancing daripada memberi ikan, dan 2. Posting ini dapat digunakan sebagai target untuk dupes dekat, jika kami memainkan kartu kami dengan benar. Gagasan di balik jawaban yang memberikan analisis umum adalah untuk mencegah argumen yang tak ada habisnya tentang keputusan bahasa menit dan membantu orang lain melihat pandangan yang lebih luas dari masalah keseluruhan.
Robert Harvey
@RobertHarvey A "Mengapa bahasa X tidak memiliki fitur Y" target kanonik dupe akan nyaman, tetapi pertanyaan dalam bentuk saat ini sepertinya tidak cocok untuk itu. Jika itu akan diedit untuk mengajukan pertanyaan umum ini (menggunakan X = Java / Y = ?.sebagai contoh ) itu pasti akan terlalu luas sebagai pertanyaan biasa, tetapi Anda akan memiliki jawaban yang bagus.
amon

Jawaban:

15

Secara alami, orang terbaik untuk mengajukan pertanyaan ini adalah seseorang di Komite Eksekutif JCP, bukan kita. Namun, itu tidak akan mencegah saya terlibat dalam spekulasi kosong.

Jawaban untuk setiap pertanyaan "mengapa fitur ini tidak diterapkan" selalu karena manfaatnya tidak melebihi biaya.

Eric Lippert (mantan anggota tim C #) mengatakan bahwa, agar suatu produk memiliki fitur, fitur itu harus:

  • memikirkan di tempat pertama
  • diinginkan
  • dirancang
  • ditentukan
  • diimplementasikan
  • diuji
  • didokumentasikan
  • dikirim ke pelanggan

Dengan kata lain, harus ada banyak hal penting yang harus terjadi sebelum fitur bahasa pemrograman baru dapat direalisasikan. Biayanya lebih besar dari yang Anda kira.

Pada tim C #, setiap permintaan fitur baru dimulai dengan skor minus 100. Kemudian tim mengevaluasi manfaat dan biaya, menambahkan poin untuk manfaat, dan mengurangi poin untuk biaya. Jika skor tidak melampaui nol, fitur yang diusulkan akan dibuang. Dengan kata lain, fitur baru harus memberikan manfaat yang menarik.

Tapi Operator Elvis berhasil masuk ke C #. Jadi mengapa tidak membuatnya menjadi Java?

Terlepas dari kesamaan mereka, Java dan C # memiliki filosofi bahasa yang sangat berbeda. Ini dibuktikan oleh fakta bahwa program-program perusahaan Java cenderung besar, koleksi struktural arsitektur. Keringkasan dan ekspresi bahasa dikorbankan di atas altar upacara dan kemudahan pengkodean. Pola arsitektur perangkat lunak yang terkenal yang dapat dikenali oleh semua orang di tim pengembangan lebih disukai daripada kenyamanan bahasa.

Pertimbangkan pertukaran Reddit ini :

Operator Elvis telah diusulkan untuk setiap versi Java sejak 7, dan telah ditolak setiap saat. Bahasa yang berbeda jatuh pada titik yang berbeda di sepanjang spektrum dari "murni" ke "pragmatis", dan bahasa yang mengimplementasikan operator Elvis cenderung lebih jauh ke arah ujung pragmatis spektrum daripada Jawa.

Jika Anda memiliki tim pro Jawa 15+ tahun yang menulis semacam sistem pemrosesan backend yang sangat terdistribusi, sangat konkuren, maka Anda mungkin menginginkan tingkat ketelitian arsitektur yang tinggi.

Namun, jika Anda memiliki tim tingkat menengah ke bawah, setengahnya bermigrasi dari Visual Basic, dan Anda meminta mereka menulis aplikasi web ASP.NET yang sebagian besar hanya melakukan operasi CRUD ... maka mungkin akan sulit untuk merancang banyak dari AbstractFactoryFactorykelas untuk pergi abstrak kenyataan bahwa Anda tidak memiliki kontrol atas kolom mana yang nullable dalam database menyebalkan warisan yang Anda harus menggunakan.

Perbedaan mendasar dalam filsafat bahasa ini meluas tidak hanya pada cara bahasa digunakan, tetapi juga pada cara proses desain bahasa itu sendiri dilakukan. C # adalah bahasa diktator yang murah hati . Untuk mendapatkan fitur baru ke C #, Anda hanya perlu meyakinkan satu orang: Anders Hejlsberg .

Java mengambil pendekatan yang lebih konservatif. Untuk mendapatkan fitur baru ke Java, itu harus mendapatkan konsensus dari konsorsium vendor besar seperti Oracle, IBM, HP, Fujitsu & Red Hat. Jelas, proses itu akan lebih lambat dan menghadirkan bilah yang lebih tinggi untuk fitur bahasa baru.

Pertanyaan "mengapa fitur x tidak diterapkan ..." selalu secara implisit menyertakan kata-kata, "... jika itu jelas merupakan ide yang bagus?" Seperti yang telah saya tunjukkan secara memadai di sini, pilihannya tidak pernah sesederhana itu.

Robert Harvey
sumber
8
sarkasme: Karena kelas AbstractFactoryFactory adalah indikator bagus dari kekakuan arsitektur, dan bukan kode kembung. /sarkasme.
Machado
2
@RobertHarvey Kesimpulan Anda tentang peran komite dalam desain bahasa Jawa terlalu sederhana. Meskipun memang ada kolaborasi dengan komunitas dan dengan mitra industri, pernyataan bahwa bahasa Jawa adalah "desain oleh komite" cukup banyak yang benar-benar salah, dan penjelasan yang mengerikan (meskipun sayangnya, dapat dipercaya secara dangkal) untuk pertanyaan poster ini.
Brian Goetz
5
Sebagian besar alasan sebelumnya yang Anda daftarkan - setiap fitur bahasa lebih besar daripada yang dipikirkan siapa pun, anggaran terbatas (untuk upaya, untuk perubahan, untuk kompleksitas) - akurat. Dan saya menambahkan: kita tidak melakukan fitur X karena kami berpikir bahwa fitur lain Y dan Z adalah pilihan yang lebih baik. Lebih jauh, kami juga mengambil pendekatan yang lebih konservatif daripada bahasa lain, karena kami tahu setiap fitur berinteraksi dengan, atau dalam beberapa kasus menutup, fitur lain yang mungkin ada di masa depan. Kami ingin Java tetap hidup dan relevan dalam 20 tahun, yang berarti tidak menjejalkan di setiap fitur yang mungkin tampak keren sekarang.
Brian Goetz
1
@BrianGoetz: Karena masalahnya tampaknya sifat merendahkan dari istilah "desain oleh komite" (Anda akan mencatat bahwa saya tidak meremehkan Jawa dengan cara lain), saya telah sedikit mengubah jawaban saya untuk menghapus istilah tersebut.
Robert Harvey
1
Dulu ada beberapa persaingan antara C # dan desainer Java. C # dianggap rip-off oleh desainer Java (dan memang demikian). Delegasi C # ditolak karena "tidak berorientasi objek," tetapi alasan sebenarnya adalah karena mereka muncul di C # pertama. Sangat menyenangkan untuk berpikir bahwa itu hanya karena alasan rasional bahwa beberapa fitur ditambahkan atau ditinggalkan ... Saya ragu.
Frank Hileman