Null-Safe Operatörleri (örn. “Elvis operatörü”) Java 7'nin “Project Coin” inin bir parçası olarak neden reddedildi?


10

Java 7'nin "Project Coin" i için önerilen özelliklerden biri "Elvis operatörü" idi. Bir bir 2009 JavaOne sunum raporu Projesi Coin gibi tanımladı:

Bu sunumda yer alan "küçük özelliklerden" biri üçlü operatörün daha özlü bir versiyonu olan "Elvis operatörü" dür. Kendimi geleneksel Java kullanırken Groovy'nin bazı özelliklerini eksik buluyorum ve bu eklenmişse her iki dilde de kullanabileceğim bir operatör olurdu. "Elvis" işleci, değerlendirilen ifade boş olduğunda kullanılabilecek varsayılan bir değer belirtmek için kullanışlıdır. Groovy'nin güvenli navigasyon operatörü gibi, gereksiz null'lardan nasıl kaçınılacağını belirlemenin kısa bir yoludur. Daha önce NullPointerException önlemek nasıl hakkında bloglama var.

Project Coin'in diğer yönleri nihayetinde uygulanmış olsa da, bu değildi. Elvis Operatörü, JavaOne'da dahil edilme olasılığı olan bir aday olarak sunulmasına rağmen nihayetinde reddedildi?

Açıkça söylemek gerekirse, bu operatörü ve Java 7'nin "Project Coin" inin bir parçası olarak reddedilmesinin nedenini, o zamanlar ciddi olarak değerlendirildiğini soruyorum. Posta listelerinin veya reddedilme nedenlerinin tartışıldığı yerlerde olduğundan şüpheleniyorum, ancak hiçbir şey bulamadım. Java'nın herhangi bir sürümüne neden dahil edilmediğine dair daha genel bilgiler varsa, bu kabul edilebilir, ancak tercih edilmez.


4
şüpheli düşünceler?
Ewan

1
Mot büyük olasılıkla null değerlerin meşru değerler olarak kullanılmasını desteklediği ve teşvik ettiği ve daha temelde OO ilkelerine ters düştüğü için, çünkü bir yöntemi çalıştırmadan önce bir nesnenin türünü kontrol edersiniz.
JacquesB

Birisi karar sürecinin açık belgelerini (e-postalar, notlar, transkriptler) kazmayacaksa veya kararın doğrudan bir katılımcısı olmadıkça, cevabı burada gerçekten bilemeyiz. Örneğin, Robert'in yanıtı sadece spekülasyon ve genel dil tasarımı konularıdır, bu operatörün reddedilmesinin gerçek ve özel bir nedeni değildir. Bu yüzden bu soruyu görüşe dayalı olarak kapatmak için oy kullanıyorum.
öğleden sonra

1
@ amon: Cevabımın yazımın başında spekülasyon olduğunu serbestçe itiraf ettim. Ancak, yine de bir cevap gönderdim çünkü 1. balık vermek yerine balık tutmayı öğretiyorum ve 2. Kartlarımız doğru oynarsak, bu yazı yakın çiftler için hedef olarak kullanılabilir. Genel bir analiz sağlayan bir cevabın arkasındaki fikir, dakika dil kararları hakkındaki sonsuz tartışmaları caydırmak ve diğerlerinin genel konuların daha geniş bir görünümünü görmelerine yardımcı olmaktır.
Robert Harvey

@RobertHarvey A “X dili neden Y özelliğine sahip değil” kanonik dupe hedefi uygun olabilir, ancak mevcut biçimindeki soru bunun için uygun görünmemektedir. Bu genel soruyu sormak için düzenlenecek olsaydı ( örnek?. olarak X = Java / Y = kullanarak ), sıradan bir soru olarak çok geniş olurdu, ancak iyi bir cevabınız olurdu.
öğleden sonra

Yanıtlar:


15

Doğal olarak, bu soruyu soracak en iyi kişi biz değil , JCP Yürütme Komitesi'ndeki birisidir . Ancak bu, bazı boş spekülasyonlara katılmamı engellemez.

Her "neden bu özellik uygulanmadı" sorusunun cevabı her zaman faydaların maliyetleri aşmamasıdır.

