Perché gli operatori Null-Safe (ad es. "Elvis operator") sono stati respinti come parte del "Project Coin" di Java 7?


10

Una delle funzionalità proposte per "Project Coin" di Java 7 era l '"operatore Elvis". Un rapporto di una presentazione JavaOne del 2009 su Project Coin l'ha descritta come tale:

Una delle "piccole funzionalità" trattate in questa presentazione è il cosiddetto "operatore Elvis", una versione più concisa dell'operatore ternario. Mi ritrovo a mancare alcune delle funzionalità di Groovy quando utilizzo Java tradizionale e questo sarebbe un operatore che potrei usare in entrambe le lingue se fosse aggiunto. L'operatore "Elvis" è utile per specificare un valore predefinito che può essere utilizzato quando l'espressione valutata è nulla. Come l'operatore di navigazione sicura di Groovy, è un modo conciso per specificare come evitare inutili null. Ho già scritto un blog su come mi piace evitare NullPointerException.

Mentre alla fine sono stati implementati altri aspetti del Project Coin, questo no. Perché alla fine l'operatore Elvis è stato respinto, nonostante sia stato presentato a JavaOne come probabile candidato all'inclusione?

Per essere chiari, sto specificatamente chiedendo di questo operatore e il motivo per cui è stato respinto come parte del "Project Coin" di Java 7, dato che è stato preso in seria considerazione allora. Sospetto che ci siano mailing list o simili in cui sono state discusse le ragioni del rifiuto, ma non sono riuscito a trovare nulla. Se ci sono informazioni più generali sul perché non è incluso in nessuna versione di Java, questo è accettabile ma non preferito.


4
menti sospette?
Ewan,

1
Probabilmente perché supporta e incoraggia l'uso di valori null come valori legittimi, e fondamentalmente è contrario ai principi OO perché si controlla il tipo di un oggetto prima di eseguire un metodo.
Jacques B

A meno che qualcuno non stia per scavare documenti espliciti (e-mail, memo, trascrizioni) del processo decisionale o non sia stato un partecipante diretto della decisione, non possiamo davvero conoscere la risposta qui. Ad esempio, la risposta di Robert è solo una speculazione e considerazioni generali sulla progettazione del linguaggio, non una ragione fattuale e specifica per il rifiuto di questo operatore. Pertanto voto a chiudere questa domanda come opinione.
amon

1
@amon: ho ammesso liberamente che la mia risposta era la speculazione all'inizio del mio post. Comunque, ho pubblicato una risposta comunque perché 1. Sto insegnando a pescare invece di dare un pesce, e 2. Questo post può essere usato come bersaglio per i duplicati vicini, se giochiamo bene le nostre carte. L'idea alla base di una risposta che fornisce un'analisi generale è quella di scoraggiare infinite discussioni sulle decisioni linguistiche minime e aiutare gli altri a vedere una visione più ampia delle questioni generali.
Robert Harvey,

@RobertHarvey Un obiettivo duplice canonico “Perché la lingua X non ha la caratteristica Y” sarebbe conveniente, ma la domanda nella sua forma attuale non sembra adatta a questo. Se dovesse essere modificato per porre questa domanda generale (usando X = Java / Y = ?.come esempio ) sarebbe certamente troppo ampia come una normale domanda, ma avresti una buona risposta.
amon

Risposte:


15

Naturalmente, la persona migliore a porre questa domanda è qualcuno nel comitato esecutivo del JCP, non noi. Tuttavia, ciò non mi impedirà di impegnarmi in alcune speculazioni oziose.

La risposta a ogni domanda "perché questa funzionalità non è stata implementata" è sempre perché i vantaggi non hanno superato i costi.

