Почему нуль-безопасные операторы (например, «оператор Элвиса») были отклонены как часть «Project Coin» Java 7?

10

Одной из предлагаемых функций Java 7 Project Project Coin была «Оператор Элвиса». Отчет о 2009 JavaOne презентации по проекту Coin описал его как таковой:

Одной из «мелких особенностей», рассматриваемых в этой презентации, является так называемый «оператор Элвиса», более краткая версия троичного оператора. Я обнаружил, что мне не хватает некоторых функций Groovy при использовании традиционной Java, и это был бы один оператор, который я мог бы использовать на обоих языках, если бы он был добавлен. Оператор "Elvis" удобен для указания значения по умолчанию, которое можно использовать, когда вычисляемое выражение равно нулю. Как и оператор безопасной навигации Groovy, это краткий способ указать, как избежать ненужных нулей. Ранее я писал в блоге о том, как мне нравится избегать исключения NullPointerException.

В то время как другие аспекты Project Coin были в конечном итоге реализованы, этого не было. Почему оператор Элвиса в конечном итоге был отклонен, несмотря на то, что на JavaOne был представлен как вероятный кандидат на включение?

Чтобы было ясно, я специально спрашиваю об этом операторе и причине, по которой он был отклонен как часть "Project Coin" Java 7, учитывая, что он был серьезно рассмотрен тогда. Я подозреваю, что есть списки рассылки или подобные, где обсуждались причины отклонения, но я ничего не смог найти. Если есть более общая информация о том, почему она не включена ни в одну версию Java, это приемлемо, но не предпочтительно.

Thunderforge
источник
4
подозрительные мысли?
Ewan
1
Скорее всего, потому что он поддерживает и поощряет использование пустых значений в качестве допустимых значений, а более фундаментально противоречит принципам ОО, поскольку вы проверяете тип объекта перед выполнением метода.
JacquesB
Если кто-то не собирается выкапывать явные документы (электронные письма, записки, стенограммы) процесса принятия решения или не является непосредственным участником решения, мы не можем действительно знать ответ здесь. Например, ответ Роберта - это просто предположение и общие соображения по проектированию языка, а не фактическая и конкретная причина отказа от этого оператора. Поэтому я голосую, чтобы закрыть этот вопрос как основанный на мнении.
Амон
1
@amon: я свободно признал, что мой ответ был спекуляцией в начале моего поста. Тем не менее, я в любом случае опубликовал ответ, потому что: 1. Я учу ловить рыбу вместо того, чтобы давать рыбу, и 2. Этот пост можно использовать как цель для близких обманщиков, если мы правильно разыграем наши карты. Идея, лежащая в основе ответа, обеспечивающего общий анализ, состоит в том, чтобы препятствовать бесконечным спорам о мельчайших языковых решениях и помогать другим увидеть более широкий взгляд на общие проблемы.
Роберт Харви,
@RobertHarvey A «Почему у языка X нет функции Y» было бы удобно использовать двойную мишень, но вопрос в его нынешнем виде не подходит для этого. Если бы его нужно было отредактировать, чтобы задать этот общий вопрос (используя ?.в качестве примера X = Java / Y = ), он, безусловно, был бы слишком широким, как обычный вопрос, но у вас был бы хороший ответ.
Амон

Ответы:

15

Естественно, лучше всего задавать этот вопрос кому-то из Исполнительного комитета JCP, а не нам. Однако это не помешает мне заняться пустыми спекуляциями.

Ответ на каждый вопрос «почему не была реализована эта функция» всегда заключается в том, что выгоды не превышают затрат.