Eric Lippert (C # ekibinin eski üyesi), bir ürünün bir özelliğe sahip olması için bu özelliğin olması gerektiğini söylüyor:

  • ilk etapta düşündüm
  • İstenen
  • tasarlanmış
  • belirtildi
  • uygulanan
  • test edilmiş
  • belgeli
  • müşterilere sevk

Başka bir deyişle, herhangi bir yeni programlama dili özelliğinin gerçekleştirilebilmesi için gerçekleşmesi gereken birçok önemli şey olmalıdır. Maliyetler düşündüğünüzden daha büyük.

C # ekibinde, her yeni özellik talebi eksi 100 puanla başlar. Daha sonra ekip faydaları ve maliyetleri değerlendirir, faydalara puan ekler ve maliyetlere puan çıkarır. Skor sıfırın üzerine çıkmazsa, önerilen özellik özetle atılır. Başka bir deyişle, yeni özellik zorlayıcı bir fayda sağlamalıdır.

Ancak Elvis Operatörü C # 'a yaptı. Peki neden Java'ya dönüştürmedi?

Görünen benzerliklerine rağmen, Java ve C # çok farklı dil felsefelerine sahiptir. Bu, Java kurumsal programlarının büyük, yapısal mimari koleksiyonları olma eğilimi ile kanıtlanmıştır. Kısalık ve dil ifadesi tören sunağı ve kodlama kolaylığı üzerinde feda edilir. Geliştirme ekibindeki herkesin tanıyabildiği tanınmış yazılım mimari kalıpları dil kolaylıklarına göre tercih edilir.

Bu Reddit değişimini düşünün :

Elvis operatörü 7'den beri her Java sürümü için önerilmiştir ve her seferinde reddedilmiştir. Farklı diller, "saf" dan "pragmatik" e kadar spektrum boyunca farklı noktalara düşer ve Elvis operatörünü uygulayan diller, spektrumun pragmatik ucuna doğru Java'dan daha fazla olma eğilimindedir.

Bir çeşit yüksek dağıtılmış, yüksek eşzamanlı arka uç işleme sistemi yazan 15+ yıllık Java uzmanlarından oluşan bir ekibiniz varsa, muhtemelen büyük ölçüde mimari titizlik istersiniz.

Ancak, yarısı Visual Basic'ten geçirilmiş bir orta ila orta seviyeli ekibiniz varsa ve çoğunlukla CRUD işlemlerini yapan bir ASP.NET web uygulaması yazıyorsanız ... o zaman bir grup tasarlamak aşırıya kaçabilir arasında AbstractFactoryFactorysoyut away Eğer sütunları kullanması gerektiğini boktan eski veritabanında null olduğu üzerinde hiçbir kontrole sahip olması için sınıflar.

Dil felsefesindeki bu derin farklılıklar sadece dillerin kullanım şekline değil, aynı zamanda dil tasarım sürecinin kendisinin nasıl gerçekleştirildiğine de uzanır. C # hayırsever bir diktatör dilidir. C # 'a yeni bir özellik kazandırmak için sadece bir kişiyi ikna etmeniz yeterlidir : Anders Hejlsberg .

Java daha tutucu bir yaklaşım benimser. Java'ya yeni bir özellik kazandırmak için Oracle, IBM, HP, Fujitsu ve Red Hat gibi büyük satıcılardan oluşan bir konsorsiyumdan fikir birliği alması gerekir. Açıkçası, bu süreç daha yavaş olacak ve yeni dil özellikleri için daha yüksek bir çubuk sunacaktır.

"Neden x özelliği uygulanmadı ..." sorusu her zaman dolaylı olarak "... eğer açıkçası iyi bir fikirse?" Burada yeterince gösterdiğim gibi, seçim asla bu kadar basit değildir.


8
sarcasm: Çünkü AbstractFactoryFactory sınıfları, kod şişkinliğinin değil, mimari titizliğin güzel bir göstergesidir. /iğneleyici söz.
Machado

2
@RobertHarvey Java dilinin tasarımında komitelerin rolü hakkındaki sonuçlarınız çok basittir. Gerçekten topluluk ve endüstri ortakları ile işbirliği olsa da, Java dilinin "komite tarafından tasarım" olduğu ifadesi hemen hemen tamamen yanlıştır ve bu afişin sorusu için korkunç (ne yazık ki yüzeysel olarak inandırıcı) bir açıklamadır.
Brian Goetz

5
Listelediğiniz önceki nedenlerin çoğu - her dil özelliği düşündüğünden daha büyüktür, sınırlı bütçeler (çaba için, değişim için, karmaşıklık için) - doğrudur. Ve şunu ekleyeceğim: X özelliğini yapmıyoruz, çünkü Y ve Z'nin diğer özelliklerinin daha iyi seçenekler olduğunu düşünüyoruz. Ayrıca, diğer dillerden daha muhafazakar bir yaklaşım benimsiyoruz, çünkü her özelliğin gelecekte diğer olası özelliklerle etkileşime girdiğini veya bazı durumlarda öngörüde bulunduğunu biliyoruz. Java'nın 20 yıl içinde canlı ve alakalı kalmasını istiyoruz, bu da şu anda havalı görünebilecek her özellikte tıkanma anlamına gelmiyor.
Brian Goetz

1
@BrianGoetz: Sorun "komite tarafından tasarım" teriminin aşağılayıcı doğası gibi göründüğü için (Java'yı başka bir şekilde küçümsemediğimi fark edeceksiniz), terimi kaldırmak için cevabımı biraz değiştirdim.
Robert Harvey

1
Eskiden C # ve Java tasarımcıları arasında bir rekabet vardı. C #, Java tasarımcıları tarafından bir soygun olarak kabul edildi (ve haklı olarak). C # delegeleri "nesne yönelimli değil" olarak reddedildi, ancak asıl neden önce C # 'da ortaya çıkmalarıydı. Bazı özelliklerin eklenmesi veya dışarıda bırakılmasının sadece rasyonel nedenlerle olduğunu düşünmek güzel ... Bundan şüpheliyim.
Frank Hileman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.