Eric Lippert (ex membro del team C #) afferma che, affinché un prodotto abbia una funzione, tale funzione deve essere:

  • pensato in primo luogo
  • desiderato
  • progettato
  • specificato
  • implementato
  • testato
  • documentata
  • spedito ai clienti

In altre parole, ci devono essere molte cose importanti che devono accadere prima che qualsiasi nuova funzione del linguaggio di programmazione possa essere realizzata. I costi sono maggiori di quanto pensi.

Nel team C #, ogni nuova richiesta di funzionalità inizia con un punteggio di meno 100. Quindi il team valuta i vantaggi e i costi, aggiungendo punti per i vantaggi e sottraendo punti per i costi. Se il punteggio non supera lo zero, la funzione proposta viene eliminata in modo sommario. In altre parole, la nuova funzionalità deve fornire un vantaggio convincente.

Ma l' operatore Elvis è diventato C #. Quindi perché non è arrivato a Java?

Nonostante le loro apparenti somiglianze, Java e C # hanno filosofie linguistiche significativamente diverse. Ciò è dimostrato dal fatto che i programmi enterprise Java tendono ad essere grandi raccolte strutturali di architettura. La brevità e l'espressività del linguaggio sono sacrificate sull'altare della cerimonia e sulla facilità di programmazione. I modelli architetturali software ben noti che tutti nel team di sviluppo possono riconoscere sono preferiti rispetto alle comodità linguistiche.

Considera questo scambio Reddit :

L'operatore Elvis è stato proposto per ogni versione di Java dal 7 ed è stato rifiutato ogni volta. Lingue diverse ricadono in punti diversi lungo lo spettro da "puro" a "pragmatico", e le lingue che implementano l'operatore Elvis tendono ad essere più verso la fine pragmatica dello spettro rispetto a Java.

Se hai un team di oltre 15 anni di professionisti Java che scrivono un sistema di elaborazione backend altamente distribuito e concomitante di qualche tipo, probabilmente vorrai un grande rigore architettonico.

Tuttavia, se hai un team di livello medio-giovane, metà dei quali è migrato da Visual Basic e hai scritto una app Web ASP.NET che esegue principalmente operazioni CRUD ... potrebbe essere eccessivo progettare un gruppo di AbstractFactoryFactoryclassi per sottrarre il fatto che non hai alcun controllo su quali colonne sono nullable nel database legacy di merda che devi usare.

Queste profonde differenze nella filosofia linguistica si estendono non solo al modo in cui le lingue vengono utilizzate, ma anche al modo in cui viene intrapreso il processo di progettazione linguistica. C # è un linguaggio dittatore benevolo . Per inserire una nuova funzionalità in C #, devi davvero convincere una sola persona: Anders Hejlsberg .

Java adotta un approccio più conservativo. Per ottenere una nuova funzionalità in Java, deve ottenere il consenso di un consorzio di grandi fornitori come Oracle, IBM, HP, Fujitsu e Red Hat. Ovviamente, questo processo sarà più lento e presenterà una barra più alta per le nuove funzionalità linguistiche.

La domanda "perché non è stata implementata la funzione x ..." include sempre implicitamente le parole "... se è ovviamente una buona idea?" Come ho adeguatamente dimostrato qui, la scelta non è mai così semplice.


8
sarcasmo: poiché le classi AbstractFactoryFactory sono un buon indicatore del rigore architettonico e non del gonfiore del codice. /sarcasmo.
Machado,

2
@RobertHarvey Le tue conclusioni sul ruolo dei comitati nella progettazione del linguaggio Java sono troppo semplicistiche. Sebbene vi sia effettivamente una collaborazione con la comunità e con i partner del settore, l'affermazione secondo cui il linguaggio Java è "design by Committee" è praticamente completamente errata e una terribile (sebbene tristemente, superficialmente credibile) spiegazione per la domanda di questo poster.
Brian Goetz,

5
La maggior parte delle ragioni precedenti che hai elencato - ogni funzionalità linguistica è più grande di quanto si pensi, i budget limitati (per sforzo, per cambiamento, per complessità) - sono accurati. E aggiungerei: non facciamo la funzione X perché pensiamo che le altre funzioni Y e Z siano scelte migliori. Inoltre, adottiamo un approccio più conservativo rispetto ad altre lingue, perché sappiamo che ogni caratteristica interagisce con, o in alcuni casi preclude, altre possibili caratteristiche in futuro. Vogliamo che Java rimanga vibrante e pertinente tra 20 anni, il che significa necessariamente non stipare tutte le funzionalità che potrebbero sembrare interessanti ora.
Brian Goetz,

1
@BrianGoetz: Poiché il problema sembra essere la natura peggiorativa del termine "design by Committee" (noterai che non ho denigrato Java in nessun altro modo), ho leggermente modificato la mia risposta per rimuovere il termine.
Robert Harvey,

1
C'era una certa rivalità tra i designer C # e Java. C # è stato considerato un furto dai designer Java (e giustamente). I delegati di C # sono stati rifiutati per essere "non orientati agli oggetti", ma il vero motivo era perché apparivano prima in C #. È bello pensare che è solo per ragioni razionali che alcune funzionalità vengono aggiunte o escluse ... Ne dubito.
Frank Hileman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.