Эрик Липперт (бывший член команды C #) говорит, что для того, чтобы продукт имел функцию, эта функция должна быть:

  • мысль в первую очередь
  • желательно
  • предназначенный
  • указанный
  • реализованы
  • проверенный
  • документированный
  • отправлено клиентам

Другими словами, должно быть много важных вещей, которые должны произойти, прежде чем любая новая функция языка программирования может быть реализована. Затраты больше, чем вы думаете.

В команде C # каждый новый запрос функции начинается с оценки минус 100. Затем команда оценивает выгоды и затраты, прибавляя баллы за выгоды и вычитая баллы за затраты. Если оценка не становится выше нуля, предложенная функция суммируется. Другими словами, новая функция должна обеспечивать убедительные преимущества.

Но Оператор Элвиса сделал это в C #. Так почему же он не превратился в Java?

Несмотря на их очевидное сходство, Java и C # имеют существенно различную философию языка. Об этом свидетельствует тот факт, что корпоративные программы на Java, как правило, представляют собой большие структурные коллекции архитектуры. Краткость и выразительность языка приносятся в жертву на алтаре церемонии и простоте кодирования. Хорошо известные шаблоны архитектуры программного обеспечения, которые могут распознавать все члены группы разработчиков, предпочтительнее языковых удобств.

Рассмотрим этот обмен Reddit :

Оператор Элвиса был предложен для каждой версии Java начиная с 7 и каждый раз отклонялся. Разные языки попадают в разные точки по всему спектру от «чистого» до «прагматического», и языки, реализующие оператор Элвиса, имеют тенденцию быть ближе к прагматическому концу спектра, чем Java.

Если у вас есть команда из более чем 15-летних Java-профессионалов, которые пишут высокораспределенную, высококонкурентную систему обработки бэкэнда какого-то рода, то вам, вероятно, нужна большая степень архитектурной строгости.

Однако, если у вас есть команда младшего или среднего звена, половина из которой мигрировала из Visual Basic, и у вас есть они, пишущие веб-приложение ASP.NET, которое в основном просто выполняет операции CRUD ... тогда, возможно, было бы излишним проектировать группу из AbstractFactoryFactoryклассов абстрагироваться от того факта , что вы не имеете никакого контроля над которой столбцы обнуляемые в дерьмовом унаследованных базах данных, которую необходимо использовать.

Эти глубокие различия в философии языка распространяются не только на то, как используются языки, но и на сам процесс разработки языка. C # - доброжелательный диктаторский язык. Чтобы получить новую функцию в C #, вам действительно нужно убедить только одного человека: Андерса Хейлсберга .

Java использует более консервативный подход. Чтобы получить новую функцию в Java, она должна получить консенсус от консорциума крупных поставщиков, таких как Oracle, IBM, HP, Fujitsu & Red Hat. Очевидно, что этот процесс будет медленнее и станет более высокой планкой для новых языковых функций.

Вопрос «почему не реализована функция x ...» всегда неявно включает слова «... если это, очевидно, такая хорошая идея?» Как я уже продемонстрировал здесь, выбор никогда не бывает таким простым.

Роберт Харви
источник
8
sarcasm: Потому что классы AbstractFactoryFactory являются хорошим индикатором архитектурной строгости, а не раздувания кода. /сарказм.
Мачадо
2
@RobertHarvey Ваши выводы о роли комитетов в разработке языка Java слишком упрощены. Несмотря на то, что действительно существует сотрудничество с сообществом и отраслевыми партнерами, утверждение о том, что язык Java «проектируется комитетом», в значительной степени совершенно неверно и является ужасным (хотя, к сожалению, внешне правдоподобным) объяснением вопроса этого автора.
Брайан Гетц
5
Большинство приведенных выше причин - каждая языковая функция больше, чем кто-либо думает, ограниченные бюджеты (для усилий, для изменений, для сложности) - точны. И я бы добавил: у нас нет функции X, потому что мы думаем, что другие функции Y и Z - лучший выбор. Кроме того, мы также придерживаемся более консервативного подхода, чем другие языки, поскольку мы знаем, что каждая функция взаимодействует с другими возможными функциями в будущем или в некоторых случаях исключает их. Мы хотим, чтобы Java оставалась активной и актуальной в течение 20 лет, что обязательно означает, что не нужно втискивать все функции, которые сейчас могут показаться крутыми.
Брайан Гетц
1
@BrianGoetz: Поскольку проблема заключается в уничижительном характере термина «проектирование комитетом» (вы заметите, что я не унижал Java каким-либо другим способом), я немного изменил свой ответ, чтобы удалить этот термин.
Роберт Харви
1
Раньше между дизайнерами C # и Java было некоторое соперничество. C # считался плагиатом дизайнеров Java (и это правильно). Делегаты C # были отклонены за то, что они «не объектно-ориентированы», но настоящая причина была в том, что они впервые появились в C #. Приятно думать, что только по рациональным причинам некоторые функции добавляются или опускаются ... Я сомневаюсь в этом.
Фрэнк Хайлеман