Perché gli operatori Null-Safe (ad esempio "operatore Elvis") sono stati rifiutati come parte del "Progetto Coin" di Java 7?

9

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

One of the "small features" covered in this presentation is the so-called "Elvis operator," a more concise version of the ternary operator. I find myself missing some of the features of Groovy when using traditional Java and this would be one operator that I could use in both languages if it was added. The "Elvis" operator is handy for specifying a default value that can be used when the evaluated expression is null. Like Groovy's safe navigation operator, it is a concise way to specify how to avoid unnecessary nulls. I have blogged previously about how I like to avoid the NullPointerException.

Mentre altri aspetti di Project Coin sono stati alla fine implementati, questo non lo era. Perché l'operatore di Elvis è stato infine respinto, nonostante sia stato presentato a JavaOne come probabile candidato per l'inclusione?

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

    
posta Thunderforge 19.10.2017 - 17:23
fonte

1 risposta

14

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

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

Eric Lippert (ex membro del team C #) dice che, affinché un prodotto abbia una funzionalità , quella funzione deve essere:

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

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

Nel team C #, ogni nuova richiesta di funzionalità inizia con un punteggio inferiore a 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 scartata sommariamente. In altre parole, la nuova funzione deve fornire un vantaggio interessante.

Ma il Elvis Operator è stato trasformato in C #. Quindi, perché non è diventato Java?

Nonostante le apparenti somiglianze, Java e C # hanno filosofie linguistiche significativamente diverse. Ciò è evidenziato dal fatto che i programmi aziendali Java tendono ad essere grandi collezioni strutturali di architettura. La brevità e l'espressività della lingua sono sacrificate sull'altare della cerimonia e sulla facilità di codifica. I ben noti modelli architettonici del software che tutti i membri del team di sviluppo possono riconoscere sono preferiti rispetto alle comodità linguistiche.

Considera questo scambio Reddit :

The Elvis operator has been proposed for every version of Java since 7, and has been rejected every time. Different languages fall on different points along the spectrum from "pure" to "pragmatic", and languages implementing the Elvis operator do tend to be further toward the pragmatic end of the spectrum than Java.

If you have a team of 15+ year Java pros writing a highly-distributed, highly-concurrent backend processing system of some sort, then you probably want a great degree of architectural rigor.

However, if you have a junior to mid-level team, half of whom migrated from Visual Basic, and you have them writing an ASP.NET web app that mostly just does CRUD operations... then it might be overkill to design a bunch of AbstractFactoryFactory classes to abstract away the fact that you have no control over which columns are nullable in the shitty legacy database that you must use.

Queste profonde differenze nella filosofia della lingua si estendono non solo al modo in cui le lingue vengono utilizzate, ma al modo in cui viene intrapreso il processo di progettazione della lingua stessa. C # è un dittatore benevolo lingua. Per ottenere una nuova funzionalità in C #, hai davvero per convincere una persona: Anders Hejlsberg .

Java assume un approccio più conservativo. Per ottenere una nuova funzionalità in Java, è necessario ottenere il consenso da un consorzio di grandi produttori come Oracle, IBM, HP, Fujitsu e amp; Cappello rosso. Ovviamente, quel 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 dimostrato adeguatamente qui, la scelta non è mai così semplice.

    
risposta data 19.10.2017 - 18:17
fonte

Leggi altre domande sui tag